|
v7: 1SQlite: Долго работает Лефт-Джойн | ☑ | ||
---|---|---|---|---|
0
Zhuravlik
14.11.12
✎
14:32
|
Здравствуйте. Создал в базе :memory: две таблицы, и одну хочу дополнить колонками из другой:
|SELECT | _Отбор.Поставщик, | _Отбор.Договор, | _Отбор.Вагон, | _Отбор.Автомобиль, | Ост.Вариант, | Ост.Модель |FROM _Отбор | |LEFT JOIN Остатки AS Ост on | _Отбор.Поставщик = Ост.Поставщик AND | _Отбор.Договор = Ост.Договор AND | _Отбор.Вагон = Ост.Вагон AND | _Отбор.Автомобиль = Ост.Автомобиль Этот запрос очень долго отрабатывает, я так понимаю из-за условий в Лефт-Джойне, в доках прочитал про CREATE INDEX, Запрос.ВыполнитьЗапрос("CREATE INDEX ind_otb ON _Отбор (Поставщик, Договор, Вагон, Автомобиль)"); Запрос.ВыполнитьЗапрос("CREATE INDEX ind_ost ON Остатки (Поставщик, Договор, Вагон, Автомобиль)"); Но не пойму, что делать дальше? Подскажите, в ту я вообще сторону копаю, или как сделать лучше? |
|||
1
acsent
14.11.12
✎
14:34
|
на отборе ненужен индекс, только на остатках
|
|||
2
Ёпрст
14.11.12
✎
14:37
|
(0) а без изврата с созданием табличек в базе мемори не судьба ужо всё получить 1 запросом ?
|
|||
3
Zhuravlik
14.11.12
✎
14:44
|
(1) А как им пользоваться после создания?
(2) Нет. Таблица остатки - формируется из очень большого запроса, в котором я собираю остатки по регистру, и туда еще лефт-джойню значения характеристик авто, их я собираю как периодические значения из 1SConst. Вообще, я думал что так будет очень быстро, я же не из базы, т.е. не из большого ДБФ-файла достаю эти данные, а из простой таблички, но это так тупит... |
|||
4
Zhuravlik
14.11.12
✎
14:48
|
+ В таблице Остатки - овер 20000 строк, а в таблице _Отбор - 80. Я так понимаю, там по времени вообще копейки нужны - тысячные доли секунды, но запрос занимает десятую долю секунды.
|
|||
5
Zhuravlik
14.11.12
✎
15:00
|
Я понял! 1SQlite автоматически подбирает индекс?)) После того как я выполнил креат индекс на остатках время лефт-джойна уменьшилось в 10 раз)))
|
|||
6
Ёпрст
14.11.12
✎
15:02
|
какой догадливый
Вот если бы убрал создание временной таблички - было бы еще быстрее |
|||
7
Zhuravlik
14.11.12
✎
15:02
|
+Просто при отладке он не сообщает, что найден индекс, не сразу заметил.
Но все-равно, это правильный метод, или можно еще лучше сделать? |
|||
8
Zhuravlik
14.11.12
✎
15:03
|
(6) А я пользуюсь "CREATE TABLE", а не "CREATE TEMP TABLE"...
|
|||
9
Zhuravlik
14.11.12
✎
15:10
|
(6) Понимаете, тут суть не в том, чтобы просто получить информацию из базы. Я пишу обработку подбора по остаткам на регистре, хочу чтобы можно было подбирать в разрезе измерений регистра, и характеристик авто, и чтобы было видно на каком разрезе какой остаток в данный момент висит.
Для этого я создаю две временные таблицы: Остатки - "срез" остатков по регистру на момент времени, с характеристиками, и Отбор - в нее будут отбираться строки из таблицы "Остатки". Сначала я сделал такую обработку с ИТЗ, но мне показалось, что если пользоваться табличками в мемори, то будет быстрее. |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |