Имя: Пароль:
1C
1C 7.7
v7: 1sqlite одновременно условие на вхождение и невхождение - нормально?
,
0 palpetrovich
 
08.12.15
15:10
кусок кодика

    |WHERE isfolder=2 and ismark <> '*'
    |AND id in (select val from СписокТоваров)
    |AND id NOT in (select val from СписокИсключаемыхТоваров)

или лучше предварительно СписокТоваров очистить от СписокИсключаемыхТоваров?
1 varelchik
 
08.12.15
16:17
|AND
( id in (select val from СписокТоваров)
    |OR id NOT in (select val from СписокИсключаемыхТоваров))
2 Гёдза
 
08.12.15
16:21
можно и предварительно, но не факт что быстрее будет
3 palpetrovich
 
08.12.15
16:25
(1) а че OR-то?
4 orefkov
 
08.12.15
16:26
Зависит скорее всего от размера списка исключаемых товаров.
Скорее всего, особой разницы по времени выполнения не будет. Однако зависит еще и от версии sqlite. Вроде видел на 1С++ форуме - кто-то подхватил разработку и выпускает версии с более свежим sqlite.
5 palpetrovich
 
08.12.15
16:28
(3) + - вон оно че... не разобрался сразу :)
6 palpetrovich
 
08.12.15
16:29
(4) список исключаемых товаров, конечо, будет поменьше списка товаров ...но про точный размер никто заранее не скажет   :)
7 orefkov
 
08.12.15
16:30
(5)
to be or not to be :)
8 Абыр
 
08.12.15
16:45
(0) "авторский" 1sqlite, емнип, не использует индекс для in
9 palpetrovich
 
08.12.15
16:47
(8) и что? не заморачиваться с 1sqlite? решать методами 1с?

вообще говоря я, скорее всего, гланды рву через ж. :)

тут я получаю СписокИсключаемыхТоваров
    текст="SELECT
    |ParentExt [Владелец :Справочник.Отделы],    
    |Спр.Товар [Товар :Справочник.Номенклатура]
    |FROM [Справочник.ТоварыПоОтделам] Спр
    |WHERE ismark <> '*'
    |AND ParentExt in СписокОтдел
    |Group by ParentExt, Спр.Товар";

а тут уже его использую

    текст="SELECT
    |id [Товар :Справочник.Номенклатура],
    |code Код
    |FROM Товары
    |WHERE isfolder=2 and ismark <> '*'
    |AND id in (select val from СписокТоваров)
    |AND id NOT in (select val from СписокИсключаемыхТоваров)";

наверное это можно сделать в одном запросе?
10 orefkov
 
08.12.15
16:55
(8)
Не "авторских 1sqlite не использует", а "sqlite для виртуальных таблиц не использует" :)
Чтобы использовал, надо запрос переписывать:
select ... from СписокТоваров left join Справочник_Номенклатура on val=id
Правда, не всегда использование индекса оправдано в этом случае. Если список большой - проще раз по таблице пробежаться и проверить вхождение в список, чем кучу раз по индексу скакать.
11 Гёдза
 
08.12.15
17:08
(10) а что оптимизатора в склайт нет? )))
12 orefkov
 
08.12.15
17:11
(11)
Есть. Но для своих таблиц. А к 1Совским он через механизм "виртуальных таблиц" стучится, которые менее оптимизируемы.
Собственно, sqlite совершенно ничего не знает ни про дбф, ни про индексы к нему. Это моя компонента обеспечивает.
13 orefkov
 
08.12.15
17:12
14 Абыр
 
08.12.15
17:55
(10) доработанный Djelf'ом уже использует, но там и движок унутре уже другой версии)
(9) как уже написали, можно загонять список в отдельную таблицу и делать джойн
15 Djelf
 
09.12.15
19:11
(4) Да, пытаюсь обновлять до текущей версии.
Низкий поклон за открытый код! Сделанный объем работ для прикручивания к 1с просто ужасает. Внешние базы sqlite прямо панацея для файловой 7ки в случаи всяких интеграций, не знаю как бы я по другому выкручивался!

(0) С in поаккуратнее, он нормально работает только на движке sqlite 3.8.+, на движке 3.7.17 как оказалось глючит, а на более старых версиях тормоза почти обеспечены т.к. индекс не использует.

Дал бы ссылки, но ветка на 1с++ по sqlite сломалась, и пароль тоже сломался и не приходит на newmail.ru.
16 Djelf
 
09.12.15
19:43
Вот последняя моя сборка на движке sqlite 3.8.11.1  https://cloud.mail.ru/public/CYZn/cSN7ivTNe
Там пара микрофиксов к 1sqlite (типизация неопределенного значения длиной 23, и что то еще), и слегка изменен планировщик 1sqlite для более адекватного поведения в 3.8.11
Но если 1sqlite 1.0.2.4 работает, то лучше не трогать ;)

Планировщик в 3.8.11+ иногда строит безумные планы запросов.
Это решаемо, но разница в скорости может быть в 100-1000 раз.

P.S. 3.8.11+ потому что в 3.8.0 был сломан планировщик для виртуальных таблиц (читаем таблиц 1с), а в 3.8.11 его починили.
17 Злопчинский
 
09.12.15
20:12
(16) Спасибо за поддержание допрасширений клюшек! как бы мы без них..
18 orefkov
 
09.12.15
22:34
(15)
Тебе спасибо!
Всегда радует, что хоть кто-то смог разобраться в твоем коде :) А то иногда сам через пол-года уже не понимаешь, что написал.