Форум: "Базы";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
ВнизВыборка из большой базы Найти похожие ветки
← →
Иванов Сергей (2004-07-21 15:11) [0]Есть табличка Фокспро7 почти 2 гига нужно выбрать из неё немного данных.
BDE работает, но выборка занимает на бешеной машине 15 минут.
ADO попробовал таже фигня.
это были query
попробовал adotable - оно потащило всю базу в память и у меня все попадало...
Как выбрать? там индексы есть, но как пользоваться не понимаю.
С уважением Иванов Сергей.
← →
Соловьев © (2004-07-21 15:12) [1]
> неё немного данных.
> там индексы есть,
покажите условия отбора и индексы
← →
Johnmen © (2004-07-21 15:12) [2]>нужно выбрать из неё немного данных.
Какой критерий небольшого выбора ?
← →
Иванов Сергей (2004-07-21 15:57) [3]to Соловьев © (21.07.04 15:12) [1]
покажите условия отбора и индексы
индексов там много. в принципе есть и такие по которым я бы поискал.
Johnmen © (21.07.04 15:12) [2]
Какой критерий небольшого выбора ?
На самом деле это БЕСТ5, таблица со строками накладных
выборка документов. В самой системе выборка делается средствами фокспра, процедура целая. то есть ручками. без sql. А мне надо сделать тоже самое но из вне. если бы какая то технология позволяля осуществлять поиск по этим индексам это было бы идеально. Но что-то меня сомнения терзают.
С уважением Иванов Сергей.
← →
Соловьев © (2004-07-21 16:01) [4]
> индексов там много. в принципе есть и такие по которым я
> бы поискал.
это типа ответ: сам дурак:)
← →
Johnmen © (2004-07-21 16:01) [5]Тем не менее
>это были query
Какие ? Вот где рыть надо...:)
← →
Иванов Сергей (2004-07-21 16:07) [6]> это типа ответ: сам дурак:)
нет,:-) просто мне кажется дело не в конкретном тексте, а в технологии.
> Какие ? Вот где рыть надо...:)
Вот такой.
SELECT
sclad_mdocm.delete,
sclad_mdocm.numdoc,
sclad_mdocm.nnum,
sclad_mlabel.grup,
sclad_mlabel.name,
sclad_mdocm.kol,
sclad_mdocm.cenaout,
sclad_mdocm.sumout,
sclad_mdocm.nds,
sclad_mdocm.sum_nds
FROM
sclad_mdocm sclad_mdocm,
sclad_mlabel sclad_mlabel
WHERE
sclad_mlabel.grup = sclad_mdocm.grup AND
sclad_mlabel.nnum = sclad_mdocm.nnum AND
((sclad_mdocm.vid="2") AND
(sclad_mdocm.type="1") AND
(sclad_mdocm.numdoc=:NumDoc) AND
(sclad_mdocm.delete=0) OR
(sclad_mdocm.vid="2") AND
(sclad_mdocm.type="8") AND
(sclad_mdocm.numdoc=:NumDoc) AND
(sclad_mdocm.delete=0))
ORDER BY
sclad_mlabel.grup, sclad_mlabel.nnum;
← →
bushmen © (2004-07-21 16:09) [7]> FROM
sclad_mdocm sclad_mdocm,
sclad_mlabel sclad_mlabel
А это что такое?
← →
Sandman25 © (2004-07-21 16:12) [8]С таким запросом индексы отдыхают :)
Нужно так:
...
WHERE
sclad_mlabel.grup = sclad_mdocm.grup AND
sclad_mlabel.nnum = sclad_mdocm.nnum AND
sclad_mdocm.numdoc=:NumDoc AND
sclad_mdocm.delete=0 AND
((sclad_mdocm.vid="2") AND
(sclad_mdocm.type="1")
OR
(sclad_mdocm.vid="2") AND
(sclad_mdocm.type="8")
)
Данных много? ORDER BY будет создавать временную таблицу для сортировки
← →
Sandman25 © (2004-07-21 16:14) [9]Еще лучше так:
WHERE
sclad_mlabel.grup = sclad_mdocm.grup AND
sclad_mlabel.nnum = sclad_mdocm.nnum AND
sclad_mdocm.numdoc=:NumDoc AND
sclad_mdocm.delete=0 AND
sclad_mdocm.vid="2" AND
sclad_mdocm.type in ("1", "8")
← →
Johnmen © (2004-07-21 16:15) [10]>Иванов Сергей
1. Какие индексы есть ?
2. Поаккуратней с одним и тем же именем для разных параметров...
← →
Иванов Сергей (2004-07-21 16:20) [11]to bushmen © (21.07.04 16:09) [7]
>А это что такое
А что не так?
Оно само так построило. когда два раза прицепляешь одну таблицу он пишет что то типа
sclad_mdocm sclad_mdocm,
sclad_mdocm sclad_mdocm_1,
← →
Соловьев © (2004-07-21 16:22) [12]кто оно?
← →
bushmen © (2004-07-21 16:23) [13]И кто он ?
← →
Johnmen © (2004-07-21 16:32) [14]А где она ?
← →
Плохиш © (2004-07-21 16:36) [15]
> Иванов Сергей (21.07.04 16:20) [11]
> to bushmen © (21.07.04 16:09) [7]
> >А это что такое
>
> А что не так?
Это называется "масло масляное"
> Оно само так построило. когда два раза прицепляешь одну
> таблицу он пишет что то типа
>
> sclad_mdocm sclad_mdocm,
> sclad_mdocm sclad_mdocm_1,
А теперь сравни, что "оно" построило и что ты написал.
← →
Sandman25 © (2004-07-21 16:46) [16]А ведь самое смешное, что автор ветки прав. Если
я по ошибке напишу
select *
from t1 t1,
t1 t1
то получу ругань Name is not unique in this context.
А если
select *
from t1,
t1
то я еще долго буду думать, почем запрос возвращает не то, что я хотел.
Поэтому запросы вида
select
from t1 t1,
t2 t2
вполне обоснованы.
← →
bushmen © (2004-07-21 16:48) [17]> Sandman25 © (21.07.04 16:46) [16]
Ты сам-то понял, что написал? :) Не проще ли написать:
select * from t1, t2
← →
bushmen © (2004-07-21 16:51) [18]Правда, если поля уникальны, иначе вместо "*" надо поля перечислять
← →
Sandman25 © (2004-07-21 17:00) [19][17] bushmen © (21.07.04 16:48)
Конечно, проще. Но если задавать алиас копированием имени таблицы, то опечатки невозможны, точнее они будут обнаружены при Open независимо от возвращаемых данных. Перечитай [16] и представь, что ты хотел написать
from t1, t2, но по ошибке написал from t1, t1.
← →
bushmen © (2004-07-21 17:18) [20]> по ошибке написал from t1, t1.
Я думаю, что как-раз копированием он и наделает ошибок - посмотри на его пост [11]. А ошибиться можно в любом месте, но это не означает, что из-за этого надо городить леса. Достаточно было написать select from t1 a, t2 b
← →
Sandman25 © (2004-07-21 17:24) [21][20] bushmen © (21.07.04 17:18)
Представим себе, что я написал парсер, который дублирует имена таблиц в качестве алиасов, и я запускаю его после написания запроса. Понимаю, что это удобно только в том случае, если все поля в таблицах имеют уникальные имена, чтобы не пришлось длинные алиасы указывать. А если мне действительно нужно использовать одну таблицу несколько раз, я потом ручками поправлю. Скажем так: "В использовании такого запроса есть не только недостатки, но и преимущества". Согласен? :)
← →
Иванов Сергей (2004-07-22 09:27) [22]to Соловьев © (21.07.04 16:22) [12]
to bushmen © (21.07.04 16:23) [13]
to Johnmen © (21.07.04 16:32) [14]
кто оно?
И кто он ?
А где она ?
это msquery.exe
to Sandman25
> Данных много? ORDER BY будет создавать временную таблицу для
> сортировки
на выходе сотня-другая строк, а на входе более миллиона
← →
bushmen © (2004-07-22 09:30) [23]> Иванов Сергей (22.07.04 09:27) [22]
А когда использовал ADO, то использовал локальный или серверный курсор?
← →
Sandman25 © (2004-07-22 09:31) [24]Попробуйте [9].
Необходимы индексы по:
1) sclad_mdocm.numdoc;
2) sclad_mlabel.grup, sclad_mlabel.nnum.
← →
Иванов Сергей (2004-07-22 09:44) [25]to bushmen © (22.07.04 09:30) [23]
> А когда использовал ADO, то использовал локальный или серверный > курсор?
clUseClient
← →
Иванов Сергей (2004-07-22 09:48) [26]to Sandman25 © (22.07.04 09:31) [24]
> Попробуйте [9].
> Необходимы индексы по:
> 1) sclad_mdocm.numdoc;
> 2) sclad_mlabel.grup, sclad_mlabel.nnum.
а без индексов эта перестановка заработать должна?
новые индексы врядли мне дадут создать :-( база итак переиндексируется минут пятьдесят на 2x Xeon2400HT
← →
Sandman25 © (2004-07-22 09:54) [27][26] Иванов Сергей (22.07.04 09:48)
Конечно, должна. Только без индексов базе придется пересмотреть всю таблицу sclad_mdocm, а затем для каждой записи, у которой указанный номер документа, пересмотреть всю таблицу sclad_mlabel. Собственно, именно это у Вас сейчас и происходит
← →
Иванов Сергей (2004-07-22 09:55) [28]to bushmen © (22.07.04 09:30) [23]
вот ведь написано же в TCustomADODataSet.CursorLocation
сейчас попробую.
Спасибо.
A server-side cursor offers less flexibility, but may be more advantageous (or necessary) for large result sets. Using a server-side cursor becomes necessary when the sheer size of a result set exceeds the available disk space that would be needed to create the client-side cursor. Also, many servers only support unidirectional cursors. This would preclude moving the record pointer in the dataset backward (even one record) through the result set.
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.08.15;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.048 c