Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.08.15;
Скачать: CL | DM;

Вниз

Выборка из большой базы   Найти похожие ветки 

 
Иванов Сергей   (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;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.039 c
3-1090442388
chirchik
2004-07-22 00:39
2004.08.15
изменения не принимаются (запрос с параметрами)


14-1091004467
romeo
2004-07-28 12:47
2004.08.15
Нужен совет: изучать MS SQL Server или Oracle?


14-1091173497
Layner
2004-07-30 11:44
2004.08.15
Мышь(оптическая) сама бегает в win2000 :)


4-1089118392
Wistler
2004-07-06 16:53
2004.08.15
Работа с пользователями в домене WinNT


4-1088869764
AlexZ
2004-07-03 19:49
2004.08.15
Transparent label on WinAPI