Переключение на Главную Страницу Страницы: 1 ... 51 52 [53] 54 55 ... 79 ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 458816 )
Asakra
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 83
Местоположение: Иркутск
Зарегистрирован: 28. Августа 2012
Пол: Мужской
Re: 1sqlite
Ответ #780 - 08. Марта 2015 :: 16:27
Печать  
Djelf писал(а) 08. Марта 2015 :: 06:59:
Asakra писал(а) 08. Марта 2015 :: 05:13:
Djelf писал(а) 06. Марта 2015 :: 10:17:
если условие будет на DATE BETWEN


т.е. если нужны остатки на позицию документа, то лучше писать date between :начДата and :конДата and time <:время and ididoc < :док
или это касается только использования IN по измерению с отбором?


IN тут ни при чем, он рассматривается планировщиком как = и вложенный подзапрос.
вот индексы таблицы движений
Код
Выбрать все
I=IDLINE	    IDDOC,LINENO,ACTNO
I=DATETIME   DATE,TIME,IDDOC,LINENO,ACTNO
I=VIA408       SP408,DATE,TIME,IDDOC,LINENO,ACTNO
 


где SP408 - Номенклатура

Есть 2 ограничения на таблицу DATE,TIME,IDDOC и SP408

Если указать ограничение по составному полю idx_DATE_TIME_IDDOC_LINENO_ACTNO и SP408 то будет выбран индекс DATETIME, а если указывать DATE,TIME,IDDOC,SP408 раздельно, то должен быть выбран индекс VIA408
Ну а эффективность выборки зависит от базы. У меня VIA408 в этом запросе быстрее чем DATETIME, но в какой то ситуации может быть и наоборот.
EXPLAIN QUERY PLAN в помощь...


понятно. сенкс, за развернутый ответ!
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #781 - 12. Июня 2015 :: 15:27
Печать  
1sqlite на движке 3.8.x таки будет!

http://www.sqlite.org/src/info/80ee56dda7db3860
http://www.sqlite.org/src/info/0d9edfab9fb61322

Альфа версия с этими патчами уже есть, некоторые странности в ней еще присутствуют (но я не все патчи из ветки наложил).
Вкусностей в 3.8.х много есть, оснавная вкусняшка - рекурсивные запросы (это позволит, например, получить дерево справочника одним запросом sql, без цикла 1С по метаданным и кучи union`ов).

Вопрос к сообществу насчет Пользовательских функций и Агрегатов.

Функция DedCred(0/1, значение) особого выиграша не дает. Есть ли смысл в таких функциях?

Агрегат SumByKey(ключ, число) интересно получилось. Если ключ номенклатура, а записи выбираются в 1с в порядке даты, то это дикое ускорение получения начальных или конечных остатков на день. Не очень правильно с точки зрания sql, но оно в наших условиях работает!

А вот и сам вопрос: еще идеи есть?

P.S. вторую точку не просите!  Очень довольный
« Последняя редакция: 12. Июня 2015 :: 17:12 - Djelf »  
Наверх
www  
IP записан
 
vladimirmir2012
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 426
Зарегистрирован: 18. Мая 2011
Re: 1sqlite
Ответ #782 - 14. Июня 2015 :: 07:38
Печать  
Djelf писал(а) 12. Июня 2015 :: 15:27:
А вот и сам вопрос: еще идеи есть?
У меня пока только одно пожелание - наличие хорошей документации по 1sqlite.
Текущая документация более похожа на памятки автора для себя .
Не мне тебе объяснять сколько тонкостей нужно знать и понимать для того, чтобы полноценно использовать 1sqlite.
Как по мне когда начинал использовать 1sqlite, то много времени тратилось на то, чтобы уразуметь их.

PS:  Может быть конечно это от моей тупости /если в каких-то вопросах может быть и подхожу под определение - профи,
      то это скорее исключение из правила/.
      Вообщем для ламеров типа меня pls хорошую документацию.



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


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #783 - 14. Июня 2015 :: 15:09
Печать  
vladimirmir2012 писал(а) 14. Июня 2015 :: 07:38:
Не мне тебе объяснять сколько тонкостей нужно знать и понимать для того, чтобы полноценно использовать 1sqlite.

Даже не знаю... 99% тонкостей 1sqlite растут из самого языка sql и структуры баз 1С.
Тут вопрос то из 3х частей состоит. 1: howto по sql. 2: howto по структуре баз 1C. 3: howto по 1sqlite.
3й вопрос chm`ом по 1sqlite, мне так кажется, решен не плохо.
Ну да, модификаторы ~~~~~ периодически вводят в ступор, но это к п.2, который тут http://www.script-coding.com/v77tables.html неплохо разжеван. Можно, конечно, все примеры из script-coding`а переписать на sqlite, а толку то? Новичку без знания п.1 и п.2 это поможет слабо.


  
Наверх
www  
IP записан
 
vladimirmir2012
Senior Member
****
Отсутствует


1C++ rocks!

Сообщений: 426
Зарегистрирован: 18. Мая 2011
Re: 1sqlite
Ответ #784 - 14. Июня 2015 :: 16:08
Печать  
Djelf писал(а) 14. Июня 2015 :: 15:09:
3й вопрос chm`ом по 1, мне так кажется, решен не плохо.
Ну это обычное дело, что когда разберешься, то все так просто и ясно.
Вообщем то предлагал "разжевать" пункт 3 /именно по особенностям использования sqlite в 1С/.


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


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #785 - 14. Июня 2015 :: 17:38
Печать  
Ок. Выйдет 3.8.х с патчами для виртуальных таблиц, посмотрю на особенности (их должно стать поменьше), добавлю в chm что вспомню.
Ну там страничка/две же будет - не больше. Переводить 500+ страниц O`Reilly "Using sqlite" я не осилю  Нерешительный
  
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #786 - 18. Июня 2015 :: 12:42
Печать  
Ну вот и работоспособный 1sqlite 1.0.2.6 на движке 3.8.11 (из транка).

CTE это круто! Возможностей появляется огромное количество.
Тут хорошая статья по сте http://www.sqlbooks.ru/printarticle.aspx?part=02&file=sql200509

Пример
Код
Выбрать все
WITH cte(d) AS (VALUES(:НачДата) UNION ALL SELECT date(d,'+1 day') FROM cte WHERE d<:КонДата)
SELECT d [Дата $Дата] FROM cte
 


Выдаст таблицу дат для реализации "группировка даты все"

Только учтите - планировщик в 3.8.x совершенно другой!
Да 3.8 он был линейный, т.е. оценка времени происходила еще при подготовки какой то стадии оптимизации.
В 3.8 все стадии оптимизации сваливают свои оценки в одну кучу, а уже потом выбирается оптимальный путь выполнения запроса.
Статья по планировщику: http://habrahabr.ru/post/193238/
С таблицами sqlite все хорошо, на них можно натравить analyse, а вот с 1С`овскими все хуже - статистики попадания в индексы нет.




« Последняя редакция: 18. Июня 2015 :: 16:53 - Djelf »  

1sqlite_1026_3_8_11_a.7z ( 272 KB | Загрузки )
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #787 - 18. Июня 2015 :: 12:47
Печать  
А здесь во вложении пример построения дерева справочника номенклатура запросом cte.
Отображение в табличное поле поставщиком данных 1sqlite (насколько помню такого еще не было).
Работа с группами запросами sql, свертка групп с использованием cte.
На 1С кода получается заметно больше...

Картинку не привожу... дерево как дерево.
« Последняя редакция: 18. Июня 2015 :: 16:29 - Djelf »  

TreeCTE.7z ( 15 KB | Загрузки )
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite
Ответ #788 - 19. Июня 2015 :: 05:05
Печать  
Ага, потестим, спасибо.
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #789 - 20. Июня 2015 :: 11:35
Печать  
Подводный камень предсказуемости поведения разных версий 1sqlite.
многобукафок

Ну, например, надо посчитать количество коробок по реализациям в развозке (документ ходка).

Запрос №1
Код
Выбрать все
SELECT
	р.IDDOC [Реализация :Документ.Реализация],
	sum(р.Количество*р.Коэффициент/е.Коэффициент) as Коробки
FROM
	ДокументСтроки_Реализация as р
INNER JOIN (SELECT
		х.Накладная
		FROM ДокументСтроки_Ходка as х
		WHERE х.IDDOC=' 11WRO   ') as s
		ON s.Накладная = р.IDDOC
LEFT JOIN Справочник_Номенклатура as н ON р.Номенклатура = н.ID
LEFT JOIN Справочник_Единицы as е ON е.ID = н.ОсновнаяЕдиница
GROUP BY р.IDDOC 



Оптимизатор может сначала выбрать ходки, а потом реализации (что хотелось бы), а может все сделать наоборот.

1sqlite/sqlite - время
1.0.2.3/3.6.33 - 3мс
1.0.2.4/3.7.0 - 24000мс
1.0.2.6/3.7.10 - 24000мс
1.0.2.6/3.7.11 - 24000мс
1.0.2.6/3.7.17 - 3мс
1.0.2.6/3.8.11.b - 24000мс
1.0.2.6/3.8.11.1.bf0 - 3мc

И это несмотря на то, что стоимость у Ходок 36, а у Реализаций 40

Заменим в 2х строках LEFT JOIN на INNER JOIN, дадим оптимизатору порезвится!
Код
Выбрать все
INNER JOIN Справочник_Номенклатура as н ON р.Номенклатура = н.ID
INNER JOIN Справочник_Единицы as е ON е.ID = н.ОсновнаяЕдиница 



1sqlite/sqlite - время
1.0.2.3/3.6.33 - 3мс
1.0.2.4/3.7.0 - 45000мс
1.0.2.6/3.7.10 - 15000мс
1.0.2.6/3.7.11 - 16000мс
1.0.2.6/3.7.17 - 3мс
1.0.2.6/3.8.11.b - 647мс
1.0.2.6/3.8.11.1.bf0 - 550мc

Все стало еще непредсказуемее. А все потому, что в дело вступили еще два ограничения и оптимизатор может сначала пройти по номенклатуре потом по ходке, потом по реализации (1.0.2.6/3.8.11.b) или по номенклатуре, реализации и ходке (1.0.2.4/3.7.0)
Кстати если сделать фильтр по номенклатуре, то в этом запросе 1.0.2.6/3.8.11.1.bf0 победит всех в легкую!.

Заменим RIGHT JOIN на IN, это должно выправить мозги оптимизатору.
Код
Выбрать все
SELECT
	р.IDDOC [Реализация :Документ.Реализация],
	sum(р.Количество*р.Коэффициент/е.Коэффициент) as Коробки
FROM
	ДокументСтроки_Реализация as р
LEFT JOIN Справочник_Номенклатура as н ON р.Номенклатура = н.ID
LEFT JOIN Справочник_Единицы as е ON е.ID = н.ОсновнаяЕдиница
WHERE р.IDDOC IN
	(SELECT
		х.Накладная	 val
		FROM ДокументСтроки_Ходка as х
		WHERE х.IDDOC=' 11WRO   ')
GROUP BY р.IDDOC 



1sqlite/sqlite - время
1.0.2.3/3.6.33 - 1500мс
1.0.2.4/3.7.0 - 1500мс
1.0.2.6/3.7.10 - 1500мс
1.0.2.6/3.7.11 - 1500мс
1.0.2.6/3.7.17 - 3мс вычеркнут из за багов по IN
1.0.2.6/3.8.11.b - 3мс
1.0.2.6/3.8.11.1.bf0 - 3мc

Более предсказуемое поведение. Заметно, что до 3.7.17 нет оптимизации по IN.

Вот такая вот проблема в предсказуемости поведения запросов разных версий 1sqlite.

Чтения без индекса нет ни в одном из этих запросов, все эти запросы, во всех вариантах попадают в индекс, вот только перфразирую слегка: "Все говорят что смысл есть в индексе, но не многие знают в каком"  Смех

Победительем вышел 1.0.2.6/3.7.17, показавший во всех вариантах 3мс. Был снят с призового места, т.к. был уличен в багах по оптимизаии IN.

Уговорить 1.0.2.4/3.7.0-1.0.2.6/3.7.11 на 3мс не удалось (не совсем это правда, это сделать можно, добавив группировку по номенклатуре и засунув всю эту конструкцию как вложенный запрос, но это не красиво!).

Новый победитель 1.0.2.6/3.8.11.1.bf0

3.8.11 можно уговорить и через cte, но это не 3мс, а 5мс, что тоже не так плохо!
Код
Выбрать все
WITH  cte(Реализация, Номенклатура, Коробки) AS (
	SELECT
		х.Накладная,0,0
	FROM ДокументСтроки_Ходка as х
	WHERE х.IDDOC=' 11WRO   '

	UNION
	SELECT
		р.IDDOC as IDDOC,
		р.Номенклатура,
		sum(р.Количество*р.Коэффициент/е.Коэффициент) as Коробки
	FROM
		ДокументСтроки_Реализация as р
	INNER JOIN cte on cte.Реализация=р.IDDOC
	LEFT JOIN Справочник_Номенклатура as н ON р.Номенклатура = н.ID
	LEFT JOIN Справочник_Единицы as е ON е.ID = н.ОсновнаяЕдиница
)
SELECT
cte.Реализация [Реализация $Документ.Реализация],
cte.Коробки
FROM cte
WHERE cte.Номенклатура<>0
 



С 1.0.2.6/3.8.11.b надо сильно подумать!
Возможно нужно задействовать новое в 3.8.х, не заполняющееся поле (количество строк таблицы) при ответе выбора индекса.
Или (вариант максимум) сделать аналог analyse и хранить это в базе sqlite, но разумеется уже не в :memory: базе.

P.S. да, это дебильный запрос, с "умными" запросами дело обстоит несколько легче.
« Последняя редакция: 25. Сентября 2015 :: 08:36 - Djelf »  
Наверх
www  
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: 1sqlite
Ответ #790 - 22. Июня 2015 :: 07:19
Печать  
Прикрепите 1.0.2.6/3.7.17, чтоб не искать
Улыбка
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #791 - 22. Июня 2015 :: 08:35
Печать  
1.0.2.6/3.7.17
  

1sqlite_3_7_17_bf2.zip ( 307 KB | Загрузки )
Наверх
www  
IP записан
 
sava
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Февраля 2010
Пол: Мужской
Re: 1sqlite
Ответ #792 - 25. Июня 2015 :: 07:54
Печать  
1.0.2.6 / 3.8.11.0 - нелокализованный вылет 1с Память не может быть...
Появляется при нескольких открытиях/закрытиях формы "Дерево СТЕ"
и неопределенному количеству щелчков на таб. поле
срр - 3.2.3.16
формекс - 2.0.5.98.
С версией 1024 такого не наблюдалось
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 633
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #793 - 25. Июня 2015 :: 13:32
Печать  
sava писал(а) 25. Июня 2015 :: 07:54:
1.0.2.6 / 3.8.11.0 - нелокализованный вылет 1с Память не может быть...
Появляется при нескольких открытиях/закрытиях формы "Дерево СТЕ"
и неопределенному количеству щелчков на таб. поле
срр - 3.2.3.16
формекс - 2.0.5.98.
С версией 1024 такого не наблюдалось


Понятно что не наблюдалось, в ней cte то не было.
А так возможно... sqlite 3.8.11 из транка, надо было релиза дождаться, но не сдержался.

Попробовал с 1cpp 3.2.3.16 и formex 2.0.5.99, (2.0.5.98 не нашел) не упала пока...
1cpp грузится до formex? Два раза sqlite.dll случаем не пытается грузится?
Справочник большой? Сортировка строк может очень много памяти сожрать.
На выложенной обработке падает или что-то в ней менял?
По времени сколько заняло уронить? 1С падает сразу или перед этим задумывается?
А DEP отключен?
« Последняя редакция: 25. Июня 2015 :: 16:27 - Djelf »  
Наверх
www  
IP записан
 
sava
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 56
Зарегистрирован: 18. Февраля 2010
Пол: Мужской
Re: 1sqlite
Ответ #794 - 25. Июня 2015 :: 16:26
Печать  
Выложенная обработка. не менялось ничего.
Справочник - порядка 5000.
С загрузкой длл - порядок.
Падает сразу. Причина - не понятна - для повторения - несколько раз переоткрывал форму, потом несколько десятков раз щелчек мышью на ТП. - Пямять не может быть рид/рерайт....
Есть подозрение на поставщика. Поставил спп 3.2.4 - не помогло.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 51 52 [53] 54 55 ... 79
ОтправитьПечать