Переключение на Главную Страницу Страницы: 1 ... 10 11 [12] 13 14 ... 20 ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 64557 )
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #165 - 29. Октября 2007 :: 17:21
Печать  
orefkov писал(а) 29. Октября 2007 :: 17:15:
kms писал(а) 29. Октября 2007 :: 16:10:
orefkov
Условие "!=" теперь возвращает верный результат.
Но по-прежнему не использует индекс.
Ты не считаешь, что индекс должен использоваться?


"!=" неможет использовать индекс, смысла нет.

имхо для неуникальных неселективных индексов может и имело бы смысл оптимизация в виде "<" OR ">".
ну ладно, фиг с ним, по-существу согласен.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #166 - 29. Октября 2007 :: 17:23
Печать  
Z1 писал(а) 29. Октября 2007 :: 16:41:
А как проверять используется ли индекс ?
И используется индекс при ЭтоДиспетчер  >= 0  ?
И используется индекс при    ЭтоДиспетчер  IN (1,3)  ?

Саша же для этого план запроса сделал.
Только раньше удобнее (в виде печатной форме) было, можно было запросто сюда цитировать.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
Sergey
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 135
Зарегистрирован: 18. Октября 2006
Пол: Мужской
Re: 1sqlite
Ответ #167 - 29. Октября 2007 :: 20:19
Печать  
А можно ли с помощью этого dbeng32 установить фильтр в общем журнале по 2 параметрам? Например отобрать в журнале по "Фирме" и "Контрагенту" если есть графы отбора "Фирма" "Контрагент"
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #168 - 29. Октября 2007 :: 21:14
Печать  
kms писал(а) 29. Октября 2007 :: 17:21:
orefkov писал(а) 29. Октября 2007 :: 17:15:
kms писал(а) 29. Октября 2007 :: 16:10:
orefkov
Условие "!=" теперь возвращает верный результат.
Но по-прежнему не использует индекс.
Ты не считаешь, что индекс должен использоваться?


"!=" неможет использовать индекс, смысла нет.

имхо для неуникальных неселективных индексов может и имело бы смысл оптимизация в виде "<" OR ">".
ну ладно, фиг с ним, по-существу согласен.

Тут вот в чем затык.
Я уже кидал сцылку http://www.sqlite.org/optoverview.html
Оптимизатор SQLite так построен, что пытается подобрать такой индекс, чтобы сделать по таблице один проход, и соответственно, пасует перед OR. Ему нужно только AND. Не спорю, что в неких частных случаях можно было бы для каждого из OR сделать по одному проходу по таблице, однако в общем случае это невозможно, так как эти несколько проходов могут "пересечся" по одним записям, и придется еще исключать дублирующиеся записи, что может перевесить выгоду от нескольких проходов по таблице.
Короче, когда SQLite передает в мой модуль ограничения по полям, то ограничения "!=" даже не передаются.

Также следует обратить внимание, что при выполнении запроса ограничения по полям, попадающим в индекс, SQLite не проверяет, так как я ему гарантирую, что они выполняются. Условия же по полям, не попавшим в индекс, он проверяет сам. При этом возможны расхождения между тем, как поля сравниваю я, и как SQLite.
Я сейчас как раз над этим эксперементирую. Возможно, сделаю так, что все условия по полям таблицы, как попадающими в индекс, так и не попадающие, буду проверять сам.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #169 - 29. Октября 2007 :: 21:16
Печать  
kms писал(а) 29. Октября 2007 :: 17:23:
Z1 писал(а) 29. Октября 2007 :: 16:41:
А как проверять используется ли индекс ?
И используется индекс при ЭтоДиспетчер  >= 0  ?
И используется индекс при    ЭтоДиспетчер  IN (1,3)  ?

Саша же для этого план запроса сделал.
Только раньше удобнее (в виде печатной форме) было, можно было запросто сюда цитировать.

Могу восстановить Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


я хочу, чтоб сюда проложили
дорогу оттуда...

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #170 - 29. Октября 2007 :: 22:42
Печать  
orefkov писал(а) 29. Октября 2007 :: 21:14:
Я сейчас как раз над этим эксперементирую. Возможно, сделаю так, что все условия по полям таблицы, как попадающими в индекс, так и не попадающие, буду проверять сам.

Если бы ты еще коротенько объяснил, зачем тебе на текущем этапе составные "виртуальные" поля, соответствующие индексам, было бы совсем понятно.

orefkov писал(а) 29. Октября 2007 :: 21:16:
Могу восстановить Улыбка

Не смеем надеяться Улыбка

Но, к слову, для владельцев широких мониторов и любителей забивать их всякой всячиной - оказалось весьма удобно выводить план выполнения в одном и том же обновляемом окне одновременно с самим запросом.
  

De quelle planète es-tu?
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #171 - 30. Октября 2007 :: 05:50
Печать  
kms писал(а) 29. Октября 2007 :: 22:42:
orefkov писал(а) 29. Октября 2007 :: 21:14:
Я сейчас как раз над этим эксперементирую. Возможно, сделаю так, что все условия по полям таблицы, как попадающими в индекс, так и не попадающие, буду проверять сам.

Если бы ты еще коротенько объяснил, зачем тебе на текущем этапе составные "виртуальные" поля, соответствующие индексам, было бы совсем понятно.

Ну, основная причина, для чего я их делаю, это

select ... from ... where parentid_isfolder_descr > ?current_key limit N

то есть для возможности использовать эти поля потом в провайдере ТП.
Только надо еще дополнить номером строки.
То есть в ODBC провайдере такая конструкция записывалась бы так:

select top N... from ...
where parentid > @p1 or (parentid=@p1 and isfolder>@p2) or
(parentid = @p1 and isfolder = @p2 and descr > @p3) or
(parentid = @p1 and isfolder = @p2 and descr = @p3 and _rowid > @p4)

SQL-сервер такое выражение сможет правильно понять, а вот SQLite - нет.
Хотя, возможно, такие виртуальные поля можно сделать опциональными, указывая при создании виртуальной таблицы, какие из них создавать. Например:

create virtual table Товары using dbeng(Справочник.Номенклатура + Поле = нужный индекс)
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #172 - 30. Октября 2007 :: 05:56
Печать  
Вот кстати, кому интересно, цхмина по SQLite, содержит почти все с sqlite.org
  

sqlite.zip ( 964 KB | Загрузки )
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #173 - 30. Октября 2007 :: 10:09
Печать  
Погонял на индексах - все очень симпатично Улыбка
Находит сложные, соединяется нормально.
Вроде бы даже IN заработал - результат макроподстановки на OR ?


Такой запрос
Код
Выбрать все
Select *
from Регистр_ОстаткиТоваров as РегОстатков
inner join Журнал as Жур on Жур.iddoc=РегОстатков.iddoc

where Жур.date between '20060530' and '20060530' 


выполняется 22 мс

а если поменять INNER на LEFT
Код
Выбрать все
Select *
from Регистр_ОстаткиТоваров as РегОстатков
left join Журнал as Жур on Жур.iddoc=РегОстатков.iddoc

where Жур.date between '20060530' and '20060530' 


то 67 000 мс
если увеличить вторую дату - то время увеличивается экспоненциально.

Проблема не в том, что не подобраны индексы (хотя второй запрос эквивалентен первому) -
а в том что  JOIN работает очень медленно, когда не находит индекс.
(предположительно - предварительно не индексирует, а простым перебором соединяет )
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #174 - 30. Октября 2007 :: 11:26
Печать  
kiruha писал(а) 30. Октября 2007 :: 10:09:
Погонял на индексах - все очень симпатично Улыбка
Находит сложные, соединяется нормально.
Вроде бы даже IN заработал - результат макроподстановки на OR ?


Такой запрос
Код
Выбрать все
Select *
from Регистр_ОстаткиТоваров as РегОстатков
inner join Журнал as Жур on Жур.iddoc=РегОстатков.iddoc

where Жур.date between '20060530' and '20060530' 


выполняется 22 мс

а если поменять INNER на LEFT
Код
Выбрать все
Select *
from Регистр_ОстаткиТоваров as РегОстатков
left join Журнал as Жур on Жур.iddoc=РегОстатков.iddoc

where Жур.date between '20060530' and '20060530' 


то 67 000 мс
если увеличить вторую дату - то время увеличивается экспоненциально.

Проблема не в том, что не подобраны индексы (хотя второй запрос эквивалентен первому) -
а в том что  JOIN работает очень медленно, когда не находит индекс.
(предположительно - предварительно не индексирует, а простым перебором соединяет )

Плана запроса конечно я не вижу, но можно предположить, что в первом запросе SQLite переставил таблицы во from, и пошел по индексу date_time_iddoc в журнале, быстро подтягивая движения из регистра по id.
Во втором запросе, так как left join, то таблицы переставить нельзя, и приходится идти по всему регистру, цеплять к нему записи из журнала по id, и проверять на попадание в период.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #175 - 30. Октября 2007 :: 11:44
Печать  
orefkov писал(а) 30. Октября 2007 :: 11:26:
[quote author=kiruha link=1192855975/165#173 date=1193738969]
Во втором запросе, так как left join, то таблицы переставить нельзя, и приходится идти по всему регистру, цеплять к нему записи из журнала по id, и проверять на попадание в период.

Фильтр ставит '1SJOURN.ACDATETIM;? 0;
0;', других нет

То же самое на фоксе (индексы он при соединении вообще не видит) выполняется 500 мс.
За месяц 894 мс.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #176 - 30. Октября 2007 :: 11:50
Печать  
kiruha писал(а) 30. Октября 2007 :: 11:44:
orefkov писал(а) 30. Октября 2007 :: 11:26:
[quote author=kiruha link=1192855975/165#173 date=1193738969]
Во втором запросе, так как left join, то таблицы переставить нельзя, и приходится идти по всему регистру, цеплять к нему записи из журнала по id, и проверять на попадание в период.

Фильтр ставит '1SJOURN.ACDATETIM;? 0;
0;', других нет

То же самое на фоксе (индексы он при соединении вообще не видит) выполняется 500 мс.
За месяц 894 мс.

Это точно про вариант с left join?

  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #177 - 30. Октября 2007 :: 11:57
Печать  
orefkov писал(а) 30. Октября 2007 :: 11:50:
kiruha писал(а) 30. Октября 2007 :: 11:44:
orefkov писал(а) 30. Октября 2007 :: 11:26:
[quote author=kiruha link=1192855975/165#173 date=1193738969]
Во втором запросе, так как left join, то таблицы переставить нельзя, и приходится идти по всему регистру, цеплять к нему записи из журнала по id, и проверять на попадание в период.

Фильтр ставит '1SJOURN.ACDATETIM;? 0;
0;', других нет

То же самое на фоксе (индексы он при соединении вообще не видит) выполняется 500 мс.
За месяц 894 мс.

Это точно про вариант с left join?



Да.
Есть еще  пустой(в поле p3) VFilter на addr 5.
VFilter на addr 11    -  '1SJOURN.ACDATETIM;? 0;
0;'
других нет
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #178 - 30. Октября 2007 :: 12:02
Печать  
Посмотрел план запроса.
В первом случае переставляются таблицы, делается отбор из журнала по периоду, к каждой записи цепляются движения регистра, выбираемые по id:

7      VFilter      1      85      1SJOURN.ACDATETIM;? 0;
0; // Выборка из журнала по периоду
8      VColumn      1      1       // Получение поля iddoc из журнала
9      Integer      1      0      
10      Integer      0      0      
11      VFilter      0      84      RA16602.IDLINE;?
0;  // Выборка из регистра по IDDOC


Во втором случае таблицы не переставить, выбирается ВСЕ движения из регистра, на каждое движение выбираются все записи из журнала за этот период, каждая запись из журнала сверяется с записью регистра по iddoc.

5      VFilter      0      100       // Выборка всех записей из регистра
6      MemInt      0      1      
7      String8      0      0      20060530
8      String8      0      0      20060530
9      Integer      2      0      
10      Integer      1      0      
11      VFilter      1      96      1SJOURN.ACDATETIM;? 0;
0; // Выборка записей из журнала за период
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #179 - 30. Октября 2007 :: 12:15
Печать  
Также интересно узнать время выполнения фоксом варианта с inner join
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 10 11 [12] 13 14 ... 20
ОтправитьПечать