![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выборка из большой базы [D5, dBase, FoxPro]
Иванов Сергей © (2004-07-21 15:11:00)Есть табличка Фокспро7 почти 2 гига нужно выбрать из неё немного данных.
BDE работает, но выборка занимает на бешеной машине 15 минут.
ADO попробовал таже фигня.
это были query
попробовал adotable - оно потащило всю базу в память и у меня все попадало...
Как выбрать? там индексы есть, но как пользоваться не понимаю.
С уважением Иванов Сергей.
Иванов Сергей (2004-07-22 09:55:00) [1]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.
Sandman25 (2004-07-22 09:54:00) [2][26] Иванов Сергей (22.07.04 09:48)
Конечно, должна. Только без индексов базе придется пересмотреть всю таблицу sclad_mdocm, а затем для каждой записи, у которой указанный номер документа, пересмотреть всю таблицу sclad_mlabel. Собственно, именно это у Вас сейчас и происходит
Иванов Сергей (2004-07-22 09:48:00) [3]to Sandman25 © (22.07.04 09:31) [24]
> Попробуйте [9].
> Необходимы индексы по:
> 1) sclad_mdocm.numdoc;
> 2) sclad_mlabel.grup, sclad_mlabel.nnum.
а без индексов эта перестановка заработать должна?
новые индексы врядли мне дадут создать :-( база итак переиндексируется минут пятьдесят на 2x Xeon2400HT
Иванов Сергей (2004-07-22 09:44:00) [4]to bushmen © (22.07.04 09:30) [23]
> А когда использовал ADO, то использовал локальный или серверный > курсор?
clUseClient
Sandman25 (2004-07-22 09:31:00) [5]Попробуйте [9].
Необходимы индексы по:
1) sclad_mdocm.numdoc;
2) sclad_mlabel.grup, sclad_mlabel.nnum.
bushmen (2004-07-22 09:30:00) [6]> Иванов Сергей (22.07.04 09:27) [22]
А когда использовал ADO, то использовал локальный или серверный курсор?
Иванов Сергей (2004-07-22 09:27:00) [7]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 будет создавать временную таблицу для
> сортировки
на выходе сотня-другая строк, а на входе более миллиона
Sandman25 (2004-07-21 17:24:00) [8][20] bushmen © (21.07.04 17:18)
Представим себе, что я написал парсер, который дублирует имена таблиц в качестве алиасов, и я запускаю его после написания запроса. Понимаю, что это удобно только в том случае, если все поля в таблицах имеют уникальные имена, чтобы не пришлось длинные алиасы указывать. А если мне действительно нужно использовать одну таблицу несколько раз, я потом ручками поправлю. Скажем так: "В использовании такого запроса есть не только недостатки, но и преимущества". Согласен? :)
bushmen (2004-07-21 17:18:00) [9]> по ошибке написал from t1, t1.
Я думаю, что как-раз копированием он и наделает ошибок - посмотри на его пост [11]. А ошибиться можно в любом месте, но это не означает, что из-за этого надо городить леса. Достаточно было написать select from t1 a, t2 b
Sandman25 (2004-07-21 17:00:00) [10][17] bushmen © (21.07.04 16:48)
Конечно, проще. Но если задавать алиас копированием имени таблицы, то опечатки невозможны, точнее они будут обнаружены при Open независимо от возвращаемых данных. Перечитай [16] и представь, что ты хотел написать
from t1, t2, но по ошибке написал from t1, t1.
bushmen (2004-07-21 16:51:00) [11]Правда, если поля уникальны, иначе вместо "*" надо поля перечислять
bushmen (2004-07-21 16:48:00) [12]> Sandman25 © (21.07.04 16:46) [16]
Ты сам-то понял, что написал? :) Не проще ли написать:
select * from t1, t2
Sandman25 (2004-07-21 16:46:00) [13]А ведь самое смешное, что автор ветки прав. Если
я по ошибке напишу
select *
from t1 t1,
t1 t1
то получу ругань Name is not unique in this context.
А если
select *
from t1,
t1
то я еще долго буду думать, почем запрос возвращает не то, что я хотел.
Поэтому запросы вида
select
from t1 t1,
t2 t2
вполне обоснованы.
Плохиш (2004-07-21 16:36:00) [14]
> Иванов Сергей (21.07.04 16:20) [11]
> to bushmen © (21.07.04 16:09) [7]
> >А это что такое
>
> А что не так?
Это называется "масло масляное"
> Оно само так построило. когда два раза прицепляешь одну
> таблицу он пишет что то типа
>
> sclad_mdocm sclad_mdocm,
> sclad_mdocm sclad_mdocm_1,
А теперь сравни, что "оно" построило и что ты написал.
Johnmen (2004-07-21 16:32:00) [15]А где она ?
bushmen (2004-07-21 16:23:00) [16]И кто он ?
Соловьев (2004-07-21 16:22:00) [17]кто оно?
Иванов Сергей (2004-07-21 16:20:00) [18]to bushmen © (21.07.04 16:09) [7]
>А это что такое
А что не так?
Оно само так построило. когда два раза прицепляешь одну таблицу он пишет что то типа
sclad_mdocm sclad_mdocm,
sclad_mdocm sclad_mdocm_1,
Johnmen (2004-07-21 16:15:00) [19]>Иванов Сергей
1. Какие индексы есть ?
2. Поаккуратней с одним и тем же именем для разных параметров...
Sandman25 (2004-07-21 16:14:00) [20]Еще лучше так:
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')