Имя: Пароль:
1C
1C 7.7
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) Понимаете, тут суть не в том, чтобы просто получить информацию из базы. Я пишу обработку подбора по остаткам на регистре, хочу чтобы можно было подбирать в разрезе измерений регистра, и характеристик авто, и чтобы было видно на каком разрезе какой остаток в данный момент висит.
Для этого я создаю две временные таблицы: Остатки - "срез" остатков по регистру на момент времени, с характеристиками, и Отбор - в нее будут отбираться строки из таблицы "Остатки".
Сначала я сделал такую обработку с ИТЗ, но мне показалось, что если пользоваться табличками в мемори, то будет быстрее.
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн