Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Горячая тема (более 10 ответов) 1sqlite, функция instr(X,Y) (число прочтений - 3551 )
Анатолий
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 25
Зарегистрирован: 18. Сентября 2008
1sqlite, функция instr(X,Y)
17. Декабря 2014 :: 12:19
Печать  
1sqlite не реализует функцию instr() sqlite или я не так ее готовлю?
Запрос типа:

SELECT
INSTR('123', '2')

валится с ошибкой, что нет такой функции.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite, функция instr(X,Y)
Ответ #1 - 17. Декабря 2014 :: 12:37
Печать  
Держит, но начиная с движка 3.7.15

http://www.sqlite.org/changes.html

2012-12-12 (3.7.15)
   Added the instr() SQL function.

Вот тут http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/743 я выкладывал sqlite на движке 3.7.17 - на нем работает.
  
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite, функция instr(X,Y)
Ответ #2 - 17. Декабря 2014 :: 12:57
Печать  
Потестил твою вк, чегой-то она пишет служебные сообщения,,типа "найдено в кеше", хотя отладка не включена вообще..
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite, функция instr(X,Y)
Ответ #3 - 17. Декабря 2014 :: 15:38
Печать  
Спасибо! Да, забыл одну строчку закоментировать.
Все пытался 3.8.* прикрутить, сравнивал...
P.S. Изменений в 1sqlite по сравнению с 1.0.2.6, за исключением смены движка sqlite на 3.7.17 и его пропатчивания, аналогично тому что было сделано с 3.7.10 никаких нет.
  

1sqlite_3_7_17_bf1.zip ( 306 KB | Загрузки )
Наверх
www  
IP записан
 
Анатолий
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 25
Зарегистрирован: 18. Сентября 2008
Re: 1sqlite, функция instr(X,Y)
Ответ #4 - 18. Декабря 2014 :: 11:38
Печать  
Спасибо, Djelf.
Эх, еще printf() понадобилась, а она только с 3.8
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite, функция instr(X,Y)
Ответ #5 - 18. Декабря 2014 :: 12:23
Печать  
C 3.8.x все плохо. Проверял несколько версий. Могу конечно выложить версию на 3.8 но очень не хочется....

Мне кажется что в 3.8 кусок планировщика, тот что отвечает за виртуальные таблицы багнутый.
Грубо говоря есть запрос. В запросе есть таблица. По таблице я должен гарантийно попасть в индекс по IDDOC. В 3.7 попадаю.
Планировщик 3.8 сначала запрашивает, что будет если запрос будет с таким условием но не будет использовать индекс. Я ей честно говорю 8к строк.
Затем планировщик спрашивает что будет, если он будет использовать индекс. Я отвечаю 1
На самом деле не важно что я там отвечаю (грязным хаком подсовывал любые значения для обоих случаев).
Планировщик в 3.8 упорно выбирает не индексное чтение и запрос становится в 1000 раз медленнее.
Вот такая печаль...


  
Наверх
www  
IP записан
 
mukoza
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 17. Февраля 2015
Re: 1sqlite, функция instr(X,Y)
Ответ #6 - 17. Февраля 2015 :: 06:13
Печать  
К сожалению, на 3.7.17 запросы тоже работают в 1000 раз медленнее Печаль (проверил неоднократно, индексы не функционируют)
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite, функция instr(X,Y)
Ответ #7 - 17. Февраля 2015 :: 07:34
Печать  
mukoza писал(а) 17. Февраля 2015 :: 06:13:
К сожалению, на 3.7.17 запросы тоже работают в 1000 раз медленнее Печаль (проверил неоднократно, индексы не функционируют)


Странно. Примерчик бы не плохо запроса на котором 3.7.17 тормозит, а на более старых летает.
И таблички бы полученные по explain QUERY PLAN
  
Наверх
www  
IP записан
 
mukoza
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 17. Февраля 2015
Re: 1sqlite, функция instr(X,Y)
Ответ #8 - 17. Февраля 2015 :: 15:56
Печать  
Вот файл с дебагами одного и того же запроса с разными dll. Разница по времени примерно в 20 раз. Запрос уродливый, конечно, но не в этом суть.
  

________1sqlite.zip ( 2 KB | Загрузки )
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite, функция instr(X,Y)
Ответ #9 - 17. Февраля 2015 :: 17:17
Печать  
20 раз еще куда не шло... это не в 1000... А результат запроса то совпадет? В 1.0.2.6 с вот такой баг есть http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/733#733

В логе отладка, а не "explain QUERY PLAN "+ТекстЗапроса, а в отладке видно только то что предварительный планировщик 1sqlite сообщает окончательнуму планировщику sqlite (я пытаюсь импровизировать с переводом на русский механизма работы виртуальных таблиц). Поскольку я его не трогал, то предположения совпадают (порядок изменился, не думаю что это существенно).

Что и как потом выбрал сам sqlite видно только через explain QUERY PLAN.

Возможно это может быть из-за оптимизации IN, в 3.7.10 она отсутствует. В 3.7.17 есть, но как оно работает в сочетании со временными таблицами...  Нерешительный
Без explain почти ничего не видно.

Индекс на временную таблицу создавать не пробовал?

Много таких провальных запросов?
  
Наверх
www  
IP записан
 
mukoza
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 3
Зарегистрирован: 17. Февраля 2015
Re: 1sqlite, функция instr(X,Y)
Ответ #10 - 18. Февраля 2015 :: 03:23
Печать  
3.7.10

0      0      1      SCAN TABLE Журнал VIRTUAL TABLE INDEX 1:ACDATETIM;    19 !" 0?b 6O?!%+a#d0 0&  Q (~0 rows)
0      1      2      SCAN TABLE Документ.тРасходнаяНакладная AS Расходные VIRTUAL TABLE INDEX 0:ID;    15 !  0p nHy(<@D( Q         (~0 rows)
0      2      5      SCAN TABLE Справочник.тКонтрагенты AS Контрагенты VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!0D  Q (~0 rows)
0      3      0      SCAN TABLE ДокументСтроки.тРасходнаяНакладная AS Строки VIRTUAL TABLE INDEX 0:IDLINE;    10 !  0p nHyd!      (~0 rows)
0      4      3      SCAN TABLE Справочник.Товары AS СпрТовары VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!0D  Q (~0 rows)
0      5      4      SCAN TABLE Справочник.Товары AS Группы VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!0D  Q (~0 rows)
0      0      0      EXECUTE LIST SUBQUERY 1
1      0      0      SCAN TABLE СписокГрупп (~1000000 rows)
0      6      6      SCAN TABLE Справочник.тКонтрагенты AS Поставщики VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!0D  Q (~0 rows)
0      7      7      SCAN TABLE Справочник.Точки AS Точки VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!      (~0 rows)
0      8      8      SCAN TABLE Справочник.Точки AS Города VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!      (~0 rows)
0      9      9      SCAN TABLE Справочник.Точки AS Районы VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!      (~0 rows)
0      10      10      SCAN TABLE Справочник.Точки AS Области VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!      (~0 rows)
0      11      11      SCAN TABLE Справочник.КонтрагентыБух AS КонтрагентыБух VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!      (~0 rows)
0      12      12      SCAN TABLE Справочник.Валюты AS Валюты VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!      (~0 rows)
0      0      0      USE TEMP B-TREE FOR GROUP BY

3.7.17

0      0      4      SCAN TABLE Справочник.Товары AS Группы VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd! %+a# (~0 rows)
0      0      0      EXECUTE LIST SUBQUERY 1
1      0      0      SCAN TABLE СписокГрупп (~1000000 rows)
0      1      1      SCAN TABLE Журнал VIRTUAL TABLE INDEX 1:ACDATETIM;    19 !" 0?b 6O?!%+a#d0 0&  Q (~0 rows)
0      2      2      SCAN TABLE Документ.тРасходнаяНакладная AS Расходные VIRTUAL TABLE INDEX 0:ID;    15 !  0p nHy(<@D( Q 0 0&  Q (~0 rows)
0      3      5      SCAN TABLE Справочник.тКонтрагенты AS Контрагенты VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!0&  ! (~0 rows)
0      4      0      SCAN TABLE ДокументСтроки.тРасходнаяНакладная AS Строки VIRTUAL TABLE INDEX 0:IDLINE;    10 !  0p nHyd!@D( Q (~0 rows)
0      5      3      SCAN TABLE Справочник.Товары AS СпрТовары VIRTUAL TABLE INDEX 0:IDD;    15 !  0p nHy$404  Q 0 0&  Q (~0 rows)
0      6      6      SCAN TABLE Справочник.тКонтрагенты AS Поставщики VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!0&  ! (~0 rows)
0      7      7      SCAN TABLE Справочник.Точки AS Точки VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!04  Q (~0 rows)
0      8      8      SCAN TABLE Справочник.Точки AS Города VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!04  Q (~0 rows)
0      9      9      SCAN TABLE Справочник.Точки AS Районы VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!04  Q (~0 rows)
0      10      10      SCAN TABLE Справочник.Точки AS Области VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!04  Q (~0 rows)
0      11      11      SCAN TABLE Справочник.КонтрагентыБух AS КонтрагентыБух VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!04  Q (~0 rows)
0      12      12      SCAN TABLE Справочник.Валюты AS Валюты VIRTUAL TABLE INDEX 0:IDD;    10 !  0p nHyd!04  Q (~0 rows)
0      0      0      USE TEMP B-TREE FOR GROUP BY

Сколько запросов - не знаю, пару дней назад заменил dll-ку без задней мысли и тут звонок, что отчет за три месяца формируется уже 15 минут  Улыбка
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite, функция instr(X,Y)
Ответ #11 - 18. Февраля 2015 :: 08:10
Печать  
mukoza писал(а) 18. Февраля 2015 :: 03:23:
Сколько запросов - не знаю, пару дней назад заменил dll-ку без задней мысли и тут звонок, что отчет за три месяца формируется уже 15 минут  Улыбка

Тогда есть большая вероятность что он один такой  Подмигивание

Ну вот теперь видно что индексы то 3.7.17 все таки использует и в них попадает (в отличии от 3.8), а вот план строит неудачный.
Внутренний планировщик sqlite - дело темное  Нерешительный

Думаю этот запрос можно переделать так что он 3.7.17 будет быстрее раз в 10 чем в 3.7.10...
Есть у меня похожий запрос... я его с 10м до 3с уговорил.

Я бы попробовал заменить
inner join [Справочник.Товары] СпрТовары ON СпрТовары.ID = Строки.Товар
inner join [Справочник.Товары] Группы ON Группы.ID = СпрТовары.PARENTID
where Группы.ID in (SELECT Val From СписокГрупп)
на отдельный запрос во временную таблицу СписокТоваров с колонками Группа,Товар и
where Строки.Товар in (SELECT Товар From СписокТоваров)
или
inner join СписокТоваров ON СписокТоваров.Товар = Строки.Товар

upd: еще вариант - думаю минус  в строке -Группы.ID in (SELECT Val From СписокГрупп) должен отключить оптимизацию по  IN и план будет выбран как в 3.7.10
« Последняя редакция: 18. Февраля 2015 :: 15:13 - Djelf »  
Наверх
www  
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: 1sqlite, функция instr(X,Y)
Ответ #12 - 19. Февраля 2015 :: 07:48
Печать  
А если так переписать, на какой версии компоненты дольше работает.
Код
Выбрать все
select
	Расходные.Контрагент	 [Клиент $Справочник.тКонтрагенты]
,	SUM(Строки.СуммаОтпускная) [Сумма $Число.18.2]
,	SUM(Строки.Количество)     [Количество $Число.18.0]
,	Точки.ID			 [Точка $Справочник.Точки]
,	Города.ID			[Город $Справочник.Точки]
,	Области.ID		     [Область $Справочник.Точки]
,	Районы.ID			[Район $Справочник.Точки]
,	Точки.ТипТочки		 [ТипТочки $Перечисление.ТипыТочек]
,	КонтрагентыБух.ID	    [Филиал $Справочник.КонтрагентыБух]
,	Расходные.Менеджер	   [Сотрудник $Справочник.Пользователи]
,	СпрТовары.ID		   [Товар $Справочник.Товары]
,	Группы.ID			[Группа $Справочник.Товары]
,	Расходные.ДатаОтгрузки     [ДатаОтгрузки $Дата]
,	substr(Журнал.DATE, 1, 6)  МесяцПродажи
,	Поставщики.ID		  [Поставщик $Справочник.тКонтрагенты]
,	Расходные.ФормаОплаты	[Форма $Перечисление.ФормыОплаты]
,	Строки.Склад		   [Склад $Справочник.чСклады]
from
	[Журнал] as Журнал
    inner join [Документ.тРасходнаяНакладная] Расходные  ON Расходные.IDDOC = Журнал.IDDOC AND Расходные.Резерв = 0
    inner join [ДокументСтроки.тРасходнаяНакладная] Строки on Строки.IDDOC = Расходные.IDDOC

    inner join [Справочник.Товары] СпрТовары ON СпрТовары.ID = Строки.Товар

    --inner join [Справочник.Товары] Группы ON Группы.ID = СпрТовары.PARENTID AND Группы.ID in (SELECT Val From СписокГрупп)
    inner join СписокГрупп СписокГрупп on СписокГрупп.val = СпрТовары.PARENTID

    inner join [Справочник.тКонтрагенты] Контрагенты ON Контрагенты.ID = Расходные.Контрагент
    left  join [Справочник.тКонтрагенты] Поставщики ON Поставщики.ID = СпрТовары.Поставщик

    left  join [Справочник.Точки] Точки ON Точки.ID = Расходные.Точка
    left  join [Справочник.Точки] Города ON Города.ID = Точки.PARENTID
    left  join [Справочник.Точки] Районы ON Районы.ID = Города.PARENTID
    left  join [Справочник.Точки] Области ON Области.ID = Районы.PARENTID
    left  join [Справочник.КонтрагентыБух] КонтрагентыБух ON КонтрагентыБух.ID = Точки.ВладелецТочки
    inner join [Справочник.Валюты] Валюты ON Валюты.ID = СпрТовары.Валюта
where
    Журнал.IDDOCDEF = :ВидДокумента.тРасходнаяНакладная AND Журнал.DATE BETWEEN  '20140108' AND  '20140108Я' AND Журнал.CLOSED = 1
group by
    Расходные.Контрагент, Точки.ID, Города.ID, Области.ID, Районы.ID, Точки.ТипТочки, КонтрагентыБух.ID
  , Расходные.Менеджер, СпрТовары.ID, Группы.ID, Расходные.ДатаОтгрузки, МесяцПродажи, Поставщики.ID, Строки.Склад

 

  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite, функция instr(X,Y)
Ответ #13 - 19. Февраля 2015 :: 11:54
Печать  
leov-001 писал(а) 19. Февраля 2015 :: 07:48:
А если так переписать, на какой версии компоненты дольше работает.


Будет то же самое.
Планировщику все равно где именно находятся граничные условия,  после ON или в WHERE

Вот запрос для стандартной конфигурации приводящий к аналогичной ситуации
Код
Выбрать все
SELECT
	ДCР.IDDOC [Реализация $Документ.Реализация],
	СН.ID [Номенклатура $Справочник.Номенклатура]
FROM
	ДокументСтроки_Реализация as ДCР
	INNER JOIN Журнал ON Журнал.IDDOC = ДCР.IDDOC
	INNER JOIN Справочник_Номенклатура AS СН ON СН.ID = ДCР.Номенклатура
WHERE
	Журнал.date BETWEEN :НачДата AND :КонДата
	AND СН.ID IN (SELECT ID FROM Справочник_Номенклатура LIMIT 100)
GROUP by ДCР.IdDoc,ДCР.Номенклатура
 



С оптимизацией по IN в 3.7.17 8889мс
Отключаем оптимизацию по IN
Код
Выбрать все
AND -СН.ID IN (SELECT ID FROM Справочник_Номенклатура LIMIT 100) 


Без оптимизации по IN 831мс



  
Наверх
www  
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать