Переключение на Главную Страницу Страницы: 1 ... 57 58 [59] 60 61 ... 79 ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 456723 )
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: 1sqlite
Ответ #870 - 27. Января 2017 :: 17:44
Печать  
Djelf, не помогают новые сборки с выводом числа 10.0. Добавил реквизит в справочник число 10.0 и при любом варианте запросов, которые ты приводил на мисте http://www.forum.mista.ru/topic.php?id=774403#28

и cast() не помогает.

Пробовал разные релизы и 3.8.11, и 3.14, и 3.15. На 3.7.17 понятное дело тоже не работает.

Релиз вывожу методом sqlite_version().

запрос простой, вывод этого реквизита всех элементов.

Просто вывод cast(2222222222 as double) работает нормально.

Что еще можно попробовать?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 631
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #871 - 27. Января 2017 :: 18:36
Печать  
А я то, дурачина, проверяю
Код (SQL)
Выбрать все
SELECT -9223372036854775808,9223372036854775807 


Сейчас гляну где.

3.7.х сильно нужна?

upd1: нашел где, потребуется некоторое время чтобы скорость не пострадала.
upd2: исправлено в 3.16.2.14 https://cloud.mail.ru/public/9znr/ZJ6ULE9aR скорость вроде не упала.

В принципе можно раскачать до +18446744073709551615 это больше длины числового поля в справочнике, но это только в 3.16 появилось.
« Последняя редакция: 27. Января 2017 :: 22:22 - Djelf »  
Наверх
www  
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: 1sqlite
Ответ #872 - 30. Января 2017 :: 08:46
Печать  
Отлично! Спасибо, Djelf! Теперь работает!

Да, конечно, 3.7 не критично.
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 631
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #873 - 25. Февраля 2017 :: 20:21
Печать  
Экспериментальная версия с возможностью отключения блокировки записи таблиц при запросах в транзакции.
Боятся ее не стоит, по-умолчанию все работает как раньше.

Суть в чем, 1sqlite при выполнении запроса и использовании свойства ВыполнятьВТранзакции блокирует используемые таблицы 1С на запись.
Но мы же ничего туда не пишем! Но уж так 1с и dbeng32 работает.
Этот механизм удалось обмануть, получился аналог хинта (nolock), Запрос читает в ВыполнятьВТранзакции  медленнее, зато не блокирует запись всем остальным пользователям, а это очень важно при длительных запросах.

* 1sqlite 3.16.2.15
+ SQLiteBase добавлено свойство LockingMode=<Режим> РежимБлокировки=<Режим>
<Режим> - метод блокировки таблиц и вызова транзакций, битмаска
0х00 - по умолчанию, блокировки как в оригинале. блокировка таблиц запроса на запись, транзакции вручную перед запросом;
0х01 - блокировка на запись не ставится
0х10 - транзакции автоматически
т.е.
0 - по умолчанию, блокировки как в оригинале. блокировка таблиц запроса на запись, транзакции вручную перед запросом;
1 - блокировка на запись не ставится, транзакции вручную перед запросом;
2 - ставится блокировка на запись, транзакции принудительно;
3 - блокировка на запись не ставится, транзакции принудительно;

Там же https://cloud.mail.ru/public/9znr/ZJ6ULE9aR

Выглядит это как то так в не монопольном режиме
SELECT count(*) FROM Регистр_ПартииНаличие

режим 0
без транзакции - 29с
с транзакцией и блокировкой на запись регистра - 1с
режим 3 - 6с, но запись в таблицы возможна

6с не идеально, но это плата за компромисс балансировки чтения/записи.

P.S. рассмотрен один из самых плохих вариантов запроса, на мелких и точечных запросах разница почти не заметна, но все таки есть и в положительную сторону.

Может стоит добавить и Запросу такое же свойство, чтобы гибко переопределять режим?
« Последняя редакция: 26. Февраля 2017 :: 20:17 - Djelf »  
Наверх
www  
IP записан
 
nicesc
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 52
Зарегистрирован: 13. Июня 2009
Пол: Мужской
Re: 1sqlite
Ответ #874 - 27. Февраля 2017 :: 06:17
Печать  
Djelf писал(а) 25. Февраля 2017 :: 20:21:
Экспериментальная версия с возможностью отключения блокировки записи таблиц при запросах в транзакции.

После установки флага "РежимБлокировки" сбросить его не получается.
И время выполнения запроса увеличивается.
Без флага: 0.17
С флагом 0: 0.17
при любом флаге > 0: 0.9
скидываем флаг в 0: 0.9
  
Наверх
 
IP записан
 
nicesc
Junior Member
**
Отсутствует


1C++ rocks!

Сообщений: 52
Зарегистрирован: 13. Июня 2009
Пол: Мужской
Re: 1sqlite
Ответ #875 - 27. Февраля 2017 :: 07:03
Печать  
Потестил новый двиг(3.16.2) на некоторых запросах и пришел к выводу, что он так и не полюбил IN.
Время работы запроса: 0.897 секунд (3.16.2)
Время работы запроса: 0.044 секунд (dll 1.0.23 не помню на каком движке)
приводит к проблемам строка из запроса: $док.Номенклатура in спсНом
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 631
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #876 - 27. Февраля 2017 :: 08:28
Печать  
1. Сброс флага сделаю.
Пока сброс пересозданием объекта SQLiteBase.
Поправил обработку флагов РежимБлокировки
1sqlite 3.16.2.16 https://cloud.mail.ru/public/9znr/ZJ6ULE9aR
Режимы 0 и 1 без транзакции по скорости почти не отличаются.
Я предупреждал что время в транзакции увеличится. Зато нет блокировки. И без вопросов читает "заблокированные" таблицы в которые в этот же момент что-то записывается.
Важно проверить 3й режим. Не вылезет ли что странное, кроме падения скорости в транзакции.
Смысл в этом есть. Например у меня есть запрос который выполняется 70с без транзакции и захватывает кучу таблиц. Я же не могу блокировать базу на 70с. А с 3м вариантом я ничего не блокирую, а запрос выполняется за 16с. А монопольно 13с.

2. in отключается плюсом это не большая проблема
$док.Номенклатура in спсНом это ПрямойЗапрос? в нем +$док кажется
А в чем проблема? Вроде только замедления могут быть при большом размере списка.
Все это потому что при попадании в индекс по in идет сканирование таблицы столько раз сколько элементов в списке.
За это я in и не люблю, он коварный Подмигивание
« Последняя редакция: 27. Февраля 2017 :: 19:11 - Djelf »  
Наверх
www  
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 631
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #877 - 28. Февраля 2017 :: 08:09
Печать  
Эх... фокус не получился ;(
В некоторых случаях лезет codebase 110 unlocking files
Попробую изолировать
  
Наверх
www  
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3046
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #878 - 28. Февраля 2017 :: 08:31
Печать  
факир был пьян и фокус не удался ))
  

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


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 631
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #879 - 28. Февраля 2017 :: 11:07
Печать  
trad писал(а) 28. Февраля 2017 :: 08:31:
факир был пьян и фокус не удался ))

не, не, не...  последовательность действий была обратная Подмигивание

Как бы тест понадежнее нарисовать...
Сейчас в одной сессии молотится на запись справочник партии в пакетах транзакций, в другой запрос из справочника в 3м режиме - ошибки нет
В каком сочетании условий 210 выскочила не понятно стало понятно.
Со справочниками все ок, таблицы документов и журнал как то по другому блокируются. Видимо, несмотря на снятие флага, блок ставится, причем на часть файла, а вот при снятии блока идет учет флага и ой все...
Откатил до 3.6.2.14, но пока не отказываюсь от идеи (слишком вкусно) эксперимент продолжаются.
« Последняя редакция: 28. Февраля 2017 :: 19:29 - Djelf »  
Наверх
www  
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: 1sqlite
Ответ #880 - 02. Марта 2017 :: 13:35
Печать  
Интересно, а можно будет доработать 1sqlite добавлением метода УложитьИТЗ или доработкой метода УложитьОбъекты, чтобы первым параметром принимала не только СписокЗначений, но и ИТЗ?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 631
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #881 - 02. Марта 2017 :: 18:39
Печать  
alyuev писал(а) 02. Марта 2017 :: 13:35:
Интересно, а можно будет доработать 1sqlite добавлением метода УложитьИТЗ или доработкой метода УложитьОбъекты, чтобы первым параметром принимала не только СписокЗначений, но и ИТЗ?

Ты же сам знаешь, сделать можно все. Это только вопрос времени.
Мне вообще хочется избавится от выгрузки/укладки чтобы писать в стиле
select * from [ТаблицаЗначений.ТабКонтекста]
В sqlite такое можно сделать.
Но вот как нормально работать с id4/9/13/23 в таких запросах я пока не понимаю/не придумал.

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


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: 1sqlite
Ответ #882 - 28. Апреля 2017 :: 14:23
Печать  
Djilf, можешь подсказать на счет использования IN в запросе:

Код (SQL)
Выбрать все
Select
 StatS.Partner As [Клиент:Справочник.Клиенты]
From
 (Select
  Рег.Поставщик As Partner
 From
  Регистр_ОборотыСпец As Рег
 Where
  Date between '20161201' And '20161231'
 Group by Partner) As StatS
Where
 StatS.Partner In (
  Select
   Substr(Клиент_,5)
  From
   (Select
    ПН.Клиент As Клиент_,
    Дог.ПериодСчетов As Период
   From
    __1S_CRDOC As Отбор
   Inner Join
    Журнал on Журнал.IDDOC = Отбор.ChildID
   Inner Join
    Документ_ПриходнаяНакладная As ПН on ПН.IDDOC = Журнал.IDDOC
   Left Join
    Документ_Договор As Дог On Substr(ПН.Заказ,5)=Дог.IDDOC
   Where
    MDID=:ГрафаОтбора.КлиентПриходных
    And PARENTVAL = 'B1' || :ВидСправочника.Клиенты || StatS.Partner
    And Журнал.iddocdef=:ВидДокумента.ПриходнаяНакладная
    And Журнал.Closed = 1
    And ПН.Направление=:БазНапр
   Order by Отбор.Idx_MDID_PARENTVAL_CHILDDATE_CHILDTIME_CHILDID desc--последний договор партнёра
   Limit 1) As АктуальныйДоговор
  Where
   АктуальныйДоговор.Период=2
  )
Order by Cli.Descr 



Если выполнить отдельный подзапрос, тот, что в IN (начинается с StatS.Partner In ), он выполняется, скажем, за 7 секунд для одного клиента. А вот когда запустить весь запрос, то время выполнения похоже начинает исчисляться часами.

Это стало актуально после перехода на последнюю твою версию 3.16.2. До этого данный запрос работал на версии с sqlite 3.7.17 - и весь запрос целиком выполнялся приблизительно за минуту.

Что-то изменилось в поведении IN в запросе?

Если в этом запросе IN заменить на = (т.к. там Limit 1 используется), то ничего не меняется.....
« Последняя редакция: 28. Апреля 2017 :: 19:30 - alyuev »  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 631
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #883 - 28. Апреля 2017 :: 15:34
Печать  
Попробуй заменить where StatS.Partner In (
на where +StatS.Partner In (
По Partner же есть отбор?

Предполагаю что дурной план генерится. Т.е. для каждой строки в "in (select" выбираются записи из StatS, а limit может не помогать, а ломать мозх оптимизатору пункт 10 в http://translate.google.ru/translate?u=https%3A//sqlite.org/optoverview.html&hl=... и это уже совсем другая причина и другой план запроса.

А запрос в in отдельно сколько времени занимает?
Там же    Inner Join Журнал on Журнал.IDDOC = Отбор.ChildID
Тут sqlite может сначала просканировать весь журнал, и только потом отборами занятся.
План надо смотреть, последовательно выборки из таблиц....

А на журнал почему нет ограничения по дате? Ты же клеишь к  Регистр_ОборотыСпец, а на него есть ограничение. Вроде как не должно ничего пропасть если и на журнал по дате фильтр поставить.

И с индексами надо осторожно, сама 1с тоже этим страдает, например
Остаток      = Регистр.ПартииНаличие.СводныйОстаток(Фирма,,Товар,,Партия,,,0,"Количество");
Тормозит адски, а без партии и фирмы все отлично.
Если перевести это в sqlite тоже самое будет, поэтому я +`ами подавляю лишние индексы чтобы попасть на короткий PERIOD,SP331(Номенклатура) и запрос получается раз в 10-100 быстрее.
  
Наверх
www  
IP записан
 
alyuev
God Member
*****
Отсутствует


Гражданин Вселенной

Сообщений: 850
Местоположение: Одесса
Зарегистрирован: 07. Декабря 2007
Пол: Мужской
Re: 1sqlite
Ответ #884 - 04. Мая 2017 :: 19:56
Печать  
Кратко:

Помог + здесь:
Код (SQL)
Выбрать все
And +Журнал.iddocdef=:ВидДокумента.ПриходнаяНакладная 



Подробно:

В запросе выше пропущена строка после As StatS
Код (SQL)
Выбрать все
Inner Join Справочник_Клиенты As Cli On Cli.ID = StatS.Partner 


Отбора нет, партнёры выбираются из регистра и передаются в подзапрос в IN

план на старой библиотеке
Explain Query Plan:
                 Selectid
                 
                 Order
                 
                 From
                 
                 Detail
                 
                 1
                 
                 SCAN TABLE Регистр_ОборотыСпец AS Рег VIRTUAL TABLE INDEX 1:DATETIME; 14 !&quot; 0?b 6O?!%k8 (~0 rows)
                 
                 1
                 
                 USE TEMP B-TREE FOR GROUP BY
                 
                 SCAN SUBQUERY 1 AS StatS (~50 rows)
                 
                 EXECUTE CORRELATED LIST SUBQUERY 2
                 
                 3
                 
                 0
                 
                 SCAN TABLE __1S_CRDOC AS Отбор VIRTUAL TABLE INDEX 1:PARENT; 13 !&quot; 0p .!%?dj?, ! (~0 rows)
                 
                 3
                 
                 1
                 
                 1
                 
                 SCAN TABLE Журнал VIRTUAL TABLE INDEX 0:IDDOC; 20 ! 0p nHy$40D &quot;&#39;(A @, Q (~0 rows)
                 
                 3
                 
                 2
                 
                 2
                 
                 SCAN TABLE Документ_ПриходнаяНакладная AS ПН VIRTUAL TABLE INDEX 0:ID; 15 ! 0p nHy$40?# Q 2 ` ` (~0 rows)
                 
                 3
                 
                 3
                 
                 3
                 
                 SCAN TABLE Документ_Договор AS Дог VIRTUAL TABLE INDEX 0:ID; 10 ! 0p nHyd! kM (~0 rows)
                 
                 2
                 
                 SCAN SUBQUERY 3 AS АктуальныйДоговор (~1 rows)
                 
                 1
                 
                 1
                 
                 SCAN TABLE Справочник_Клиенты AS Cli VIRTUAL TABLE INDEX 0:IDD; 10 ! 0p nHyd!0?) Q (~0 rows)
                 
                 USE TEMP B-TREE FOR ORDER BY
                 

план на новой библиотеке
Explain Query Plan:
                 Selectid
                 
                 Order
                 
                 From
                 
                 Detail
                 
                 1
                 
                 SCAN TABLE Регистр_ОборотыСпец AS Рег VIRTUAL TABLE INDEX 1:DATETIME; 14 !&quot; 0
                 
                 1
                 
                 USE TEMP B-TREE FOR GROUP BY
                 
                 SCAN SUBQUERY 1 AS StatS
                 
                 EXECUTE CORRELATED LIST SUBQUERY 2
                 
                 3
                 
                 0
                 
                 1
                 
                 SCAN TABLE Журнал VIRTUAL TABLE INDEX 3:DOCTYPE; 15 !&amp; 0p nHy(&lt;@$! Q (A @,`Y
                 
                 3
                 
                 1
                 
                 SCAN TABLE __1S_CRDOC AS Отбор VIRTUAL TABLE INDEX 0:CHILD; 16 ! 0p .!%
                 
                 3
                 
                 2
                 
                 2
                 
                 SCAN TABLE Документ_ПриходнаяНакладная AS ПН VIRTUAL TABLE INDEX 0:ID; 15 ! 0p nHy$40
                 
                 3
                 
                 3
                 
                 3
                 
                 SCAN TABLE Документ_Договор AS Дог VIRTUAL TABLE INDEX 0:ID; 10 ! 0p nHyd!0
                 
                 3
                 
                 USE TEMP B-TREE FOR ORDER BY
                 
                 2
                 
                 SCAN SUBQUERY 3 AS АктуальныйДоговор
                 
                 1
                 
                 1
                 
                 SCAN TABLE Справочник_Клиенты AS Cli VIRTUAL TABLE INDEX 0:IDD; 10 ! 0p nHyd! %k8
                 
                 USE TEMP B-TREE FOR ORDER BY
                 


И таки да, видно, что изменился порядок опроса таблиц:
Сначала первой шла таблица отборов по индексу графы отбора КлиентПриходных, затем журнал,
а теперь сначала журнал по виду документа, затем отборы
соответственно запрос по одному клиенту

Код (SQL)
Выбрать все
Select
	ПН.Клиент As Клиент_,
	Дог.ПериодСчетов As Период
From
	__1S_CRDOC As Отбор
Inner Join
	Журнал on Журнал.IDDOC = Отбор.ChildID
Inner Join
	Документ_ПриходнаяНакладная As ПН on ПН.IDDOC = Журнал.IDDOC
Left Join
	Документ_Договор As Дог On Substr(ПН.Заказ,5)=Дог.IDDOC
Where
	MDID=:ГрафаОтбора.КлиентПриходных
	And PARENTVAL = 'B1' || :ВидСправочника.Клиенты || :Клиент
	And Журнал.iddocdef=:ВидДокумента.ПриходнаяНакладная
	And Журнал.Closed = 1
	And ПН.Направление=:БазНапр
Order by Отбор.Idx_MDID_PARENTVAL_CHILDDATE_CHILDTIME_CHILDID desc--последний договор партнёра
Limit 1
 



отрабатывает 0,1 – 0,2 сек на старой библиотеке и ~ 7 сек на новой
на журнал нет ограничений по дате т.к. ищем последний документ в журнале неважно когда он был и из него берём Заказ
Можно ли как-то явно указать какой индекс использовать первым без плюсов ?
  

1C 7.7.025; 1C++ 3.2.4.3; Formex 2.0.5.94; 1sqlite
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 57 58 [59] 60 61 ... 79
ОтправитьПечать