Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 64549 )
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
1sqlite
20. Октября 2007 :: 04:52
Печать  
Тема просто выливается из http://www.1cpp.ru/forum/YaBB.pl?num=1192437970, так как это уже не идея, а нечто воплощающееся.
Итак, что же из этого в итоге должно получится.
ВК, которая позволяет из 1С удобно работать с базами SQLite.
Также в dbf версии 1С она будет позволять в базах SQLite обращатся к таблицам 1С через "родные" методы движка 1С (dbeng32.dll), то бишь аналог работы с SQL базами 1С в "родном" соединении. Соответственно, это позволит выполнять запросы к дбф базе и в монопольном режиме.

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



Версия 1.0.0.4

Может:
- выполнять запросы к базам SQLite в дбф и скл базах 1С.
- отображать справочники 1С в базу SQLite в дбф базах 1С.
- параметризировать запросы SQLite значениями типа строка, число.
- Пытается использовать индексы при работе с таблицами 1С.
  Вот это надо особо протестить.

Не может:
- Типизировать результат выполнения запроса в агрегатные типы 1С.
- Устанавливать текстовые (подставляемые) параметры.

Исправлена ошибка сравнения полей.
Например, при сравнение where descr < 'Б'
попадало все до 'В'

Приложена ертшка, типа для тестирования запросов к базе из SQLite.
Кнопка "Подключаемые справочники" позволяет выбрать, какие справочники
отображать в базу SQLite. Имена таблиц справочников в базе SQLite
равны идентификатору справочника.
Флажок "План выполнения" заставляет SQLite не выполнять запрос, а вернуть
код программы движка VDBE для выполнения запроса.
Подробнее см. на http://www.sqlite.org/vdbe.html


Исправлено 26.10.2007

Версия 1.0.0.5
Пофиксены баги, найденные kms'ом и другими.
Ускорена работа с индексами.
Просьба затестить.
Особенно условия в where, join.
Как реагирует на order by.


29.10.2007

Версия 1.0.0.6
Очередное исправление работы с индексами.
Пофиксены косяки с формированием ключей (не ручаюсь, что все).
Устранен косяк при использовании одной таблицы несколько раз в запросе (join сам с собой).
Убран БОЛЬШОЙ косяк при left join.
Доработки в тестовой обработке.


29.10.2007

Версия 1.0.0.7
Очередное исправление работы с индексами.
В одном месте строки сравнивались регистрозависимо, что могло приводить к неверным результатам.
Добавлено подключение Журнала, документов, регистров (см. код обработки)
Доработки в тестовой обработке.


31.10.2007

Версия 1.0.0.8
Движок SQLite пропатчен на предмет регистронезависимости. Регистронезависимость теперь работает для всех символов, не только для латинских.
Соответственно, LIKE теперь нормально ищет в русских строках.
lower, upper также работают правильно.
Пофиксены мелкие досадные баги.
Строки отдаются движку SQLite и получаются от него через utf8, вместо utf16, что несколько быстрее.
Доработки в тестовой обработке.


01.11.2007

Версия 1.0.0.9
Устранен БАГ при подборе индекса сорировки.
Мелкие улучшения.
Доработки в тестовой обработке.

« Последняя редакция: 01. Ноября 2007 :: 14:11 - orefkov »  

1_001.ZIP ( 184 KB | Загрузки )
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #1 - 20. Октября 2007 :: 05:00
Печать  
Хочу пояснить по использованию индексов 1С.
Движок SQLite ничего не знает ни про какие 1С, он знает только адреса функций моего модуля, который я регистрирую в нем.
Когда SQLite компилирует запрос, он вызывает мою функцию xBestIndex, передавая мне информацию, по каким полям какие условия присутствуют.
Тут уж я должен исходя из переданной информации САМ решить, какой индекс использовать. И когда SQLite вызовет мою функцию xFilter и далее xNext, работать с выбранным индексом.
То есть мне предстоит решить задачу о подборе оптимального индекса.
Чем я сейчас и займусь.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #2 - 20. Октября 2007 :: 07:32
Печать  
Саш, а зачем в курилке-то?
Теме прямая дорога в раздел Прямые запросы.
ИМХО и нужно дать ей статус прикрепленной ветки, тема очень полезная.

Федор, перенеси, плиз, ветку!
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #3 - 20. Октября 2007 :: 07:44
Печать  
В ДБФ версии у 1С крайне редко встречаются "чистые" индексы по полям (исключение - Id
в справочниках и Iddoc d 1SJourn) В основном идет строковое сложение
типа
Код
Выбрать все
DTOS(date)+time+iddoc 

(http://www.1cpp.ru/forum/YaBB.pl?num=1184317705)


Такие индексы возможно будет использовать?
Особенно интересуют соединения JOIN - в Fox е не удалось сделать это эффективно
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #4 - 20. Октября 2007 :: 09:00
Печать  
kiruha писал(а) 20. Октября 2007 :: 07:44:
В ДБФ версии у 1С крайне редко встречаются "чистые" индексы по полям (исключение - Id
в справочниках и Iddoc d 1SJourn) В основном идет строковое сложение
типа
Код
Выбрать все
DTOS(date)+time+iddoc 

(http://www.1cpp.ru/forum/YaBB.pl?num=1184317705)


Такие индексы возможно будет использовать?
Особенно интересуют соединения JOIN - в Fox е не удалось сделать это эффективно

Да, я планирую сделать "виртуальные" поля в таблицах, представляющие индексы.
То есть каждый составной индекс в таблице будет дополнительным полем в таблице SQLite, представляющей таблицу 1С.
примерно как бы так представляю себе:

select ... from Журнал where Журнал.DATE_TIME_IDDOC >= make_key(:Дата, :Время)

То бишь для операций сравнения с этим виртуальным полем используется составной ключ.
Это позволит более гибко управлять использованием индексов в запросе, а также в дальнейшем создать эффективного поставщика данных табличного поля.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #5 - 20. Октября 2007 :: 09:23
Печать  
orefkov

1. Будет ли реализована в том же ключе работа с какими-либо другими виртуальными таблицами?
Прежде всего интересует самый простой случай - с обычными тз.
Есть ли такие планы?


2. И что-то я не понял, виртуальные таблицы позволяют по ним строить родные индексы SQLITE, или нет?
Типа вот так (практический смысл для 1С-таблиц не рассматриваем):
Код
Выбрать все
	запрос.ВыполнитьЗапрос("create virtual table Nom using dbeng(Справочник.Номенклатура)");
	запрос.ВыполнитьЗапрос("create index i_nom on Nom(descr)");
	тз = запрос.ВыполнитьЗапрос("select * from Nom order by descr");
 


В документации не вижу препятствий, однако же индекс не строится.

Вопрос 2 снимается
http://www.sqlite.org/cvstrac/wiki?p=VirtualTables

3. Обработка ошибок будет?

4. Какая планируется лицензия?

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

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #6 - 21. Октября 2007 :: 06:36
Печать  
kms писал(а) 20. Октября 2007 :: 09:23:
orefkov

1. Будет ли реализована в том же ключе работа с какими-либо другими виртуальными таблицами?
Прежде всего интересует самый простой случай - с обычными тз.
Есть ли такие планы?

В силу того, что по виртуальныи таблицам сам SQLite не может строить индексы, полагаю, что отображать в него ТЗ особого смысла не имеет. Гораздо прикольнее будет реализовать выгрузку ТЗ в таблицу SQLite на С++, вызовом одного метода из 1С. А потом SQLite что хочешь с ней будет делать.

kms писал(а) 20. Октября 2007 :: 09:23:
3. Обработка ошибок будет?

А куда ж без нее?

kms писал(а) 20. Октября 2007 :: 09:23:
4. Какая планируется лицензия?

GPL естественно. Так как с CVS я в последнее время не работаю, а только с SVN, то наверное, проект захостю на гугле.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #7 - 21. Октября 2007 :: 15:21
Печать  
orefkov писал(а) 21. Октября 2007 :: 06:36:
kms писал(а) 20. Октября 2007 :: 09:23:
4. Какая планируется лицензия?

GPL естественно. Так как с CVS я в последнее время не работаю, а только с SVN, то наверное, проект захостю на гугле.

А вот это здорово! Улыбка Значит, твой опыт по ковырянию dbeng32 будет доступен другим людям. Улыбка Соответственно, кто-нибудь со временем сможет спортировать 1С на что-нибудь типа Оракла (интересно было бы проверить, так ли он будет крут в случае 1С  Очень довольный)

PS. На sf.net тоже SVN есть. (А уж сервисов там... вообще до хрена.)
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #8 - 21. Октября 2007 :: 19:19
Печать  
orefkov писал(а) 21. Октября 2007 :: 06:36:
kms писал(а) 20. Октября 2007 :: 09:23:
4. Какая планируется лицензия?

GPL естественно. Так как с CVS я в последнее время не работаю, а только с SVN, то наверное, проект захостю на гугле.

Действительно, здорово. Улыбка
Вопросов больше нет. Улыбка
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #9 - 22. Октября 2007 :: 08:52
Печать  
orefkov писал(а) 21. Октября 2007 :: 06:36:
Гораздо прикольнее будет реализовать выгрузку ТЗ в таблицу SQLite на С++, вызовом одного метода из 1С. А потом SQLite что хочешь с ней будет делать.

Будет ли сделана выгрузка Запроса 1с в в таблицу SQLite на С++  (как для 1с dbf так и 1с sql)?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #10 - 23. Октября 2007 :: 04:51
Печать  
Z1 писал(а) 22. Октября 2007 :: 08:52:
orefkov писал(а) 21. Октября 2007 :: 06:36:
Гораздо прикольнее будет реализовать выгрузку ТЗ в таблицу SQLite на С++, вызовом одного метода из 1С. А потом SQLite что хочешь с ней будет делать.

Будет ли сделана выгрузка Запроса 1с в в таблицу SQLite на С++  (как для 1с dbf так и 1с sql)?

Скорее всего да. Только зачем?
  
Наверх
 
IP записан
 
varelchik
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 788
Зарегистрирован: 22. Мая 2006
Re: 1sqlite
Ответ #11 - 23. Октября 2007 :: 06:02
Печать  
А как на счет описания?
Я в архиве нашел только dll и ert.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #12 - 23. Октября 2007 :: 07:06
Печать  
orefkov писал(а) 23. Октября 2007 :: 04:51:
Z1 писал(а) 22. Октября 2007 :: 08:52:
orefkov писал(а) 21. Октября 2007 :: 06:36:
Гораздо прикольнее будет реализовать выгрузку ТЗ в таблицу SQLite на С++, вызовом одного метода из 1С. А потом SQLite что хочешь с ней будет делать.

Будет ли сделана выгрузка Запроса 1с в в таблицу SQLite на С++  (как для 1с dbf так и 1с sql)?

Скорее всего да. Только зачем?

Чтобы можно было Работающий запрос 1с выгрузить в sqlite таблицу ( не виртуальная
бд в памяти )
Далее работать с sqlite таблицей аналогично как с ТаблицейЗначений.
Сортировка ,свертка , выборка должны работать быстрее чем с ТЗ.
Может это и промежуточная цель и она будет не нужна, если полностью получиться subj, но как то без индексов на вирт. таблице тоскливо по тестам по одному большому справочнику (64 000 строк) (выборка одной строки гораздо медлеyней ole db).
  
Наверх
 
IP записан
 
xilian
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 1
Зарегистрирован: 23. Октября 2007
Re: 1sqlite
Ответ #13 - 23. Октября 2007 :: 13:25
Печать  
Гм, где-то такая шутка валялась. Но в редакции для КПК. Использовалась для загрузки справочников/остатков в терминалах.  Но 1с-вские данные она не понимает .
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #14 - 23. Октября 2007 :: 18:01
Печать  
Вот подумалось...
Если посмотреть с точки зрения пользователя, то было бы очень хорошо, если бы не пришлось переделывать существующие запросы для OLE DB. А то ведь как получается? Для OLE DB:
Код
Выбрать все
SELECT * FROM $Справочник.Номенклатура 


Для 1sqlite:
Код
Выбрать все
SELECT * FROM Номенклатура 


Нельзя ли сделать так, чтобы в 1sqlite было так, как в OLE DB? В принципе, наверное, можно прогонять запросы через метапарсер и тогда будет получаться что-то в этом роде:
Код
Выбрать все
SELECT * FROM sc55 


Т.е., по сути достаточно виртуальные таблицы в SQLite подвешивать к реальным именам таблиц в 1С. Ну и аналогично для реквизитов. У тебя, похоже, реальные имена вылезают, поэтому запросы вида
Код
Выбрать все
SELECT sp3433 FROM sc55 

работать не будут...

Конечно, понятно, что некоторые вещи (типа CREATE CURSOR) в SQLite не заработают. Но, наверное, ведь можно как-то сократить объем переделок (а в некоторых случаях количество переделок свести к нулю)...
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #15 - 24. Октября 2007 :: 04:38
Печать  
Я уже думал над этим, когда писал оболочку для тестирования.
Там у меня окошко для ввода текста запроса, и кнопочка "Выполнить".
Так пришлось по этой причине пока отказаться от запуска запроса на OLE DB.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #16 - 24. Октября 2007 :: 04:59
Печать  
Вопрос знатокам индексов dbf файлов.
Сравниваю индексы в dd и в dds.
Справочники:
В sql есть индекс:
PARENTID,ISFOLDER,DESCR,ROW_ID - можно использовать как уникальный ключ для поставщика данных ТП.
В дбф:
PARENTID,ISFOLDER,DESCR(UPPER) - получается, нельзя использовать как уникальный ключ записи?
Или таки в дбф-индексы всегда неявно входит номер записи?
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #17 - 24. Октября 2007 :: 05:10
Печать  
orefkov писал(а) 24. Октября 2007 :: 04:59:
Вопрос знатокам индексов dbf файлов.
Сравниваю индексы в dd и в dds.
Справочники:
В sql есть индекс:
PARENTID,ISFOLDER,DESCR,ROW_ID - можно использовать как уникальный ключ для поставщика данных ТП.
В дбф:
PARENTID,ISFOLDER,DESCR(UPPER) - получается, нельзя использовать как уникальный ключ записи?
Или таки в дбф-индексы всегда неявно входит номер записи?

А зачем этот индекс использовать как ключ записи? Этот индекс используется только для упорядочивания записей. А для ключа, вроде, лучше использовать нормальный ID Улыбка
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: 1sqlite
Ответ #18 - 24. Октября 2007 :: 05:15
Печать  
Индексное выражение: parentid+STR(isfolder,1)+UPPER(descr)
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #19 - 24. Октября 2007 :: 07:54
Печать  
Nick писал(а) 24. Октября 2007 :: 05:15:
Индексное выражение: parentid+STR(isfolder,1)+UPPER(descr)

Оно не уникально.
  
Наверх
 
IP записан
 
Nick
God Member
*****
Отсутствует



Сообщений: 1599
Местоположение: г.Новокузнецк
Зарегистрирован: 21. Февраля 2007
Пол: Мужской
Re: 1sqlite
Ответ #20 - 24. Октября 2007 :: 08:00
Печать  
Arta писал(а) 24. Октября 2007 :: 07:54:
Nick писал(а) 24. Октября 2007 :: 05:15:
Индексное выражение: parentid+STR(isfolder,1)+UPPER(descr)

Оно не уникально.

А у когото было другое мнение?
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #21 - 24. Октября 2007 :: 08:12
Печать  
orefkov искал уникальный ключ.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #22 - 24. Октября 2007 :: 08:15
Печать  
Uzhast писал(а) 24. Октября 2007 :: 05:10:
А зачем этот индекс использовать как ключ записи? Этот индекс используется только для упорядочивания записей. А для ключа, вроде, лучше использовать нормальный ID Улыбка

Тогда сортировка в ТП будет по ID,  на не по наименованию
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #23 - 24. Октября 2007 :: 08:29
Печать  
Arta писал(а) 24. Октября 2007 :: 08:15:
Тогда сортировка в ТП будет по ID,  на не по наименованию

Нифига Улыбка Упорядочить можно по одному критерию, а ИД брать совсем из другого места.
  
Наверх
 
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #24 - 24. Октября 2007 :: 15:11
Печать  
Источник.УстКлючПорядка("DESCR,ID") - Упорядочит по дескру, и ключ будет уникальным. Но нет попадания в индекс.

Вариантов упорядочить записи в ТП по поему больше нет, только УстКлючПорядка?

Или я не понял о чем ты?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #25 - 25. Октября 2007 :: 04:51
Печать  
Вот именно, что для того чтобы допустим, вывести в ТП справочник с учетом группы, и упорядочив по наименованию, надо идти по индексу PARENTID_ISFOLDER_DESCR. Однако этот индекс в дбф не дает уникального ключа, и возобновить обход вниз от "нижней" видимой записи или вверх от верхней видимой записи не удастся.
Ну да ладно, чтонить придумаю.
Кстати, небольшие опыты показали, что дублирующиеся записи в индексе идут по порядку их номеров (recno).
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #26 - 25. Октября 2007 :: 07:33
Печать  
orefkov писал(а) 25. Октября 2007 :: 04:51:
Вот именно, что для того чтобы допустим, вывести в ТП справочник с учетом группы, и упорядочив по наименованию, надо идти по индексу PARENTID_ISFOLDER_DESCR. Однако этот индекс в дбф не дает уникального ключа, и возобновить обход вниз от "нижней" видимой записи или вверх от верхней видимой записи не удастся.
Ну да ладно, чтонить придумаю.
Кстати, небольшие опыты показали, что дублирующиеся записи в индексе идут по порядку их номеров (recno).


Видимо ты смотришь на справочник с длиной кода 0.
По умолчанию 1С создает 2 индекса с родителем :

PCODE                parentid+STR(isfolder,1)+UPPER(code)
PDESCR              parentid+STR(isfolder,1)+UPPER(descr)

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

А также для каждого реквизита с отбором индекс вида
VIP3677         parentid+STR(isfolder,1)+UPPER(sp3677)+UPPER(descr)
где sp3677 имя реквизита
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #27 - 25. Октября 2007 :: 07:46
Печать  
Ну это только "с контролем уникальности". У меня есть спавочники, где есть возможность вводить элементы с одинаковым кодом.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #28 - 25. Октября 2007 :: 07:48
Печать  
kiruha писал(а) 25. Октября 2007 :: 07:33:
orefkov писал(а) 25. Октября 2007 :: 04:51:
Вот именно, что для того чтобы допустим, вывести в ТП справочник с учетом группы, и упорядочив по наименованию, надо идти по индексу PARENTID_ISFOLDER_DESCR. Однако этот индекс в дбф не дает уникального ключа, и возобновить обход вниз от "нижней" видимой записи или вверх от верхней видимой записи не удастся.
Ну да ладно, чтонить придумаю.
Кстати, небольшие опыты показали, что дублирующиеся записи в индексе идут по порядку их номеров (recno).


Видимо ты смотришь на справочник с длиной кода 0.
По умолчанию 1С создает 2 индекса с родителем :

PCODE                parentid+STR(isfolder,1)+UPPER(code)
PDESCR              parentid+STR(isfolder,1)+UPPER(descr)

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

А также для каждого реквизита с отбором индекс вида
VIP3677         parentid+STR(isfolder,1)+UPPER(sp3677)+UPPER(descr)
где sp3677 имя реквизита

А мне нужно сортировать ПО НАИМЕНОВАНИЮ.
А PCODE - частный случай. Можно использовать как ключ ТП если только хочется вывести отсортировав по коду, у справочника есть код, у кода есть признак уникальности.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #29 - 25. Октября 2007 :: 08:10
Печать  
А если мы объявим ключ проядка как

PARENTID, ISFOLDER, UPPER(DESCR), ID


при наличии индекса

PDESCR  parentid+STR(isfolder,1)+UPPER(descr)


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

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #30 - 25. Октября 2007 :: 10:12
Печать  
Читаем стартовый топик.
Хочу обратить внимание, что сравнивать скорость с OLE DB FoxPro без указания полей выборки (select * )
теперь нельзя, так как 1sqlite к таблицам 1С добавляет виртуальные поля, представляющие индексы, и при
select * from приходится еще вытаскивать и доп.поля.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #31 - 25. Октября 2007 :: 10:26
Печать  
orefkov писал(а) 25. Октября 2007 :: 04:51:
Вот именно, что для того чтобы допустим, вывести в ТП справочник с учетом группы, и упорядочив по наименованию, надо идти по индексу PARENTID_ISFOLDER_DESCR. Однако этот индекс в дбф не дает уникального ключа, и возобновить обход вниз от "нижней" видимой записи или вверх от верхней видимой записи не удастся.

Я, может, чего не понимаю, но объясни мне, пожалуйста, ЗАЧЕМ упорядочивающее выражение использовать как уникальное значение, идентифицирующее строку записи?! Не понимаю. В ТП отдаем строку, где храним нормальный ИД (поле ID, IDDoc и т.д.). Когда ТП просит строки начиная с этой записи, у нас нет НИКАКИХ проблем в получении строк с этой самой записи с учетом нужного упорядочивающего выражения.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #32 - 25. Октября 2007 :: 10:28
Печать  
Или вместо ID или IDDoc тупо храним физический номер записи. Тогда все работает еще быстрее, чем с ID или IDDoc, потому что избегаем одного INDEX SEEK.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #33 - 25. Октября 2007 :: 10:31
Печать  
Uzhast писал(а) 25. Октября 2007 :: 10:26:
orefkov писал(а) 25. Октября 2007 :: 04:51:
Вот именно, что для того чтобы допустим, вывести в ТП справочник с учетом группы, и упорядочив по наименованию, надо идти по индексу PARENTID_ISFOLDER_DESCR. Однако этот индекс в дбф не дает уникального ключа, и возобновить обход вниз от "нижней" видимой записи или вверх от верхней видимой записи не удастся.

Я, может, чего не понимаю, но объясни мне, пожалуйста, ЗАЧЕМ упорядочивающее выражение использовать как уникальное значение, идентифицирующее строку записи?! Не понимаю. В ТП отдаем строку, где храним нормальный ИД (поле ID, IDDoc и т.д.). Когда ТП просит строки начиная с этой записи, у нас нет НИКАКИХ проблем в получении строк с этой самой записи с учетом нужного упорядочивающего выражения.

Покажи как.
И как должны быть написаны условия where в SQL-запросе.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #34 - 25. Октября 2007 :: 10:35
Печать  
orefkov писал(а) 25. Октября 2007 :: 10:31:
Покажи как.
И как должны быть написаны условия where в SQL-запросе.

Если у тебя возможность использования ТОЛЬКО SQL-запроса, то не получится. Но ты же имеешь прямой доступ к таблице 1С. Значит, у тебя есть возможность доступа к физическому номеру записи. Так что все выглядит просто:
1) Выбираем N строк с учетом упорядочивания. Для каждой строки запоминаем физический номер.
2) Когда ТП просит M строк с нужной строки, упорядочиваем записи, используя упорядочивающее выражение.
3) Переходим по физическому номеру записи к нужной.
4) Переходим к следующей/предыдущей записи в зависимости от того, в каком направлении двигаемся.
5) Выбираем M строк в нужном направлении.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #35 - 25. Октября 2007 :: 10:37
Печать  
Если ты можешь использовать ТОЛЬКО SQL-запросы то в том "составном" поле для упорядочивания просто дополнительно введи физический номер записи. И все у тебя срастется, ИМХО Улыбка
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #36 - 25. Октября 2007 :: 10:43
Печать  
Вообще, ИМХО, страсть использовать SQL-запросы для построения курсоров - пагубная.  Очень довольный Для курсоров лучше использовать XBase-подобные средства. А SQL-запросы в подобных задачах наоборот, вместо наглядности и простоты выборки данных, дают усложения и лишние тормоза на ровном месте.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #37 - 25. Октября 2007 :: 11:09
Печать  
Uzhast писал(а) 25. Октября 2007 :: 10:26:
Я, может, чего не понимаю, но объясни мне, пожалуйста, ЗАЧЕМ упорядочивающее выражение использовать как уникальное значение, идентифицирующее строку записи?! Не понимаю. В ТП отдаем строку, где храним нормальный ИД (поле ID, IDDoc и т.д.). Когда ТП просит строки начиная с этой записи, у нас нет НИКАКИХ проблем в получении строк с этой самой записи с учетом нужного упорядочивающего выражения.

Идеологию ТП для этого придется менять.
Там же ключ порядка - обязателен и уникален, а ИДПоле - необязателен и (допустимо) неуникален.
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #38 - 25. Октября 2007 :: 11:10
Печать  
kms писал(а) 25. Октября 2007 :: 11:09:
Идеологию ТП для этого придется менять.
Там же ключ порядка - обязателен и уникален, а ИДПоле - необязателен и (допустимо) неуникален.

Не придется. А вот идеологию провайдера - точно. У меня все работает именно по такому принципу, что я описал. ТП менялось только в одном месте - в получении CDataProvider * из объекта CBLContext *
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #39 - 25. Октября 2007 :: 11:30
Печать  
Ну, как бы если ты снимаешь ограничение на уникальность ключа порядка - это касается ТП вцелом Улыбка
Точнее, ты отдаешь право управления этим ограничением провайдеру, так?

Текущий провайдер ODBC не может работать с неуникальным ключом.
Как я понимаю, это не является необходимым требованием для DBF провайдеров, ибо там есть возможность расширения ключа номером записи.

А самому контролу что нужно от ключа порядка (почему он падает на неуникальных ключах)?
Достаточно ли корректно реализовать CompareRows, чтобы снять проблему?

Или еще что-то нужно? (не готов пока ответить)...
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #40 - 25. Октября 2007 :: 11:38
Печать  
kms писал(а) 25. Октября 2007 :: 11:30:
Ну, как бы если ты снимаешь ограничение на уникальностью ключа порядка - это касается ТП вцелом Улыбка
Точнее, ты отдаешь право управления этим ограничением провайдеру, так?

Текущий провайдер ODBC не может работать с неуникальным ключом.
Как я понимаю, это не является необходимым требованием для DBF провайдеров, ибо там есть возможность расширения ключа номером записи.

А самому контролу что нужно от ключа порядка (почему он падает на неуникальных ключах)?
Достаточно ли корректно реализовать CompareRows, чтобы снять проблему?

Или еще что-то нужно? (не готов пока ответить)...

Не надо упираться в организацию ODBC-провайдера. Она не является единственно верной и вообще этот провайдер лучше переделать под серверные курсоры (ИМХО).

Никакое ограничение на уникальность ключа порядка не снимается. Провайдер может определить некоторое поле, как поле, идентифицирующее строку выборки. И он определяет его. Только это поле уже может не иметь отношения с способу выборки строк. Вот и все.

Почему падает на неуникальных ключах не знаю, не видел Улыбка ТП я глубоко не копал. И считаю, что это правильно - должно быть хорошое описание взаимодействия, чтобы не было необходимости глубоко копать код. У меня на глючном провайдере бывало, что функция вообще всегда FALSE возвращает и ничего Улыбка А на неглючном провайдере у меня обычно все строки уникальны: в статическом используется порядковый номер записи в выборке, а в динамическом - физический номер записи.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #41 - 25. Октября 2007 :: 11:41
Печать  
Под "ключом" я, естественно, имею в виду "внутренний" ключ провайдера. Для ТП ключ - такой, какой определяет юзер, т.е. это либо ID, либо IDDoc, приведенные к типу "Справочник.Тымтымтым" или "Документ.Трумпумпум".
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #42 - 25. Октября 2007 :: 11:49
Печать  
Ну и вообще, если взять провайдер для ODBC, то в нем есть два метода: УстКлючПорядка и УстИДПоле. Так что и там ключевое поле не имеет отношения к выражению упорядочивания Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #43 - 25. Октября 2007 :: 12:09
Печать  
Кстати, насчет номера записи.

Не стремно его использовать с целью идентификации строки?
Предположим, мы запомнили номер записи, а после этого удаление данной строки и вставку новой.
Есть вероятность, что мы получим на том же месте совершенно другую строку?
Некое уникальное поле типа ID/IDDOC надежнее?

Цитата:
Не надо упираться в организацию ODBC-провайдера. Она не является единственно верной и вообще этот провайдер лучше переделать под серверные курсоры (ИМХО).

Сервер не закряхтит под нагрузкой множества курсоров от наших полей, как думаешь?

Uzhast писал(а) 25. Октября 2007 :: 11:49:
Ну и вообще, если взять провайдер для ODBC, то в нем есть два метода: УстКлючПорядка и УстИДПоле. Так что и там ключевое поле не имеет отношения к выражению упорядочивания Улыбка

Эээ. ммм.
И зачем тогда Дима назвал ключ ключем порядка? Подмигивание
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #44 - 25. Октября 2007 :: 12:17
Печать  
kms писал(а) 25. Октября 2007 :: 12:09:
Кстати, насчет номера записи.

Не стремно его использовать с целью идентификации строки?
Предположим, мы запомнили номер записи, а после этого удаление данной строки и вставку новой.
Есть вероятность, что мы получим на том же месте совершенно другую строку?
Некое уникальное поле типа ID/IDDOC надежнее?

В работающей базе строку удалить нельзя. Это при удалении помеченных объектов может случиться Улыбка Во всяком случае это утверждение действительно для справочников и документов. А вот для таблиц, скажем, итогов регистра такое может произойти. Но их в ТП не отображают обычно.

kms писал(а) 25. Октября 2007 :: 12:09:
Сервер не закряхтит под нагрузкой множества курсоров от наших полей, как думаешь?

А считаешь, что от запросов кряхтеть меньше должен? А если приделать в СКЛ нормальную прокрутку (с ползунком), то от чего, думаешь, больше будет кряхтеть? От нормального перемещения по таблице при помощи курсора или тормозного фетч-цикла при помощи запросов? Улыбка

kms писал(а) 25. Октября 2007 :: 12:09:
Эээ. ммм.
И зачем тогда Дима назвал ключ ключем порядка? Подмигивание

Не знаю Подмигивание ИМХО, название выглядит некрасиво Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #45 - 25. Октября 2007 :: 12:35
Печать  
Uzhast писал(а) 25. Октября 2007 :: 12:17:
В работающей базе строку удалить нельзя. Это при удалении помеченных объектов может случиться Улыбка

Есть еще объект.Удалить(1).
И алгоритмы, которые отвечают, за то что делают, когда делают ЭТО Улыбка

Цитата:
kms писал(а) 25. Октября 2007 :: 12:09:
Сервер не закряхтит под нагрузкой множества курсоров от наших полей, как думаешь?

А считаешь, что от запросов кряхтеть меньше должен? А если приделать в СКЛ нормальную прокрутку (с ползунком), то от чего, думаешь, больше будет кряхтеть? От нормального перемещения по таблице при помощи курсора или тормозного фетч-цикла при помощи запросов? Улыбка

Я не считаю, я думаю Улыбка
Не знаю, честно.
Серверные курсоры - это же еще и память. Много ее надо?
А что вообще даст использование курсоров, почему лучше будет?

Цитата:
kms писал(а) 25. Октября 2007 :: 12:09:
Эээ. ммм.
И зачем тогда Дима назвал ключ ключем порядка? Подмигивание

Не знаю Подмигивание ИМХО, название выглядит некрасиво Улыбка

Улыбка
Погоди-ка, ты все-таки имеешь в виду, что ключ порядка в одбц провайдере не используется для упорядочивания, или предлагаешь разделить функции упорядочивания и идентификации строки?
  

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #46 - 25. Октября 2007 :: 12:44
Печать  
kms писал(а) 25. Октября 2007 :: 12:35:
Есть еще объект.Удалить(1).
И алгоритмы, которые отвечают, за то что делают, когда делают ЭТО Улыбка


В ДБФ фактически запись удаляется во время  "Упаковка таблиц инф. базы"
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #47 - 25. Октября 2007 :: 12:48
Печать  
kms писал(а) 25. Октября 2007 :: 12:35:
Есть еще объект.Удалить(1).
И алгоритмы, которые отвечают, за то что делают, когда делают ЭТО Улыбка

Эти алгоритмы маргинальные и вряд ли используются для удаления, например, элементов из справочника товаров или клиентов в работающей базе. Подобные вещи, скорее, для каких-то служебных целей применяются и вряд ли пересекаются с задачами, которые решаются при помощи ТП. Однако, надо бы посмотреть, что в таком случае будет с провайдером... Если результат неудовлетворительный, то придется переходить на ID. Если же, например, произойдет простой переход в самое начало таблицы, то и хрен с ним. Просто физический номер - это быстрее, чем установка упорядочивания по ИД+поиск нужного ИД+установка упорядочивания по текущему критерию выборки.

kms писал(а) 25. Октября 2007 :: 12:35:
Я не считаю, я думаю Улыбка
Не знаю, честно.
Серверные курсоры - это же еще и память. Много ее надо?
А что вообще даст использование курсоров, почему лучше будет?

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

kms писал(а) 25. Октября 2007 :: 12:09:
Погоди-ка, ты все-таки имеешь в виду, что ключ порядка в одбц провайдере не используется для упорядочивания, или предлагаешь разделить функции упорядочивания и идентификации строки?

Ну, почему не используется, используется. Я просто хочу сказать, что поле идентифицирующее запись в ТП совершенно не обязательно должно быть связано с тем, как провайдер выбирает записи из своего источника данных.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #48 - 25. Октября 2007 :: 12:50
Печать  
kiruha писал(а) 25. Октября 2007 :: 12:44:
В ДБФ фактически запись удаляется во время  "Упаковка таблиц инф. базы"

Тут проблема в том, что не понятно, что произойдет в результате вызова GO НомерЗаписи, если запись НомерЗаписи вдруг пометилась на удаление. Ведь обычно таблицы просматриваются в режиме невидимости удаленных записей. Т.е. как себя поведет Фокс в этом случае: таки встанет на эту запись или сделают какую-нибудь пакость. Пойду доку что ли почитаю...
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #49 - 25. Октября 2007 :: 12:56
Печать  
kms писал(а) 25. Октября 2007 :: 12:35:
Погоди-ка, ты все-таки имеешь в виду, что ключ порядка в одбц провайдере не используется для упорядочивания, или предлагаешь разделить функции упорядочивания и идентификации строки?

Вообще, как я понимаю, существуют два ключа: "ИДПоле" - поле, которое используется в ТП и использующем его клиентском коде для идентификации записи. И "КлючПорядка" - выражение, которое позволяет упорядочить записи и ОДНОВРЕМЕННО служит внутренним ключом записи для провайдера (как я понимаю). Ну вот я и считаю, что такое двойное использование выражения упорядочивания не обязательным. Особенно в ДБФ. Тем более, что индексы там не всегда такую двойную нагрузку разрешают Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #50 - 25. Октября 2007 :: 13:38
Печать  
Идея понятна.

Да в принципе, согласен, что это просто детали реализации провайдера.
Две функции ключа в одбц провайдере объединены, видимо, с целью попадания в один и тот же индекс при поиске и при упорядочивании.
Если мы можем эффективно разделить поиск и упорядочивание (зависит от среды), можно разделить и функции ключей.
...
Пожалуй, для DBF разделить эффективно можно.
Есть подозрение, что и для SQL это также возможно.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #51 - 25. Октября 2007 :: 13:41
Печать  
Uzhast писал(а) 25. Октября 2007 :: 12:50:
kiruha писал(а) 25. Октября 2007 :: 12:44:
В ДБФ фактически запись удаляется во время  "Упаковка таблиц инф. базы"

Тут проблема в том, что не понятно, что произойдет в результате вызова GO НомерЗаписи, если запись НомерЗаписи вдруг пометилась на удаление. Ведь обычно таблицы просматриваются в режиме невидимости удаленных записей. Т.е. как себя поведет Фокс в этом случае: таки встанет на эту запись или сделают какую-нибудь пакость. Пойду доку что ли почитаю...

Да, это один момент.

Второй момент такой.
ТП может сохранять значение строки (CDataRow*), которое потом может использовать для сравнения на равенство с другой строкой.
Если сравнение реализовано некорректно (например, только по физическому адресу записи), то быть беде.

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

Т.е. имхо включение адреса физической записи для формирования уникального ключа - небезопасная операция.
  

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



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #52 - 25. Октября 2007 :: 14:34
Печать  
Uzhast писал(а) 25. Октября 2007 :: 12:56:
Тем более, что индексы там не всегда такую двойную нагрузку разрешают

Почему же не разрешает? Все будет нормально. Улыбка
  
Наверх
ICQ  
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #53 - 25. Октября 2007 :: 14:47
Печать  
kms писал(а) 25. Октября 2007 :: 13:41:
Другой клиент удаляет строку (физически строка, конечно, просто помечается как удаленная).
Третий создает новую запись (и по несчастливому стечению обстоятельств она попадает на то же самое место)
ТП просыпается и, к примеру, удаляет (гусары, молчать), данную физическую строку.
При этом она честно проверяет, что новая строка равна старой, но сравнение адресов записей всегда возвращает равенство.

Да, это может быть.

kms писал(а) 25. Октября 2007 :: 13:41:
Т.е. имхо включение адреса физической записи для формирования уникального ключа - небезопасная операция.

Можно попробовать оценить, насколько это опасно. Может быть, все не так страшно...
Поиск по CompareRows дает следующие места, где используется сравнение:

ActivateRow - используется при помощи вызова из клиентского кода или из провайдера для изменения текущей строки. Если ТП может найти среди видимых строк требуемую, активирует ее, если нет - то производит выбор строк из провайдера, начиная с запрашиваемой для активации. Итак две ситуации: строка есть среди видимых - простая подсветка, строки нет - подгрузка. Как может быть получена строка для активации? Клиентский код определяет требуемый элемент справочника или документ, провайдер на основе этого элемента делает поиск по ИД и получает физ.номер записи. При замене удаленной записи проблемный эффект можно возникнуть только, если среди видимых есть старая запись. Тогда она подсветится, хотя реально запрашивается совсем другая - новая.

Drag'n'Drop
Сравнение используется, насколько я понял, для оптимизации отрисовки текущей цели. Тут не может произойти что-то опасное, потому что строки ТП при этом не удаляются и не создаются. Сравниваются между собой строки, полученные из одной выборки.

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

Возможен еще один эффект - при обновлении строк. ТП запрашивает N строк, начиная с некоторой данной (первой видимой). Если провайдер использует физ.номер, то он возьмет N строк начиная от новой строки. Если провайдер не использует физ.номер, а использует ИД, то он не найдет строку вообще и ему придется что-то сделать по умолчанию - например перейти в начало таблицы. В любом случае то, что произойдет - нельзя считать нормальным поведением с точки зрения пользователя Улыбка

Так что физномера - не такая страшная вещь, как кажется.

Не, ну конечно использование физномеров - не такое гладкое решение, как использование ИД. Но с другой стороны номера должны работать гораздо быстрее... Хотя тут надо бы еще подумать...
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #54 - 25. Октября 2007 :: 14:50
Печать  
spock писал(а) 25. Октября 2007 :: 14:34:
Uzhast писал(а) 25. Октября 2007 :: 12:56:
Тем более, что индексы там не всегда такую двойную нагрузку разрешают

Почему же не разрешает? Все будет нормально. Улыбка

Не будет. Пусть используется индекс PARENTID,ISFOLDER,DESCR(UPPER). У меня 5 элементов с совершенно одинаковым наименованием. Пожалуйста, верни мне из SQL-запроса с использованием этого индекса, 10 строк вверх, начиная с 4-го элемента из этих 5 одинаковых.  Язык
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #55 - 25. Октября 2007 :: 15:59
Печать  
kms писал(а) 25. Октября 2007 :: 13:41:
Предположим, мы используем физический адрес записи, как ид-поле.
ТП сохраняет строку (адрес записи).
Другой клиент удаляет строку (физически строка, конечно, просто помечается как удаленная).
Третий создает новую запись (и по несчастливому стечению обстоятельств она попадает на то же самое место)
ТП просыпается и, к примеру, удаляет (гусары, молчать), данную физическую строку.
При этом она честно проверяет, что новая строка равна старой, но сравнение адресов записей всегда возвращает равенство.

Т.е. имхо включение адреса физической записи для формирования уникального ключа - небезопасная операция.


Ни фига не понял как новая запись может попасть на  строку, которая в ДБФ - DELETED(),
но тем не менее занимает место в таблице.

Разве что адреса берутся при включенном фильтре NOT.DELETED().
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #56 - 25. Октября 2007 :: 16:50
Печать  
kiruha писал(а) 25. Октября 2007 :: 15:59:
Цитата:
Т.е. имхо включение адреса физической записи для формирования уникального ключа - небезопасная операция.

Ни фига не понял как новая запись может попасть на  строку, которая в ДБФ - DELETED(),
но тем не менее занимает место в таблице.

Практический опыт и отдаленные теоретические воспоминания говорят о том, что может.
Еще в 97 году я хлебнул немало горя во время восстановления DBF баз 1С:Торговля (мда-мда) 7.0  из-за фрагментации записей в таблицах, возникших в результате перезаписи удаленных строк.

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

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

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #57 - 25. Октября 2007 :: 17:09
Печать  
[quote author=kiruha link=1192855975/45#55 date=1193327958]Ни фига не понял как новая запись может попасть на  строку, которая в ДБФ - DELETED(),
но тем не менее занимает место в таблице.
[/quote]

Чтоб было понятнее, вот простой тест.
[tt]
Процедура Заполнить()
     _о =СоздатьОбъект("Справочник." +Вид()); // это была форма списка нового справочника
     _о.Новый();
     _о.Код =1;
     _о.Записать();
     _о.Новый();
     _о.Код =2;
     _о.Записать();
     _о.Новый();
     _о.Код =3;
     _о.Записать();
     _о.НайтиПоКоду(2);
     _о.Удалить(1);
     _о.Новый();
     _о.Код =4;
     _о.Записать();
КонецПроцедуры
[/tt]
Порядок будет 1, 4, 3; удаленных записей нет. (на 7.7 R27)

[sub]
Если у кого есть желание - пусть обосновывает, с меня за 10 лет хватит  8-)
[/sub]
  

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #58 - 25. Октября 2007 :: 18:13
Печать  
[quote author=kms link=1192855975/45#57 date=1193332196][quote author=kiruha link=1192855975/45#55 date=1193327958]Ни фига не понял как новая запись может попасть на  строку, которая в ДБФ - DELETED(),
но тем не менее занимает место в таблице.
[/quote]

Чтоб было понятнее, вот простой тест.
[tt]
Процедура Заполнить()
     _о =СоздатьОбъект("Справочник." +Вид()); // это была форма списка нового справочника
     _о.Новый();
     _о.Код =1;
     _о.Записать();
     _о.Новый();
     _о.Код =2;
     _о.Записать();
     _о.Новый();
     _о.Код =3;
     _о.Записать();
     _о.НайтиПоКоду(2);
     _о.Удалить(1);
     _о.Новый();
     _о.Код =4;
     _о.Записать();
КонецПроцедуры
[/tt]
Порядок будет 1, 4, 3; удаленных записей нет. (на 7.7 R27)

[sub]
Если у кого есть желание - пусть обосновывает, с меня за 10 лет хватит  8-)
[/sub][/quote]

Да, запись была замещена.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #59 - 25. Октября 2007 :: 18:48
Печать  
Но случай все же экзотический.
С тем же экзотическим случаем ничто не мешает сделать Id не уникальным (средствами OLEDB).

Имхо - не стоит ради этого жертвовать производительностью.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #60 - 25. Октября 2007 :: 19:38
Печать  
kiruha
Нет, случай маловероятный, но не экзотический.
Неуникальный ID в уникальном поле - это нарушение идеологии системы, имеем полное право считать такую ситуацию недопустимой, а замещение записей - ситуация штатная, прогнозируемая.

Uzhast
Цитата:
Поиск по CompareRows дает следующие места, где используется сравнение:

То же самое касается GetRowValue и преобразования CDataRow в CValue.
Предположим, мы стоим на строке, которую удаляют и замещают другой на том же месте.
В тот момент, когда мы нажмем Enter для ключа "x y z ID" мы получим ошибку позиционирования (если ID стал другим и не возродился в другом месте).
Для ключа "x y z rec_no" мы найдем строку (если x y z остались теми же), которая будет совпадать по ключу, но не будет соответствовать ожиданию пользователя.

P.S.
Конечно, согласен, что ситуация редкая.
Это примерно как с нюансами нехватки памяти, или обработки исключений.
Более того, если даже что-то произойдет, это будет практически неповторяемо; скорее всего, пользователь даже не поймет, что и откуда прилетело.

Засим умолкаю...
В мою задачу совсем не входит деморализовать отличные идеи быстрого позиционирования в DBF.
Мне просто приятно поговорить с умными людьми Улыбка

...
Но если будет нормальный выбор, лучше делать надежное решение. Улыбка
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #61 - 25. Октября 2007 :: 19:50
Печать  
kms писал(а) 25. Октября 2007 :: 19:38:
То же самое касается GetRowValue и преобразования CDataRow в CValue.
Предположим, мы стоим на строке, которую удаляют и замещают другой на том же месте.
В тот момент, когда мы нажмем Enter для ключа "x y z ID" мы получим ошибку позиционирования (если ID стал другим и не возродился в другом месте).
Для ключа "x y z rec_no" мы найдем строку (если x y z остались теми же), которая будет совпадать по ключу, но не будет соответствовать ожиданию пользователя.

Неправда! Улыбка Я уже говорил, что в качестве внутреннего ключа используется номер записи. А в качестве ключа для ТП используется нормальная колонка типа "Документ" или "Справочник". Поэтому, если юзверь шваркнет на Enter на удаленном элементе, то он получит ожидаемую (по крайней мере, для программиста) реакцию: "Объект не найден и т.д." Соответственно преобразование ТП-ключа в значение - тоже берется агрегатный объект и по нему ищем строку. Естественно, не находим и материм юзверя, чтобы отвязался. Поэтому, проблем с использованием номера строки не так уж и много получается. Но тут надо думать, конечно...
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #62 - 25. Октября 2007 :: 20:23
Печать  
orefkov писал(а) 20. Октября 2007 :: 04:52:
- Пытается использовать индексы при работе с таблицами 1С.
  Вот это надо особо протестить.

1. Вот так можно уронить:

select * from Номенклатура
where PARENTID_ISFOLDER_DESCR = 1
order by PARENTID_ISFOLDER_DESCR


2. case sensitivity для русских названий индексов

select * from Номенклатура
order by PARENTID_ISFOLDER_Артикул -- работает

select * from Номенклатура
order by PARENTID_ISFOLDER_АртикуЛ -- нет


3. Не возникло взаимопонимания при установке фильтров

select * from Номенклатура
where parentid = '     0   '

Дает пустой запрос, хотя корневые элементы, конечно, есть.

При этом в плане запроса
Код
Выбрать все
5	VFilter	0	49	SC84.PCODE;?0;
 


имя индекса подходящее, но непонятно что означает ?0
в число преобразует?

4. Вот такой запрос

select * from Номенклатура
where parentid = '     0   '
and isfolder = 1
and descr > 'У'


в плане запроса дает
Код
Выбрать все
6	VFilter	0	53	SC84.PCODE;?0;1;
7	VColumn	0	3
8	String8	0	0	У
9	Le	353	52	collseq(BINARY)
 


верно ли это (ожидаемо было бы получить индекс PDESCR)
  

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #63 - 26. Октября 2007 :: 05:30
Печать  
Извиняюсь, провайдер лишал интернета.
2kms: Ну, наконец-то пошло что-то ближе к теме.
Часть глюков уже сам вчера обнаружил. Правлю.
Надеюсь, к вечеру будет обновленная версия.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #64 - 26. Октября 2007 :: 06:12
Печать  
Теперь Uzhast.
Цитата:
Если у тебя возможность использования ТОЛЬКО SQL-запроса, то не получится. Но ты же имеешь прямой доступ к таблице 1С. Значит, у тебя есть возможность доступа к физическому номеру записи. Так что все выглядит просто:
1) Выбираем N строк с учетом упорядочивания. Для каждой строки запоминаем физический номер.
2) Когда ТП просит M строк с нужной строки, упорядочиваем записи, используя упорядочивающее выражение.
3) Переходим по физическому номеру записи к нужной.
4) Переходим к следующей/предыдущей записи в зависимости от того, в каком направлении двигаемся.
5) Выбираем M строк в нужном направлении.


Ты этот свой "простой" алгоритм кроме своей головы еще гденить пробовал тестить?
У тебя п.2 и п.3 противоречят друг-другу.
Если ты используешь индекс для упорядочивания, то перейти по физическому номеру записи невозможно.
Кроме как full-scan'ом.
Так-что возможный алгоритм мог бы быть такой (для случая выборки следующих строк) :
1. Делаем index seek по ключу.
2. Сканируем по индексу дальше, ища запись с нужным физическим номером.
3. Получаем следующие записи.

Однако этот алгоритм неверен. Во-первых, ключ этой записи уже мог изменится.
(Другой юзер уже переименовал, удалил, перенес в другую группу)
В лучшем случае новый ключ записи больше старого, и рано или поздно, двигаясь
по индкесу, мы до нее дойдем. В худшем - новый ключ меньше, либо отсутствует.
В этом случае вообще ничего не найдем.

Во-вторых, ТП работает не так, как ты себе представляешь - оно не просит
провайдера "получи М строк от текущей записи".
Оно просит "получи первые М строк с ключом БОЛЬШИМ, чем вот этот сохраненный ключ"
Так вот в этом случае, если бы я точно был уверен, что одинаковые ключи в индексе
расположены СТРОГО по порядку номеров физических записей, алгоритм был бы таким:
1. Делаем index seek по переданному ключу.
2. Двигаемся по индексу далее, пока (номер записи меньше переданного и ключ не больше переданного).
3. Как только это условие не выполняется, получаем М строк.

Вот поэтому я и спрашивал, упорядочиваются ли дублирующиеся ключи в индексе ещё и
по физическим номерам записей.

Цитата:
Вообще, ИМХО, страсть использовать SQL-запросы для построения курсоров - пагубная.
Для курсоров лучше использовать XBase-подобные средства.
А SQL-запросы в подобных задачах наоборот, вместо наглядности и простоты выборки данных,
дают усложения и лишние тормоза на ровном месте.


Ща я тебе покажу, какая это гадость - курсоры.
Проведем экперимент:
1. Открываем две копии 1С с одной базой, хоть дбф, хоть sql.
2. Открываем в ней форму списка большого справочника.
3. В обоих базах ставим время автообновления 99, и встаем на один и тот же элемент справочника
   примерно в середине списка, где-то например, на букве "К".
4. В одной копии меняем название элемента, например, первую букву заменяем на "П".
5. В другой - пытаемся походить вверх/вниз от текущего элемента. Внимательно наблюдаем
   за интересными артефактами.
6. Закроем/откроем справочник.
7. Опять встаем на один и тот-же элемент.
8. В одной программе переносим элемент в другую группу.
9. В другой пытаемся  походить вверх/вниз от текущего элемента. И не можем этого сделать.

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

А в ТП с ODBC-поставщиком данных такой хрени не происходит.
И насчет "лишние тормоза на ровном месте" хотелось бы, чтобы ты свое мнение
подтвердил конкретными цифрами и тестами. Если конечно сможешь написать ODBC-поставщика
на серверных курсорах.

А "проскок" N строк в текущей реализации ODBC-поставщика очень даже можно сделать.

select max(key) from (select top N key from lalala where key > storedkey order by key) topNkeys
либо
select top 1 key from (select top N key from lalala where key > storedkey order by key) topNkeys order by key desc

  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #65 - 26. Октября 2007 :: 06:36
Печать  
Цитата:
непонятно что означает ?
0

Как бы объяснить...
SQLite сначала вызывает у меня метод xBestIndex.
В него передает инфу об ограничениях (условиях). В данном случае передаст, что

PARENTID= //parentid будет сравниваться на равенство
ISFOLDER= //isfolder будет сравниваться на равенство
DESCR>  // descr будет сравниваться на большесть.

Я должен определиться, могу ли я использовать какой-либо индекс, исходя из заданных ограничений,
сообщить движку SQLite, какие из этих полей он может не проверять, и сформировать строку,
которую движок SQLite потом передаст в функцию xFilter.
А в ней я должен расшифровать эту строку, используя эту инфу для организации выборки.
Вот в этой строке я сначала пишу имя индекса (исключительно для того, чтобы видеть в плане выполнения какой индекс используется), а затем кодированную информацию о том, что делать с агрументами, переданными мне в xFilter.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #66 - 26. Октября 2007 :: 07:37
Печать  
Вечером постараюсь выложить тест с цифрами.
Получается что для связка 1с sql +
виртуальная таблица sqlite работает значительно быстрее чем скопированная в память родная таблица sqlite на реальном большом справочнике Клиенты.
Очень неожиданный положительный результат.
Для 1с dbf такого нет.( т.е. родная sqlite таблица быстрее чем вирт таблица )
Также компонента 1.4 на родной sqlite таблице работает чуть быстрее
чем с версией 1.0 1csqlite.dll, если надо то тоже выложу эти цифры.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #67 - 26. Октября 2007 :: 08:27
Печать  
orefkov писал(а) 26. Октября 2007 :: 06:12:
Теперь Uzhast.
Цитата:
Если у тебя возможность использования ТОЛЬКО SQL-запроса, то не получится. Но ты же имеешь прямой доступ к таблице 1С. Значит, у тебя есть возможность доступа к физическому номеру записи. Так что все выглядит просто:
1) Выбираем N строк с учетом упорядочивания. Для каждой строки запоминаем физический номер.
2) Когда ТП просит M строк с нужной строки, упорядочиваем записи, используя упорядочивающее выражение.
3) Переходим по физическому номеру записи к нужной.
4) Переходим к следующей/предыдущей записи в зависимости от того, в каком направлении двигаемся.
5) Выбираем M строк в нужном направлении.


Ты этот свой "простой" алгоритм кроме своей головы еще гденить пробовал тестить?
У тебя п.2 и п.3 противоречят друг-другу.

Пробовал. Работает. Смотри здесь: http://www.1cpp.ru/forum/YaBB.pl?num=1190523570/150

orefkov писал(а) 26. Октября 2007 :: 06:12:
Если ты используешь индекс для упорядочивания, то перейти по физическому номеру записи невозможно. Кроме как full-scan'ом.

Возможно. Учи матчасть.


orefkov писал(а) 26. Октября 2007 :: 06:12:
Во-вторых, ТП работает не так, как ты себе представляешь - оно не просит
провайдера "получи М строк от текущей записи".
Оно просит "получи первые М строк с ключом БОЛЬШИМ, чем вот этот сохраненный ключ"

Бред. ТП ВООБЩЕ ничего не знает про какие либо ключи. Оно просто запрашивает строки у провайдера. И все. Поэтому работает оно именно так, как я описал. Т.е. "взять M строк, начиная с данной".

Блин, orefkov, ну ты даешь!
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #68 - 26. Октября 2007 :: 08:29
Печать  
orefkov писал(а) 26. Октября 2007 :: 06:12:
Так вот в этом случае, если бы я точно был уверен, что одинаковые ключи в индексе
расположены СТРОГО по порядку номеров физических записей, алгоритм был бы таким:
1. Делаем index seek по переданному ключу.
2. Двигаемся по индексу далее, пока (номер записи меньше переданного и ключ не больше переданного).
3. Как только это условие не выполняется, получаем М строк.

В случае, если они неупорядочены, либо мы не хотим использовать физический номер записи, можно использовать чуть худший по характеристикам алгоритм.

Использование, например, ключа PARENTID,ISFOLDER,DESCR,ID (ID - это добивание ключа до уникального)
(выборка top n по возрастанию, т.е. строки, больше значения полного ключа)

0. Делаем index seek по переданному неполному ключу
1. Если такого ключа нет, Goto 6
2. Выбираем все записи по текущему ключу
3. Сортируем по ID
4. Запоминаем к возврату строку с upper_bound(id) по end
5. Если найдено достаточно строк, возвращаем результат (n строк)
6. Перемещаемся к следующему неполному ключу (идем по индексу)
7. Выбираем все значения ключа
8. Сортируем по ID
9. Запоминаем к возврату все строки
10. Goto 5

Конечно, тут есть приличный overhead, но алгоритм безопасен.
  

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #69 - 26. Октября 2007 :: 08:30
Печать  
Z1 писал(а) 26. Октября 2007 :: 07:37:
Вечером постараюсь выложить тест с цифрами.
Получается что для связка 1с sql +
виртуальная таблица sqlite работает значительно быстрее чем скопированная в память родная таблица sqlite на реальном большом справочнике Клиенты.
Очень неожиданный положительный результат.
Для 1с dbf такого нет.( т.е. родная sqlite таблица быстрее чем вирт таблица )
Также компонента 1.4 на родной sqlite таблице работает чуть быстрее
чем с версией 1.0 1csqlite.dll, если надо то тоже выложу эти цифры.

Немного недопонял.
Если база не дбф, ВК не отображает таблицы 1С как виртуальные таблицы.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #70 - 26. Октября 2007 :: 08:50
Печать  
Uzhast писал(а) 26. Октября 2007 :: 08:27:
Бред. ТП ВООБЩЕ ничего не знает про какие либо ключи. Оно просто запрашивает строки у провайдера. И все. Поэтому работает оно именно так, как я описал. Т.е. "взять M строк, начиная с данной".

ТП 100% не знает, поэтому его так легко обмануть. Плачущий
Суть в привязке CDataRow, она может быть привязана к физической строке - и тогда быть беде, либо к логической, т.е. некому абстрактному местоположению в пространстве строк (что сейчас и сделано для ODBC провайдера).

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

Модель с физической привязкой, кстати, уже есть.
Это VT провайдер.
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #71 - 26. Октября 2007 :: 08:52
Печать  
orefkov писал(а) 26. Октября 2007 :: 06:12:
Ща я тебе покажу, какая это гадость - курсоры.
...
Внимательно наблюдаем  за интересными артефактами.
...
В другой пытаемся  походить вверх/вниз от текущего элемента. И не можем этого сделать.

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

А в ТП с ODBC-поставщиком данных такой хрени не происходит.

Никаких "особо страшных артефактов" при этом не проявляется. Все логично. Изменилось место текущей записи в упорядоченном наборе - курсор этот факт отобразил. Здесь все зависит от точки зрения, что юзабельнее: поведение курсора или запроса. Я считаю, что оба варианта поведения нормальны.

orefkov писал(а) 26. Октября 2007 :: 06:12:
А "проскок" N строк в текущей реализации ODBC-поставщика очень даже можно сделать.

select max(key) from (select top N key from lalala where key > storedkey order by key) topNkeys
либо
select top 1 key from (select top N key from lalala where key > storedkey order by key) topNkeys order by key desc


Вот-вот, тормоза на ровном месте. Особенно, если N = 150000, например (или у тебя другие данные?). А в случае индексов пропустить нужное количество строк можно практически мгновенно.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #72 - 26. Октября 2007 :: 09:13
Печать  
Uzhast писал(а) 26. Октября 2007 :: 08:27:
orefkov писал(а) 26. Октября 2007 :: 06:12:
Если ты используешь индекс для упорядочивания, то перейти по физическому номеру записи невозможно. Кроме как full-scan'ом.

Возможно. Учи матчасть.

Ню-ню.
Если ты думаешь, что написав
set order to idd
goto 100

фокс тебе моментом найдет запись, не применив full scan по индексу, то эт вряд ли.
Вроде такой большой, а в сказки веришь Улыбка
А матчасть я-то изучал уже, вплоть до структуры cdx-файла.
И прямо тебе скажу, что информации, что бы по номеру записи найти узел в дереве индекса, соответствующий этой записи, с тем чтобы двинуться от этого узла дальше, в нем нет. Кроме, естественно, полного обхода дерева индекса с корня до нахождения листа с нужным номером записи.
Возможно, это одна из причин 30-40% загрузки проца в твоем провайдере.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #73 - 26. Октября 2007 :: 09:21
Печать  
orefkov писал(а) 26. Октября 2007 :: 09:13:
Ню-ню.
Если ты думаешь, что написав
set order to idd
goto 100

фокс тебе моментом найдет запись, не применив full scan по индексу, то эт вряд ли.
Вроде такой большой, а в сказки веришь Улыбка
А матчасть я-то изучал уже, вплоть до структуры cdx-файла.
И прямо тебе скажу, что информации, что бы по номеру записи найти узел в дереве индекса, соответствующий этой записи, с тем чтобы двинуться от этого узла дальше, в нем нет. Кроме, естественно, полного обхода дерева индекса с корня до нахождения листа с нужным номером записи.
Возможно, это одна из причин 30-40% загрузки проца в твоем провайдере.

Орефков, не позорься. Итак, читаем матчасть:
Цитата:
GO | GOTO Command
...
Parameters
RECORD nRecordNumber


Specifies the physical record number to move the record pointer to. You can omit GO or GOTO entirely and specify just the record number. If you specify just the record number, you can move the record pointer only within the current work area.

Орефков! Физический номер записи не имеет НИКАКОГО отношения к индексу, как тебе почему-то кажется. Ну никакого! Это действительно ФИЗИЧЕСКИЙ номер записи - т.е. элементарный порядковый номер записи в файле. Эти номера не зависят от индекса - они зависят от ПОРЯДКА ДОБАВЛЕНИЯ ЗАПИСЕЙ В ТАБЛИЦУ. Дошло?

А загрузка 30-35% связана не со сканом. На большом журнале документов загрузка процессора полностью эквивалентна загрузке процессора на легонькой табличке из пары сотен строк. Т.е. доступ по физическому номеру происходит МГНОВЕННО! А потребление 30-35% связано с вызовами prg-скрипта. К слову сказать, даже без фокса (на каких-нибудь ТЗ) потребление процессора в ТП может доходить до 15-20%.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #74 - 26. Октября 2007 :: 09:23
Печать  
Uzhast писал(а) 26. Октября 2007 :: 08:52:
orefkov писал(а) 26. Октября 2007 :: 06:12:
Ща я тебе покажу, какая это гадость - курсоры.
...
Внимательно наблюдаем  за интересными артефактами.
...
В другой пытаемся  походить вверх/вниз от текущего элемента. И не можем этого сделать.

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

А в ТП с ODBC-поставщиком данных такой хрени не происходит.

Никаких "особо страшных артефактов" при этом не проявляется. Все логично. Изменилось место текущей записи в упорядоченном наборе - курсор этот факт отобразил. Здесь все зависит от точки зрения, что юзабельнее: поведение курсора или запроса. Я считаю, что оба варианта поведения нормальны.

Лукаваишь, ой лукавишь.
На варианте, когда из-за изменения родителя одним юзером другой даже сдвинутся с места с записи не может, ты решил не заострять внимания.
Да и с этими артефактами - видимо тебе юзеры не разу не звонили - "Что за хрень у меня в списке творится? Иду по справочнику, а вместо одного элемента другие появляются. Стою на "А", перехожу почему-то на "Я".
И твою точку зрения, что это нормально, они бы тебе запихали глубоко.
Согласись, это не нормально, когда изменения, сделанные одним юзером, сбивают выборку у другого.
Человек вправе ожидать, что после "А" будет идти "Б", чего бы другие там в базе не творили.

Uzhast писал(а) 26. Октября 2007 :: 08:52:
orefkov писал(а) 26. Октября 2007 :: 06:12:
А "проскок" N строк в текущей реализации ODBC-поставщика очень даже можно сделать.

select max(key) from (select top N key from lalala where key > storedkey order by key) topNkeys
либо
select top 1 key from (select top N key from lalala where key > storedkey order by key) topNkeys order by key desc


Вот-вот, тормоза на ровном месте. Особенно, если N = 150000, например (или у тебя другие данные?). А в случае индексов пропустить нужное количество строк можно практически мгновенно.

Скажу тебе по секрету, что когда работаешь с SQL-сервером, для любых действий надо делать запрос.
И зря ты думаешь, что такой запрос напряжет сервер. Он, сука, умный, и поймет, что от него хотят всего-лишь seek and skip.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #75 - 26. Октября 2007 :: 09:27
Печать  
orefkov писал(а) 26. Октября 2007 :: 09:23:
И твою точку зрения, что это нормально, они бы тебе запихали глубоко.
Согласись, это не нормально, когда изменения, сделанные одним юзером, сбивают выборку у другого.
Человек вправе ожидать, что после "А" будет идти "Б", чего бы другие там в базе не творили.

Да ладно! Стоял человек на некотором элементе, собирался с ним работать. А тут из-за твоих представлений о том, как должны работать табличные поля, элемент пропал с глаз долой. Так что не все так просто, как тебе кажется. В разных случаях нужно разное поведение.

Uzhast писал(а) 26. Октября 2007 :: 08:52:
orefkov писал(а) 26. Октября 2007 :: 06:12:
А "проскок" N строк в текущей реализации ODBC-поставщика очень даже можно сделать.

select max(key) from (select top N key from lalala where key > storedkey order by key) topNkeys
либо
select top 1 key from (select top N key from lalala where key > storedkey order by key) topNkeys order by key desc


Вот-вот, тормоза на ровном месте. Особенно, если N = 150000, например (или у тебя другие данные?). А в случае индексов пропустить нужное количество строк можно практически мгновенно.

Скажу тебе по секрету, что когда работаешь с SQL-сервером, для любых действий надо делать запрос.
И зря ты думаешь, что такой запрос напряжет сервер. Он, сука, умный, и поймет, что от него хотят всего-лишь seek and skip. [/quote]
Может быть. А, может, и нет. Зависит от сервера. И, в любом случае, вместо прозрачного алгоритма работы с данными получаем крокодила.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #76 - 26. Октября 2007 :: 09:29
Печать  
Uzhast писал(а) 26. Октября 2007 :: 09:21:
Орефков, не позорься. Итак, читаем матчасть:
Цитата:
GO | GOTO Command
...
Parameters
RECORD nRecordNumber


Specifies the physical record number to move the record pointer to. You can omit GO or GOTO entirely and specify just the record number. If you specify just the record number, you can move the record pointer only within the current work area.

Орефков! Физический номер записи не имеет НИКАКОГО отношения к индексу, как тебе почему-то кажется. Ну никакого! Это действительно ФИЗИЧЕСКИЙ номер записи - т.е. элементарный порядковый номер записи в файле. Эти номера не зависят от индекса - они зависят от ПОРЯДКА ДОБАВЛЕНИЯ ЗАПИСЕЙ В ТАБЛИЦУ. Дошло?

Это ты бы лучше не позорился.
Ну перешел ты в файле на нужную запись.
На кой черт мне записи в ПОРЯДКА ДОБАВЛЕНИЯ ЗАПИСЕЙ В ТАБЛИЦУ?
Мне надо дальше двигатся в порядке ИНДЕКСА.
И как ты найдешь, с какого места в ИНДЕКСЕ надо возобновить обход?
Только либо перебрав весь индекс, ища нужную запись,
либо сформировав ключ этой записи, найти этот ключ в индексе, и двигать по индексу, ища нужную запись по номеру.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #77 - 26. Октября 2007 :: 09:34
Печать  
orefkov писал(а) 26. Октября 2007 :: 09:29:
Это ты бы лучше не позорился.
Ну перешел ты в файле на нужную запись.
На кой черт мне записи в ПОРЯДКА ДОБАВЛЕНИЯ ЗАПИСЕЙ В ТАБЛИЦУ?
Мне надо дальше двигатся в порядке ИНДЕКСА.
И как ты найдешь, с какого места в ИНДЕКСЕ надо возобновить обход?
Только либо перебрав весь индекс, ища нужную запись,
либо сформировав ключ этой записи, найти этот ключ в индексе, и двигать по индексу, ища нужную запись по номеру.

Орефков, ну это уже не смешно. Честное слово. Ну ты же всегда был умным мужиком. А сейчас мне тебе приходится объяснять элементарные вещи. Мне же неудобно. Ты же вроде авторитет, а простых вещей не знаешь. Может, лучше в личку перенести обсуждение?

Я перехожу по физическому номеру записи на нужную. Далее я делаю SKIP в нужном направлении. Как работает SKIP? Вот так:
Цитата:
Remarks
If the table has a master controlling index tag or index file, SKIP moves the record pointer to the record determined by the index sequence.

Вкуриваешь? Фактически, номер записи - это закладка. Вот и все.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #78 - 26. Октября 2007 :: 09:37
Печать  
Стоять! Какая еще личка? Нам всем интересно Улыбка
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #79 - 26. Октября 2007 :: 09:48
Печать  
Uzhast писал(а) 26. Октября 2007 :: 09:34:
orefkov писал(а) 26. Октября 2007 :: 09:29:
Это ты бы лучше не позорился.
Ну перешел ты в файле на нужную запись.
На кой черт мне записи в ПОРЯДКА ДОБАВЛЕНИЯ ЗАПИСЕЙ В ТАБЛИЦУ?
Мне надо дальше двигатся в порядке ИНДЕКСА.
И как ты найдешь, с какого места в ИНДЕКСЕ надо возобновить обход?
Только либо перебрав весь индекс, ища нужную запись,
либо сформировав ключ этой записи, найти этот ключ в индексе, и двигать по индексу, ища нужную запись по номеру.

Орефков, ну это уже не смешно. Честное слово. Ну ты же всегда был умным мужиком. А сейчас мне тебе приходится объяснять элементарные вещи. Мне же неудобно. Ты же вроде авторитет, а простых вещей не знаешь. Может, лучше в личку перенести обсуждение?

Я перехожу по физическому номеру записи на нужную. Далее я делаю SKIP в нужном направлении. Как работает SKIP? Вот так:
Цитата:
Remarks
If the table has a master controlling index tag or index file, SKIP moves the record pointer to the record determined by the index sequence.

Вкуриваешь? Фактически, номер записи - это закладка. Вот и все.

Ты мануалы-то не только читай, мозг включай иногда Улыбка
Полезно иногда подумать, как же работает это волшебство.
Номер записи - это закладка в файле, но никак не в ИНДЕКСЕ.
Так  что скорее всего, унутре все происходит так:
Когда ты делаешь GOTO номер, фокс позиционирует указатель в файле-ДАННЫХ на нужную запись.
После этого, если для таблицы установлен порядок обхода по индексу, ему просто НЕОБХОДИМО перепозиционировать указатель в файле-ИНДЕКСЕ на узел, СООТВЕТСТВУЮЩИЙ ЭТОЙ ЗАПИСИ В ИНДЕКСЕ.
Иначе откуда он будет делать дальнейший SKEEP ?
Как это делает Фокс?
Есть такая инфа?
Скорее всего он формирует индексный ключ записи, на которую он перешел в ФАЙЛЕ, и ищет этот ключ в ИНДЕКСНОМ ФАЙЛЕ. При этом, если ключ не уникален, ему приходится НЕМНОЖКО ПРОСКАНИРОВАТЬ индекс в пределах этого ключа, чтобы точно найти тот узел, в котором номер записи соответствует номеру записи, на который он перешел в файле.
А это оптимальней всего делать, когда неуникальные ключи в индексе еще дополнительно упорядочены по номеру записи.
Что собственно, меня и интересовало.
И что собственно, мы видим на практике - действительно, неуникальные ключи в индексном файле идут в порядке физических номеров. И так как мои логические построения привели к тому-же выводу, что и существуюет на практике, то в них скорее всего большая доля истины, чем в бездумном цитировании мануалов.
PS
И скореевсего поэтому ключ в cdx-файле лежит в виде строки
СамКлюч + (Четыре символа - номер записи в hex-нотации)
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #80 - 26. Октября 2007 :: 09:50
Печать  
Нет, блин, я с тебя фигею...
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #81 - 26. Октября 2007 :: 09:56
Печать  
Uzhast писал(а) 26. Октября 2007 :: 09:27:
Да ладно! Стоял человек на некотором элементе, собирался с ним работать. А тут из-за твоих представлений о том, как должны работать табличные поля, элемент пропал с глаз долой.

Вот именно - в ТП исчезнет ТОЛЬКО элемент, измененный другим юзером.
А в 1С на курсорах - и этот элемент исчезает, и соседние начинают вести себя крайне неадекватно.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #82 - 26. Октября 2007 :: 09:57
Печать  
orefkov писал(а) 26. Октября 2007 :: 09:48:
Ты мануалы-то не только читай, мозг включай иногда Улыбка

Ну да, как еще оправдать свое не знание мануалов... Не смешно  Улыбка

orefkov писал(а) 26. Октября 2007 :: 09:48:
Так  что скорее всего, унутре все происходит так:
Когда ты делаешь GOTO номер, фокс позиционирует указатель в файле-ДАННЫХ на нужную запись.
После этого, если для таблицы установлен порядок обхода по индексу, ему просто НЕОБХОДИМО перепозиционировать указатель в файле-ИНДЕКСЕ на узел, СООТВЕТСТВУЮЩИЙ ЭТОЙ ЗАПИСИ В ИНДЕКСЕ.
Иначе откуда он будет делать дальнейший SKEEP ?
Как это делает Фокс?
Есть такая инфа?
Скорее всего он формирует индексный ключ записи, на которую он перешел в ФАЙЛЕ, и ищет этот ключ в ИНДЕКСНОМ ФАЙЛЕ. При этом, если ключ не уникален, ему приходится НЕМНОЖКО ПРОСКАНИРОВАТЬ индекс в пределах этого ключа, чтобы точно найти тот узел, в котором номер записи соответствует номеру записи, на который он перешел в файле.

Шаткое предположение. Не обязательно, что все так и есть. Можно построить элементарное дерево для номеров строк. И никакие индексные выражения тогда строить не надо.

orefkov писал(а) 26. Октября 2007 :: 09:48:
А это оптимальней всего делать, когда неуникальные ключи в индексе еще дополнительно упорядочены по номеру записи.
Что собственно, меня и интересовало.
И что собственно, мы видим на практике - действительно, неуникальные ключи в индексном файле идут в порядке физических номеров.

Сомнительный вывод из шаткого предположения.

orefkov писал(а) 26. Октября 2007 :: 09:48:
И так как мои логические построения привели к тому-же выводу, что и существуюет на практике, то в них скорее всего большая доля истины, чем в бездумном цитировании мануалов.

Ну да, лучше бездумно делать логические выводы на пустом месте вместо того, чтобы нормально прочитать мануал.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #83 - 26. Октября 2007 :: 10:03
Печать  
Цитата:
Можно построить элементарное дерево для номеров строк. И никакие индексные выражения тогда строить не надо.

Можно и левое ухо правой рукой чесать Улыбка
Никто не спорит, что такое дерево можно построить.
Но во закавыка - в cdx-файле его нет. Какая жалость.
А делать его в памяти?
Ну, в однопользовательской среде почемы бы и нет, для небольших файлов.
Но стоит только вспомнить, что файл могут редактировать несколько юзеров, и становится сразу понятно, что дерево в памяти здесь не поможет.
Так что продолжай зубрить мануалы и верить в волшебников.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #84 - 26. Октября 2007 :: 10:06
Печать  
orefkov писал(а) 26. Октября 2007 :: 10:03:
Так что продолжай зубрить мануалы и верить в волшебников.

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #85 - 26. Октября 2007 :: 10:09
Печать  
Uzhast писал(а) 26. Октября 2007 :: 10:06:
orefkov писал(а) 26. Октября 2007 :: 10:03:
Так что продолжай зубрить мануалы и верить в волшебников.

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

Нет, я всегда помню, что вижу дальше лишь потому, что я карлик, стоящий на плечах гигантов.
И издеваюсь я не над изучением мануалов, а над их бездумным зубрением, без каких-либо попыток понять, что за ними стоит, и как это работает на самом деле.
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #86 - 26. Октября 2007 :: 10:25
Печать  
orefkov писал(а) 26. Октября 2007 :: 10:09:
И издеваюсь я не над изучением мануалов, а над их бездумным зубрением, без каких-либо попыток понять, что за ними стоит, и как это работает на самом деле.

У тебя не то что зубрения, у тебя элементарного знания мануалов нет. И ты это в этой ветке блестяще продемонстрировал. Ты показал, что не знаешь ни что такое физический номер записи, ни что существует возможность перехода от физ. номера к упорядоченной выборке. Продолжай огрызаться дальше. Но фактов это не изменит.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #87 - 26. Октября 2007 :: 10:45
Печать  
Братцы, мне очень нравится сама дискуссия и ваше витруозное владение русским языком и разговорной речью.
Совершенно искренне, иные обороты просто завораживает.

Но не надо торопиться.
Возможно стоит сделать некоторые тесты, которые подтверждают эффективность или неэффективность определенного подхода для DBF.

Скажем, для SQL мне не удалось для упорядочивания и для поиска (т.е. при проверке идеи разделения функций ключей) получить два Index Seek.
Только Index Seek + Index Scan.
Либо Index Scan + Bookmark lookup по индексу упорядочивания.
Это для двух индексов - уникальному (для позиционирования) и неуникальному для упорядочивания.

Для ИТ позиционирование в индексе по номеру физической записи - это также index scan, либо вычисление ключа + index seek + небольшой scan.

SQL, кстати, также мог бы делать index seek + index seek + небольшой scan, но не хочет.

Как обстоят дела для DBF - надо исследовать.
По вашей дискуссии однозначные выводы сделать пока нельзя - значит не надо ее завершать на полдороге.


P.S.
Разбив шахматную доску о голову оппонента сложно выиграть партию.
У меня обычно не получалось, даже когда я был абсолютно прав.
  

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



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #88 - 26. Октября 2007 :: 11:07
Печать  
kms писал(а) 26. Октября 2007 :: 10:45:
Только Index Seek + Index Scan.
Либо Index Scan + Bookmark lookup по индексу упорядочивания.

index scan появляется так как запрос получается ранжированый - с этого места по вооон то он сканирует индекс.
bookmark появляется только из-за того, что не все данные, которые ты просишь показать в ТП, лежат в индексе. Поэтому скуль спукается к самим данным.
  
Наверх
ICQ  
IP записан
 
Salimbek
God Member
*****
Отсутствует



Сообщений: 862
Зарегистрирован: 06. Июня 2006
Пол: Мужской
Re: 1sqlite
Ответ #89 - 26. Октября 2007 :: 11:12
Печать  
Uzhast - ты меня извини, но я в этом споре поддерживаю Орефкова. Ибо его точка зрения для меня более убедительна. Например тот алгоритм, про который ты говоришь "шаткое предположение" - совпадает с тем, который реализовал бы я, если б мне пришлось решать подобную задачу.
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #90 - 26. Октября 2007 :: 11:13
Печать  
spock писал(а) 26. Октября 2007 :: 11:07:
kms писал(а) 26. Октября 2007 :: 10:45:
Только Index Seek + Index Scan.
Либо Index Scan + Bookmark lookup по индексу упорядочивания.

index scan появляется так как запрос получается ранжированый - с этого места по вооон то он сканирует индекс.
bookmark появляется только из-за того, что не все данные, которые ты просишь показать в ТП, лежат в индексе. Поэтому скуль спукается к самим данным.

Выводы неверные.
Но это я сам неправ, запрос не показал.
Код
Выбрать все
select top 20 * from sc84
where id > '   58O   '
order by parentid, isfolder, descr, row_id
 


Можно использовать индексные хинты, добиваясь разного подхода со стороны оптимизатора, но смысл примерно один.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #91 - 26. Октября 2007 :: 11:16
Печать  
Salimbek писал(а) 26. Октября 2007 :: 11:12:
Uzhast - ты меня извини, но я в этом споре поддерживаю Орефкова. Ибо его точка зрения для меня более убедительна. Например тот алгоритм, про который ты говоришь "шаткое предположение" - совпадает с тем, который реализовал бы я, если б мне пришлось решать подобную задачу.

Не надо никого поддерживать.
Здесь же не голосованием вопросы решаются.

Если есть официальное подтверждение той или иной позиции, давайте его в студию.
Либо эксперементальные выкладки - тоже сойдет.

Иначе мы опять будем перетирать чистые умозаключения - это бесперспективно.
  

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



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #92 - 26. Октября 2007 :: 11:17
Печать  
Цитата:
Выводы неверные.

у тебя есть возможность поправить свое сообщение иначе разберу по косточкам Улыбка
  
Наверх
ICQ  
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #93 - 26. Октября 2007 :: 11:18
Печать  
Цитата:
Можно использовать индексные хинты, добиваясь разного подхода со стороны оптимизатора, но смысл примерно один.

хинтами можно только усложнить себе жизнь - индексные хинты не наш путь.
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #94 - 26. Октября 2007 :: 11:19
Печать  
Вот kms понимает, о чем я говорю.
А индексы - они и в Африке индексы, что в SQL, что в DBF.
И работа с ними везде одинакова.

А с Uzhast'ом скорее всего, мы просто ведем дисскуссию, каждый думая о своем, и совершенно о разном Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #95 - 26. Октября 2007 :: 11:19
Печать  
spock писал(а) 26. Октября 2007 :: 11:17:
Цитата:
Выводы неверные.

у тебя есть возможность поправить свое сообщение иначе разберу по косточкам Улыбка

Ой.
Начитался классиков, что ли? Смех
  

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



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #96 - 26. Октября 2007 :: 11:22
Печать  
kms писал(а) 26. Октября 2007 :: 11:19:
Начитался классиков, что ли? Смех

конечно, как же без классиков.
  
Наверх
ICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #97 - 26. Октября 2007 :: 13:18
Печать  
Что то в sqllite.ert не работает
Код
Выбрать все
select * from Номенклатура
where Номенклатура.Ширина=0.00 


Хотя
Код
Выбрать все
select * from Номенклатура
where Номенклатура.Ширина>=0.00 


работает нормально.

По ширине индекса нет.

По предварительным тестам - простые индексы работают не хуже Fox ( на локалке тестил )-
на сервере опасаюсь - какие-то траблы прошлый раз пошли с работой Fox после запуска sqllite.

Предложение IN не оптимизировано (в 22 раза медленнее "=" ).
Предложение Between дало пустой результат.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #98 - 26. Октября 2007 :: 13:38
Печать  
Пожалуй, даже SQlLite быстрее при полном попадании в индекс
Все это очень радует Улыбка
Вопрос - как обращаться к регистрам и журналу  - хочется проверить работу с индексными выражениями
и JOIN
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #99 - 26. Октября 2007 :: 13:47
Печать  
Смотрим старовый топик.
Давайте пока на справочниках отладим правильную работу с индексами.
Потом за журналы и документы примемся.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #100 - 26. Октября 2007 :: 13:49
Печать  
kiruha писал(а) 26. Октября 2007 :: 13:38:
Пожалуй, даже SQlLite быстрее при полном попадании в индекс
Все это очень радует Улыбка
Вопрос - как обращаться к регистрам и журналу  - хочется проверить работу с индексными выражениями
и JOIN

JOINы можно пока и на справочниках потестить, подцеплять реквизиты по id.
С условием IN трабла.
При работе со своими таблицами SQLite его нормально оптимизирует, а вот когда обращение к виртуальной таблице, он тупо меня даже не спрашивает, а делает full scan, и проверяет на попадание в список.
Вместо того, чтобы сделать выборку из виртуальной таблицы для каждого значения в in.
А вот если запихать все из in во временную таблицу, и сделать с ней join, то нормально.
  
Наверх
 
IP записан
 
spock
1c++ developer
1c++ moderator
Отсутствует



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #101 - 26. Октября 2007 :: 14:01
Печать  
Цитата:
а делает full scan

А как sqlite работает с OR?
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #102 - 26. Октября 2007 :: 14:26
Печать  
spock писал(а) 26. Октября 2007 :: 14:01:
Цитата:
а делает full scan

А как sqlite работает с OR?

http://www.sqlite.org/optoverview.html
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #103 - 26. Октября 2007 :: 14:34
Печать  
JOIN отрабатыват нормально по Id.
Код тоже ловится.

Условия на реквизиты отрабатываются неверно.
Хотя судя по скорости выполнения с ">"индекс UPPER(sp3677)+UPPER(descr) ловится
но результат не очень понятный.

LiKE отработал верно, но тоже в 29 раз медленнее.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #104 - 26. Октября 2007 :: 14:43
Печать  
orefkov писал(а) 26. Октября 2007 :: 08:30:
Z1 писал(а) 26. Октября 2007 :: 07:37:
Вечером постараюсь выложить тест с цифрами.
Получается что для связка 1с sql +
виртуальная таблица sqlite работает значительно быстрее чем скопированная в память родная таблица sqlite на реальном большом справочнике Клиенты.
Очень неожиданный положительный результат.
Для 1с dbf такого нет.( т.е. родная sqlite таблица быстрее чем вирт таблица )
Также компонента 1.4 на родной sqlite таблице работает чуть быстрее
чем с версией 1.0 1csqlite.dll, если надо то тоже выложу эти цифры.

Немного недопонял.
Если база не дбф, ВК не отображает таблицы 1С как виртуальные таблицы.

Это я ошибся запускал Запрос.Выполнить() думал все выполняется, ан-нет там
наверное просто заглушка.
Еще идея может и бредовая некоторые таблицы справочники (редко изменяемые )
скопировать в родную sqlite таблицу ( "INSERT INTO  Кл_1 SELECT Клиенты.ID,Клиенты.Descr from Клиенты, где таблица Клиенты виртуальная, а Кл_1 родная )  и далее обращаться к ней.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #105 - 26. Октября 2007 :: 14:47
Печать  
orefkov

1. из вчерашнего осталось только

select * from Номенклатура
where parentid = '     0   '
and isfolder = 1
and descr > 'У'


дает пустой запрос, хотя
элементы, удовлетворяющие условию, есть


select * from Номенклатура
where parentid = '     0   '
and isfolder = 1
and descr < 'У'

"<", "!=", "-" - отрабатывает нормально.


select * from Номенклатура
where parentid = '     0   '
and isfolder = 1
and descr > 'У'
order by descr

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


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

select Н1.descr, Н2.descr from Номенклатура Н1
left join Номенклатура Н2
on Н1.parentid = Н2.id


вот так - результат другой

select Н1.descr, Н2.descr from Номенклатура Н1
join Номенклатура Н2
on Н1.parentid = Н2.id


для обоих вариантов значения Н1.descr и Н2.descr одинаковые (это неверно)
в первом варианте выдает всего две строки


full join
right join

на том же тесте выдают пустой результат (==0) без объяснения причин.
Когда ты добавишь обработку ошибок, настанет праздник.

3. Для реквизита, по которому стоит галка "Отбор" (флажок, возможные значения 0 и 1)

select * from Номенклатура
where _фпНеВключатьВПрайс = 0

Все отлично, включая выбор индекса


select * from Номенклатура
where _фпНеВключатьВПрайс > 0

В результат попадают _все_ строки (условие не учитывается), хотя выбор индекса правильный

Условие "=1" ">1" выдают одинаковый результат, соответствующий "=1" (для ">1" должен быть пустой результат).

Условие "!=1" не учитывается (выдаются все строки), индекс не используется
Код
Выбрать все
6	Integer	1	0
7	Eq	355	50	collseq(BINARY)
 



4. (добавлено 10.27 0:22)

select * from Номенклатура
where parentid = '     0   '
and isfolder = 1
and descr < 'У'
order by descr

как оказалось, неверно отрабатывает
без упорядочивания дает 56 строк (похоже на правду), с упорядочиванием - только 7.
« Последняя редакция: 26. Октября 2007 :: 20:37 - kms »  

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



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #106 - 26. Октября 2007 :: 15:47
Печать  
kms, расскажи про выводы?
Какие они у тебя?
  
Наверх
ICQ  
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #107 - 26. Октября 2007 :: 15:59
Печать  
spock писал(а) 26. Октября 2007 :: 15:47:
kms, расскажи про выводы?
Какие они у тебя?

Чето лениво уже на сегодня.

А ты чего заинтересовался?
Есть мысли по эффективному разделению функций ключа по позиционированию и сортировке?
  

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



Сообщений: 822
Местоположение: Новосибирск
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #108 - 26. Октября 2007 :: 16:51
Печать  
kms писал(а) 26. Октября 2007 :: 15:59:
А ты чего заинтересовался?

Хотел тему развить.

Цитата:
Есть мысли по эффективному разделению функций ключа по позиционированию и сортировке?

Добавить поле id в индекс pdescr. Класс
  
Наверх
ICQ  
IP записан
 
Arta
1c++ power user
Отсутствует



Сообщений: 2537
Местоположение: Нижний Новгород
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #109 - 26. Октября 2007 :: 16:56
Печать  
Касаемо индексов - у меня в SQL - неограниченное кол-во индексов, делаю там, где они мне необходимы. Для этого надо было подправить одну процедуру на сервере. Описание этой махинации опубликовано на софтпоинте.

Почему так нельзя сделать на тех же dbf базах?
Запретить 1С-ке также проверять индексы, начинающиеся на определенные слова. у меня индексы типа TC_*** 1С-кой при старте не проверяются, соответственно ошибка не выдается.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #110 - 26. Октября 2007 :: 19:20
Печать  
orefkov писал(а) 20. Октября 2007 :: 04:52:

Версия 1.0.0.5
Пофиксены баги, найденные kms'ом и другими.
Ускорена работа с индексами.
Просьба затестить.
Особенно условия в where, join.
Как реагирует на order by.



ert файл остался на работе, а в приложенном zip только dll
Нельзя тестовый файл выложить?
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #111 - 26. Октября 2007 :: 20:35
Печать  
kiruha писал(а) 26. Октября 2007 :: 19:20:
ert файл остался на работе, а в приложенном zip только dll
Нельзя тестовый файл выложить?

Почти оригинальный 1004
  

1sqlite_001.ert ( 31 KB | Загрузки )

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #112 - 27. Октября 2007 :: 11:15
Печать  
Цитата:
Вот kms понимает, о чем я говорю.
А индексы - они и в Африке индексы, что в SQL, что в DBF.
И работа с ними везде одинакова.

Не везде, а в MSSQL и DBF. А "везде" работа с индексами совсем не одинакова.

kms писал(а) 26. Октября 2007 :: 10:45:
Как обстоят дела для DBF - надо исследовать.

Не понял. Что конкретно надо исследовать? Вроде бы в DBF всегда используется максимум INDEX SEEK?

Вообще, DBase использует свои подходы и к нему нельзя подходить с мерками MSSQL (или, еще того хуже, даже без чтения документации), потому что можно проглядеть что-нибудь полезное и получить решение хуже, чем оно могло бы быть.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #113 - 27. Октября 2007 :: 12:03
Печать  
Uzhast писал(а) 27. Октября 2007 :: 11:15:
Не понял. Что конкретно надо исследовать? Вроде бы в DBF всегда используется максимум INDEX SEEK?

Если за веселый пятничный вечер Улыбка я не позабыл каких-либо необходимых подробностей,
вопрос, вызвавший разногласия, можно свести к некоторой элементарной операции.

1. Пусть у нас есть DBF таблица и ее индекс 'И1'
2. Допустим, нам известна некоторая точка привязки 'X1'.
Видимо, для DBF, это будет адрес заданной физической записи в таблице.
Неважно, как мы ее нашли, это ноу-хау, которое никто не должен знать.
3. Мы хотим выбрать N строк подряд по индексу 'И1', начиная с первой строки, большей X1 (в терминах индекса 'И1')

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

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #114 - 27. Октября 2007 :: 12:12
Печать  
kms писал(а) 27. Октября 2007 :: 12:03:
Проблема: оценить затраты на осуществление данной операции.
Видимо, для этого нам нужно понять алгоритм, по которому эта операция будет осуществляться.

Алгоритм не хуже, чем INDEX SEEK. Естественно, чтобы позионироваться B-дереве индекса Фоксу нужно время, отличное от константы (о чем нам как о каком-то откровении поведал Злобный карл).

В большом журнале позиционирование по номеру+SKIP работает очень быстро. Так что эффективность подхода проверена на практике. Более того, этот подход используется уже столько лет, сколько используются xBase-подобные системы.

Может быть ситуация, когда одному значению индексного выражения соответствует несколько записей, но замедлением от такой ситуации можно пренебречь. Это уже проблемы программиста - пользователя провайдера. Если в таблице слишком много повторяющихся записей (с точки зрения индексного выражения), то использование в этой ситуации провайдера с данным индексным выражением - архитектурный просчет программиста - пользователя провайдера. Любой инструмент можно использовать неправильно и отвественность за это должен нести пользователь инструмента, а не его создатель.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #115 - 27. Октября 2007 :: 12:31
Печать  
Uzhast
Т.е., если отбросить лирику, то описанный тобой алгоритм по затратам совпадает с тем, что описал orefkov в
http://www.1cpp.ru/forum/YaBB.pl?num=1192855975/79#79
Так?

Кстати, для меня осталось непонятным, как с помощью
Цитата:

SKIP   [nRecords]   [IN nWorkArea | cTableAlias]
If the table has a master controlling index tag or index file, SKIP moves the record pointer to the record determined by the index sequence.

можно перейти к следующей записи от конкретной физической точки X1 по конкретному индексу И1?
А как по другому индексу (скажем, И2)?

Я то тебе могу сразу сказать, что документацию на FoxPro вижу первый раз в жизни.
Так что эту часть протокола можно пропустить Улыбка
Но стало интересно.
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #116 - 27. Октября 2007 :: 12:44
Печать  
kms писал(а) 27. Октября 2007 :: 12:31:
Т.е., если отбросить лирику, то описанный тобой алгоритм по затратам совпадает с тем, что описал orefkov в
http://www.1cpp.ru/forum/YaBB.pl?num=1192855975/79#79

ВЕРОЯТНО, не будет СКАНИРОВАНИЯ, если есть несколько записей с одинаковым значением индексного выражения. В целом описанный алгоритм верен. И, если бы Злобный карл читал документацию, то понять его он мог бы еще в первом моем посте, когда я описывал работу с физическими номерами и SKIP. Блин, kms, извини, никак остановится не могу Печаль Пошел за успокоительным

kms писал(а) 27. Октября 2007 :: 12:31:
Кстати, для меня осталось непонятным, как с помощью
Цитата:

SKIP   [nRecords]   [IN nWorkArea | cTableAlias]
If the table has a master controlling index tag or index file, SKIP moves the record pointer to the record determined by the index sequence.

можно перейти к следующей записи от конкретной физической точки X1 по конкретному индексу И1?

Фокс находит позицию этой записи в B-дереве индекса. Соответственно, получение следующей записи в порядке упорядочивания индекса - тривиально.
kms писал(а) 27. Октября 2007 :: 12:31:
А как по другому индексу (скажем, И2)?

Сделать SET ORDER для И2. И тогда SKIP уже будет использовать этот индекс. Возможно, плохо, что у SKIP'а два режима работы ("сырой" и "индексированный"), что запутывает. Однако, так удобнее.

kms писал(а) 27. Октября 2007 :: 12:31:
Я то тебе могу сразу сказать, что документацию на FoxPro вижу первый раз в жизни.
Так что эту часть протокола можно пропустить Улыбка

Хорошо, пропускаю. Улыбка То, что не читал, это нормально. Все мы что-то да не читали, у всех лень Улыбка Или времени не хватает. Вот только мало кто, совершенно не читав документацию, берется с апломбом рассуждать о вопросах, о которых не имеет представления. Блин, опять поперло Печаль
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #117 - 27. Октября 2007 :: 12:50
Печать  
Uzhast

ОК, вот, кстати, тема, которая явилась началом дискуссии:
http://www.1cpp.ru/forum/YaBB.pl?num=1192855975/64#64

Цитата:
Если ты используешь индекс для упорядочивания, то перейти по физическому номеру записи невозможно.
Кроме как full-scan'ом.
Так-что возможный алгоритм мог бы быть такой (для случая выборки следующих строк) :
1. Делаем index seek по ключу.
2. Сканируем по индексу дальше, ища запись с нужным физическим номером.
3. Получаем следующие записи.

Здесь можно сразу было поймать на словах "full-scan", которые, конечно, не соответствуют действительности.
Т.е. соответствовать могут, но 99.9% не соответствуют, ибо скорее всего алгоритмы типа seek с нужными блокировками все же будут эффективнее.

Однако обсудить хотелось бы вот что:
Цитата:
Однако этот алгоритм неверен. Во-первых, ключ этой записи уже мог изменится.
(Другой юзер уже переименовал, удалил, перенес в другую группу)
В лучшем случае новый ключ записи больше старого, и рано или поздно, двигаясь
по индкесу, мы до нее дойдем. В худшем - новый ключ меньше, либо отсутствует.
В этом случае вообще ничего не найдем.

Так безопасен ли алгоритм, в котором мы
1. Позиционируемся на строку по индексу И0
2. Вычисляем ключ К1 строки для индекса И1 и запоминаем физический адрес X1
3. Позиционируемся (допустим, seek) по ключу К1 по индексу И1
4. Проматываем строки по индексу И1, пока не достигнем адреса X1
5. Выбираем (и возвращаем) строки по индексу И1, после точки привязки X1

Вопрос:
A. Так ли работает твой провайдер?
Б. Безопасен ли алгоритм?

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

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #118 - 27. Октября 2007 :: 13:04
Печать  
kms писал(а) 27. Октября 2007 :: 12:50:
Однако обсудить хотелось бы вот что:
Цитата:
Однако этот алгоритм неверен. Во-первых, ключ этой записи уже мог изменится.
(Другой юзер уже переименовал, удалил, перенес в другую группу)
В лучшем случае новый ключ записи больше старого, и рано или поздно, двигаясь
по индкесу, мы до нее дойдем. В худшем - новый ключ меньше, либо отсутствует.
В этом случае вообще ничего не найдем.

Так безопасен ли алгоритм, в котором мы
1. Позиционируемся на строку по индексу И0
2. Вычисляем ключ К1 строки для индекса И1 и запоминаем физический адрес X1
3. Позиционируемся (допустим, seek) по ключу К1 по индексу И1
4. Проматываем строки по индексу И1, пока не достигнем адреса X1
5. Выбираем (и возвращаем) строки по индексу И1, после точки привязки X1

Вопрос:
A. Так ли работает твой провайдер?
Б. Безопасен ли алгоритм?

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

А. Примерно, так, но использует физ.номера записей.
Б. Алгоритм, ИМХО, вполне безопасен с оговорками:
1) Возможны некоторые небольшие отрицательные эффекты в ТП, если в конфигурации применяется удаление записей без контроля ссылочной целостности.
2) В случае изменения полей первой отображаемой в ТП записи таким образом, что меняется положение записи в упорядоченной последовательности, то провайдер сработает ПО ДРУГОМУ алгоритму, чем используется в ODBC-провайдере (и предлагается некоторыми товарищами). А именно, будут отображены записи, начиная с нового значения выражения упорядочивания. Я не считаю такое поведение ошибочным, хотя с определенной точки зрения это и можно посчитать ошибкой. С другой точки зрения подобное поведение даже более правильное (если более важным считать подход, когда первая видимая строка не меняется). Вообще, я считаю нехорошим явлением, что некоторые личности считают подход ODBC-провайдера единственно верным. Оба подхода могут быть полезны и вредны в различных условиях.

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #119 - 27. Октября 2007 :: 13:50
Печать  
Ну, вот, почти готово.
Для того, что окончательно понять стоимость разделения индексов поиска и сортировки, осталось добавить последний штрих.

А именно - надо понять, каким образом SKIP выполняет позиционирование.
Еще точнее - может ли запись, на которую мы позиционируемся, измениться за время выполнения SKIP.

Поясню.
Если SKIP действует с алгоритмом не хуже SEEK, значит он либо
1. может промахнуться мимо нужной физической записи, если за время выполнения SKIP запись будет изменена
2. на время операции накладывается табличная блокировка
=== edited === это я перегрелся, наверное. блокировки текущей записи должно хватить ===
3. Либо... это не SEEK Улыбка

Как бы это проверить?


P.S.
У меня на работе в шкафу всегда есть коньяк. Много. Нет, не покупаю. Улыбка
Сам у себя бываю редким гостем - лучше лишний раз буду трезвым, чем без машины.
Но для урегулирования различных рабочих споров штука абсолютно магическая. Улыбка
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #120 - 27. Октября 2007 :: 13:57
Печать  
kms писал(а) 27. Октября 2007 :: 13:50:
Если SKIP действует с алгоритмом не хуже SEEK, значит он либо
1. может промахнуться мимо нужной физической записи, если за время выполнения SKIP запись будет изменена
2. на время операции накладывается табличная блокировка
3. Либо... это не SEEK Улыбка

Как бы это проверить?

SKIP как раз работает (условно) за константное время. Со сложностью SEEK работает GOTO при установленном индексе. Или, вероятно, SET ORDER, если мы спозиционированы на записи.

Табличная блокировка автоматом накладывается Фоксом при (всех?) операциях. Поэтому SEEK должен быть атомарным. Но в патченном vfpoledb.dll блокировки отсутствуют и тут да, может выйти облом. Правда, не понятно, насколько лучше здесь обстоят дела у самой 1С - не удивлюсь, что у нее там то же самое. Улыбка

Для проверки можно, наверное, параллельно запустить два процесса: один будет постоянно сикать (при помощи GOTO или напрямую) и брать некоторое (неизменямое) поле. А второй процесс может постоянно менять поле, входящее в индексное выражение. Соответственно, или что-то вылетит, или Фокс получит левое значение в первом процессе. Как-то так... Улыбка
  
Наверх
 
IP записан
 
Uzhast
1c++ power user
Отсутствует



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #121 - 27. Октября 2007 :: 14:06
Печать  
Uzhast писал(а) 27. Октября 2007 :: 13:57:
SKIP как раз работает (условно) за константное время.

Эээ... ну, при условии, конечно, что мы каждый раз перемещаемся на фиксированное количество записей, например, на 1 Улыбка Для перемещения на разное количество записей в порядке упорядочивания будет нужно разное время (алгоритм линейный, скорее всего).
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #122 - 27. Октября 2007 :: 14:11
Печать  
Я там чуть поправил - в принципе, достаточно блокировки записи.

Uzhast
ОК, пишу свою первую программу "хелловорлд" на фоксе.
Типа для ТП с разделением индексов.

1. SET ORDER TO IDD
2. GOTO НЕКИЙ_ID (как это правильно написать?)
3. LOCK текущая_запись
4. SET ORDER TO PDESCR // после этого мы готовы двигаться дальше по PDESCR с текущей записи, или нет?
5. SKIP 1
6. UNLOCK та_самая_запись

Подкорректируй, плз, как это должно правильно выглядеть, а я сложность прикину.
Ну смысл тот же - позиционируемся по одному индексу и дальше пляшем по другому.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #123 - 27. Октября 2007 :: 14:12
Печать  
Uzhast писал(а) 27. Октября 2007 :: 14:06:
Uzhast писал(а) 27. Октября 2007 :: 13:57:
SKIP как раз работает (условно) за константное время.

Эээ... ну, при условии, конечно, что мы каждый раз перемещаемся на фиксированное количество записей, например, на 1 Улыбка Для перемещения на разное количество записей в порядке упорядочивания будет нужно разное время (алгоритм линейный, скорее всего).

Я добрый карл, не бойсо, дядька  Подмигивание
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #124 - 27. Октября 2007 :: 14:29
Печать  
kms писал(а) 27. Октября 2007 :: 14:11:
ОК, пишу свою первую программу "хелловорлд" на фоксе.
Типа для ТП с разделением индексов.

1. SET ORDER TO IDD
2. GOTO НЕКИЙ_ID (как это правильно написать)
3. LOCK текущая_запись
4. SET ORDER TO PDESCR // после этого мы готовы двигаться дальше по PDESCR с текущей записи, или нет?
5. SKIP 1
6. UNLOCK та_самая_запись

Подкорректируй, плз, как это должно правильно выглядеть, а я сложность прикину.
Ну смысл тот же - позиционируемся по одному индеку и дальше пляшем по другому.

Я Фокс знаю плохо (работал с ним очень давно). Но раз пришлось использовать prg, кое-что пришлось освоить Улыбка Но попробую скорректировать. Если сразу не заработает - извини Улыбка
1. SET ORDER TO TAG ИмяТега OF ИмяФайлаМожноБезРасширенияCDX
2. GOTO НЕКИЙ_ID (как это правильно написать)
Так. GOTO нужен физ.номер записи, а не IDD. Поэтому либо надо сначала узнать этот номер (при помощи SEEK), либо сразу сделать SEEK:
SEEK ЗначениеИД
После этого мы будем стоят на записи с нужным ИД. Или не будем.

3. LOCK - функция, принимающая список номеров записей через запятую в виде строки: LOCK('1,2,3,4', НомерРабочейОбластиИзКомандыUSEИлиПсевдонимТаблицыИзUSE). Номер текущей записи можно получить через функцию RECNO ()

4. SET ORDER TO PDESCR // после этого мы готовы двигаться дальше по PDESCR с текущей записи, или нет?
Не уверен, но, скорее всего (с большой долей вероятности), готовы. Если не получится, то всегда можно сделать GOTO на номер записи, полученный через RECNO () после SEEK.

5. SKIP 1

6. UNLOCK та_самая_запись
Синтаксис
Цитата:
UNLOCK    [RECORD nRecordNumber]   [IN nWorkArea | cTableAlias]   [ALL]

Т.е. можно для простоты использовать UNLOCK ALL

Как я понимаю, еще опущены детали типа USE Улыбка
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #125 - 27. Октября 2007 :: 14:38
Печать  
Ага, спасибо за ликбез.
Все почти понятно, включая затраты на позиционирование в новом индексе по физическому номеру.
Эти затраты, видимо в виде логарифма, сидят или в SET ORDER или, если он нужен, в последующем GOTO.

До SEEK уже додумался, но не понял вот что.
Нам нужен не сам SEEK, а некий UPPER_BOUND, т.е. строка с ключем, большим чем Некий_ID.
Причем гарантированно возвращающий либо нужную строку, либо EOF.

Как бы это сделать?
Еще немного, еще чуть-чуть Улыбка
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #126 - 27. Октября 2007 :: 14:42
Печать  
kms писал(а) 27. Октября 2007 :: 14:38:
Нам нужен не сам SEEK, а некий UPPER_BOUND, т.е. строка с ключем, большим чем Некий_ID.

Дайте угадаю.
Что-то типа SET NEAR нужно?
  

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



Сообщений: 1341
Зарегистрирован: 30. Августа 2006
Пол: Мужской
Re: 1sqlite
Ответ #127 - 27. Октября 2007 :: 14:44
Печать  
kms писал(а) 27. Октября 2007 :: 14:42:
Дайте угадаю.
Что-то типа SET NEAR нужно?

Вообще, да Улыбка Но по умолчанию оно и так стоит в OFF Улыбка

http://msdn2.microsoft.com/en-us/library/ecksawtb(VS.80).aspx
Цитата:
OFF

(Default) Positions the record pointer at the end of the table if a record search using FIND or SEEK is unsuccessful. With this setting, RECNO( ) returns the number of records in the table plus 1, FOUND( ) returns false (.F.), and EOF( ) returns true (.T.).

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #128 - 27. Октября 2007 :: 20:44
Печать  
Uzhast писал(а) 27. Октября 2007 :: 14:44:
Вообще, да Улыбка Но по умолчанию оно и так стоит в OFF Улыбка

Для upper_bound я бы попробовал поставить скорее в ON.
В OFF будет пролетать со свистом до самого конца (или начала).

Цитата:
If SET NEAR is on, the record pointer is positioned immediately after the record with the closest index key. If SET NEAR is off, the record pointer is positioned at the end of the file. In either case, RECNO() returns the record number of the closest record.

T.e. схематично на ломаном русском upper_bound, видимо, можно записать как-то так:

SET NEAR ON
SEEK(IDD)
IF (FOUND)
  SKIP(1)
ENDIF

Здесь, правда, вижу тонкий момент в понятии 'closest index key', надеюсь мои представления не расходятся с представлениями авторов документации.
  

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #129 - 27. Октября 2007 :: 21:03
Печать  
Ну да ладно, оставим пока Foxpro, все же ветка тематическая, а исходный сюжет уже едва различим на фоне прочей лирики.

Разве что в итоге можно резюмировать, что если я ничего не забыл, то можно надеяться, что алгоритм с переходом от позиционирования по одному индексу к сортировке по другому
1. Привносит некие близкие к логарифмическим (или не сильно хуже) затраты на позиционирование в индексе по адресу записи
2. Является безопасным при использовании табличной блокировки
(возможно, достаточно блокировки текущей записи, но есть подозрение, что перестроение индекса в момент выполнения перепозиционирования на физ. запись в этом случае может пройти некорректно)
3. Выполняет привязку не к логической, а к физической строке - с соответствующим поведением при изменении ключа упорядочивания в строке привязки.


Ну а уж выводы из этого делать дураков нет.
Водки не нальют, а клюшкой по каске схлопотать вполне возможно.


Все! Объявляются выходные.
Не забудьте перевести часы и сменить батарейки на зимние.
« Последняя редакция: 28. Октября 2007 :: 09:11 - kms »  

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #130 - 28. Октября 2007 :: 08:37
Печать  
Итак, кратко резюмируем итоги дискуссии.
Напомню, с чего она начиналась:
Цитата:
Вопрос знатокам индексов dbf файлов.
Сравниваю индексы в dd и в dds.
Справочники:
В sql есть индекс:
PARENTID,ISFOLDER,DESCR,ROW_ID - можно использовать как уникальный ключ для поставщика данных ТП.
В дбф:
PARENTID,ISFOLDER,DESCR(UPPER) - получается, нельзя использовать как уникальный ключ записи?
Или таки в дбф-индексы всегда неявно входит номер записи?

Вопрос возник всвязи с организацией провайдера ТП для баз SQLite, а в частности, использованию в нем виртуальных таблиц, отображающих родные таблицы 1С в дбф-версии.
Основная задача провайдера ТП - опираясь на данные о текущей строке ТП, выдать N следующих/предыдущих записей, которая суть преобразуется в следующую:
спозиционироваться в индексе на узле, следующим/предыдущем за узлом, представляющем текущую запись.

В системах на базе SQL, и в SQLite в частности, не оперируют таким понятием, как физический номер записи, и соответственно, возникает требование об уникальности индекса упорядочивания.

И как выяснилось в ходе дискуссии, таки да, в индексы для ДБФ файлов всегда неявно входит физический номер записи, что позволяет, используя его как дополнительный ключ, спозиционироваться в индексе.
При этом, поведение SQL и DBF провайдеров различаются - SQL будет всегда выдавать записи от СТАРОГО положения записи, а DBF - от текущего, которое могло изменится с прошлой выборки данных.

И чтобы иметь возможность совместить DBF-подход с движком SQLite в плане организации провайдера, необходимо расширить ключ, представляющий индекс дбф-файла, дополнив его номером физической записи, напрмер, создав виртальное поле таблицы, возвращающей индексный ключ + номер записи. Например,

order by Номенклатура.PARENTID_ISFOLDER_DESCR_ROW

где PARENTID_ISFOLDER_DESCR_ROW будет возвращать например

'     1   2Всякая всячина                                  AC12'

А в реализации выборки из дбф-таблиц учитывать этот переданный номер записи.
Либо перейдя в индексе по ключу и ручками досканировать несколько записей, сверяя номера строк
(тогда поведение будет как в ODBC-провайдере, новые записи будут выдаваться от старого положения записи),
либо попробовать фокспро трюк - SET ORDER GOTO запись, если убедимся, что движок 1С поддерживает эту фичу
(тогда поведение будет как в 1С-курсорах, новые записи будут выдаваться от нового положения записи).

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

Всем спасибо за увлекательное обсуждения. Для себя вопрос считаю закрытым.

Да, кстати, щас еще подумал. Можно сделать одно виртульное поле: например, RecNum, и считать, что оно входит в конец любого индекса, а также само-по себе образует еще один индекс (обход в порядке номеров записей)
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #131 - 28. Октября 2007 :: 09:28
Печать  
orefkov писал(а) 28. Октября 2007 :: 08:37:
Да, кстати, щас еще подумал. Можно сделать одно виртульное поле: например, RecNum, и считать, что оно входит в конец любого индекса, а также само-по себе образует еще один индекс (обход в порядке номеров записей)

Было бы неплохо, как раз вчера на эту тему думал.
Тем более, что прочих индексов может и не быть, если ты, конечно, сделаешь еще возможность подключения внешних DBF.
  

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #132 - 28. Октября 2007 :: 17:19
Печать  
Тест dll от 26 вечер

Типовая торговля демо
Код
Выбрать все
Select * from Номенклатура
where Номенклатура.МинОстаток=2.000 



0 строк - в реальности одна -
любимые 'Женские ботфорты коричневые                       ' Улыбка

Код
Выбрать все
Select * from Номенклатура
where МинОстаток>2.000 



121 строка  - условию не соответствует

Код
Выбрать все
Select *
from
(Select
Descr
, МинОстаток

from Номенклатура ) as СпрНом

where СпрНом.МинОстаток=2.000 



также 0 строк, хотя по идее оптимизатор должен не работать?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #133 - 28. Октября 2007 :: 17:38
Печать  
Судя по описанию оптимизатора SQLite, последний запрос он успешно "развернет" в обычный, то есть предудущий. Есть ли по МинОстаток сортировка, отбор? Сейчас все колонки таблиц отдаются движку SQlite как текстовые. Возможно, в этом засада.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #134 - 28. Октября 2007 :: 18:06
Печать  
orefkov писал(а) 28. Октября 2007 :: 17:38:
Судя по описанию оптимизатора SQLite, последний запрос он успешно "развернет" в обычный, то есть предудущий. Есть ли по МинОстаток сортировка, отбор? Сейчас все колонки таблиц отдаются движку SQlite как текстовые. Возможно, в этом засада.


Брал типовую демо 9.2
Без отбора - ошибка, с отбором - нет
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #135 - 28. Октября 2007 :: 18:14
Печать  
Да, по артикулу, который текстовый нормально.

При преобразовании в текст тоже нормально

Код
Выбрать все
Select *

from Номенклатура  as СпрНом

where СпрНом.МинОстаток='	    2.000' 

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #136 - 28. Октября 2007 :: 18:34
Печать  
Добавил МинОстаток в Контрагенты, все СпрКонтр.МинОстаток =0, отбора нет.

Код
Выбрать все
Select *

from Номенклатура  as СпрНом

left join Контрагенты as СпрКонтр on СпрНом.МинОстаток=СпрКонтр.МинОстаток

where  СпрНом.МинОстаток='	    2.000'
 


получилось непустое соединение, хотя СпрКонтр.МинОстаток все 0.
т.е. подсоединился 'Торговый дом "Новый"                              '
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #137 - 28. Октября 2007 :: 19:04
Печать  
Когда есть соответствие в Join верхний запрос  - нормально.

Такой код нормально
Код
Выбрать все
Select 1 as всего, SUM(СпрНом.МинОстаток)

from Номенклатура  as СпрНом

where  СпрНом.МинОстаток='	    2.000' or СпрНом.МинОстаток='	   10.000'

group by всего 



с добавлением left join пустой

Код
Выбрать все
Select 1 as всего, SUM(СпрНом.МинОстаток)

from Номенклатура  as СпрНом
left join Контрагенты as СпрКонтр on СпрКонтр.МинОстаток=СпрНом.МинОстаток

where  СпрНом.МинОстаток='	    2.000' or СпрНом.МинОстаток='	   10.000' 



inner join(есть один контрагент с МинОстаток='          2.000') нормально
Код
Выбрать все
Select 1 as всего, SUM(СпрНом.МинОстаток)

from Номенклатура  as СпрНом
inner join Контрагенты as СпрКонтр on СпрКонтр.МинОстаток=СпрНом.МинОстаток

where  СпрНом.МинОстаток='	    2.000' or СпрНом.МинОстаток='	   10.000' 



такое впечатление что некорректно отрабатываются пустые значения
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #138 - 28. Октября 2007 :: 19:40
Печать  
Тестирование индексного выражения при соединении таблиц
В спр Номенклатура есть реквизит Артикул с отбором
(а в справочниках Контр и номенклатура совпадающий артикул)

Код
Выбрать все
Select *

from Контрагенты as Спрконтр

left join Номенклатура as СпрНом on СпрНом.Артикул=Спрконтр.Артикул

where  Спрконтр.code=' 1828' 



судя по времени выполнения был найден и использован индекс
UPPER(sp3677)+UPPER(descr)
Это супер!!! Улыбка Это то что не умеет делать Fox.

Ошибки.
1. При отсутствии соответсвия подставляется первый элемент из Номенклатуры
2. Если СпрНом.Артикул="" тогда соединяется вся таблица Номенклатуры
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #139 - 28. Октября 2007 :: 21:11
Печать  
Здесь  программа -
http://sqliteadmin.orbmu2k.de/
SQLite Administrator - средство администрирования и редактор SQL-запросов в SQLite

Возможно ли обеспечить взаимодействие?
(ну например в цикле по метаданным скопировать в базу справочники, можно без строк, или можно лучше?)
  

main.jpg ( 86 KB | Загрузки )
main.jpg
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #140 - 29. Октября 2007 :: 10:29
Печать  
kiruha писал(а) 28. Октября 2007 :: 18:34:
Добавил МинОстаток в Контрагенты, все СпрКонтр.МинОстаток =0, отбора нет.

Код
Выбрать все
Select *

from Номенклатура  as СпрНом

left join Контрагенты as СпрКонтр on СпрНом.МинОстаток=СпрКонтр.МинОстаток

where  СпрНом.МинОстаток='	    2.000'
 


получилось непустое соединение, хотя СпрКонтр.МинОстаток все 0.
т.е. подсоединился 'Торговый дом "Новый"                              '

надо явно преобразовывать типы (  пока не разобрался как )
у меня пока получилось так правильно работает
Код
Выбрать все
where  abs(СпрНом.МинОстаток ) = 2
 


со знаком > abs() тоже правильно работает

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #141 - 29. Октября 2007 :: 10:47
Печать  
Код
Выбрать все
Select *

from Номенклатура  as СпрНом

left join Контрагенты as СпрКонтр on СпрНом.МинОстаток=СпрКонтр.МинОстаток

where  CAST(СпрНом.МинОстаток  as INTEGER)  = 2 



Дает ту же ошибку - присоединяет первого контрагента, в то время как нет СпрКонтр.МинОстаток=2

то же и с abs

И вообще - условие where только для наглядности, тестируется соединение
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #142 - 29. Октября 2007 :: 11:13
Печать  
kiruha писал(а) 29. Октября 2007 :: 10:47:
Код
Выбрать все
Select *

from Номенклатура  as СпрНом

left join Контрагенты as СпрКонтр on СпрНом.МинОстаток=СпрКонтр.МинОстаток

where  CAST(СпрНом.МинОстаток  as INTEGER)  = 2 



Дает ту же ошибку - присоединяет первого контрагента, в то время как нет СпрКонтр.МинОстаток=2

то же и с abs

И вообще - условие where только для наглядности, тестируется соединение

У меня аналогич запрос
Код
Выбрать все
Select * from Касса  as СпрКасса
left join Клиенты as СпрКлиенты on СпрКасса.Рассылка=СпрКлиенты.Рассылка
where  CAST(СпрКасса.Рассылка  as INTEGER)  = 1
 


Правильно отрабатывает
когда ставим условие
Код
Выбрать все
where  CAST(СпрКасса.Рассылка  as INTEGER)  = 2 


получаем 0 строк

(kiruha) А может дело в следущем остаток у тебя все таки real а сравниванить real на равенство проблематично для sqlite ?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #143 - 29. Октября 2007 :: 11:40
Печать  
смотрим стартовый топик.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #144 - 29. Октября 2007 :: 12:01
Печать  
kiruha писал(а) 28. Октября 2007 :: 19:40:
судя по времени выполнения был найден и использован индекс
UPPER(sp3677)+UPPER(descr)

Не надо смотреть по времени.
Поставь флаг "План запроса", и смотри, что написано для команд VFilter в колонке p3.
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #145 - 29. Октября 2007 :: 12:10
Печать  
orefkov

Саша, под эту штуку надо использовать юнит-тестирование.
Только я сам сделать сейчас не могу, только идею могу высказать. Печаль
  

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #146 - 29. Октября 2007 :: 12:22
Печать  
kms писал(а) 29. Октября 2007 :: 12:10:
orefkov

Саша, под эту штуку надо использовать юнит-тестирование.
Только я сам сделать сейчас не могу, только идею могу высказать. Печаль

И я того же мнения.
И начал подвижки в эту сторону.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #147 - 29. Октября 2007 :: 12:47
Печать  
orefkov писал(а) 29. Октября 2007 :: 12:22:
kms писал(а) 29. Октября 2007 :: 12:10:
orefkov

Саша, под эту штуку надо использовать юнит-тестирование.
Только я сам сделать сейчас не могу, только идею могу высказать. Печаль

И я того же мнения.
И начал подвижки в эту сторону.

+1
А каким образом видишь схему юнит-тестирования?
Поделишься?
Лично я предлагаю/рекомендую привязаться к конфигурации юнит-тестирования 1С++ Улыбка
Там уже есть большая куча различных тестов для классов 1С++, хорошо отработанная базовая часть юнит-тестов и т.д.
Тем более, что
1) некоторую часть ОлеДБ мы уже тестили в этой конфе
2) надеюсь, что тесты для этой ВК наверняка довольно просто будет использовать как для тестирования парсера прямых запросов в 1С++, так и для тестирования прямых запросов скуля и дбф.

Типа чего два раза писать Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #148 - 29. Октября 2007 :: 14:29
Печать  
Смотрим стартовый топик.

Вроде как на моих тестах пока все ок.
Поэтому добавил журнал, документы, регистры.

Ща планирую - надо сделать нормальный upper, lower, LIKE в SQLite, сейчас он русского не разумеет.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #149 - 29. Октября 2007 :: 14:33
Печать  
artbear писал(а) 29. Октября 2007 :: 12:47:
orefkov писал(а) 29. Октября 2007 :: 12:22:
kms писал(а) 29. Октября 2007 :: 12:10:
orefkov

Саша, под эту штуку надо использовать юнит-тестирование.
Только я сам сделать сейчас не могу, только идею могу высказать. Печаль

И я того же мнения.
И начал подвижки в эту сторону.

+1
А каким образом видишь схему юнит-тестирования?
Поделишься?
Лично я предлагаю/рекомендую привязаться к конфигурации юнит-тестирования 1С++ Улыбка
Там уже есть большая куча различных тестов для классов 1С++, хорошо отработанная базовая часть юнит-тестов и т.д.
Тем более, что
1) некоторую часть ОлеДБ мы уже тестили в этой конфе
2) надеюсь, что тесты для этой ВК наверняка довольно просто будет использовать как для тестирования парсера прямых запросов в 1С++, так и для тестирования прямых запросов скуля и дбф.

Типа чего два раза писать Улыбка

Ну, должна быть база с тестовыми данными.
К ней набор запросов.
Запросы по очереди выполняются, сверяются.
Для начала хотя бы по количеству возвращенных строк/колонок.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #150 - 29. Октября 2007 :: 14:56
Печать  
Что то пишет
в тТекст Цитата:
no such table
и дальше абракадабра.
Чтой то со шрифтами - перестал понимать русские названия таблиц

И как секцию from сейчас писать?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #151 - 29. Октября 2007 :: 15:17
Печать  
kiruha писал(а) 29. Октября 2007 :: 14:56:
Что то пишет
в тТекст Цитата:
no such table
и дальше абракадабра.
Чтой то со шрифтами - перестал понимать русские названия таблиц

И как секцию from сейчас писать?

по справочнику
Код
Выбрать все
select * from Справочник_Склады
 


  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #152 - 29. Октября 2007 :: 15:19
Печать  
Ну, объекты, подключаемые из списка "Подключаемые таблицы" сейчас подключаются как
Справочник_ЛаЛа
Документ_ЛаЛа
ДокументСтроки_ЛаЛа
Регистр_ЛаЛА
РегистрИтоги_ЛаЛА
Журнал

Подробнее можно посмотреть в коде обработки, и передалать под себя, если нужно.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #153 - 29. Октября 2007 :: 16:08
Печать  
На справочниках ОК
на журнале ,регистрах и документах
например
Код
Выбрать все
Select *
from Регистр_Касса 


выдает
Цитата:
Ошибка выполнения запроса: no such table: Регистр_Касса

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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #154 - 29. Октября 2007 :: 16:10
Печать  
orefkov

Круто.
1. Из старого неясно только вот это:

Цитата:
3. Для реквизита, по которому стоит галка "Отбор" (флажок, возможные значения 0 и 1)

select * from Номенклатура
where _фпНеВключатьВПрайс > 0

В результат попадают _все_ строки (условие не учитывается), хотя выбор индекса правильный

Видимо, та же проблема несовпадения типов?
Но почему-то при этом условия "=" отрабатываются корректно, а ">" - нет.

Условие "!=" теперь возвращает верный результат.
Но по-прежнему не использует индекс.
Ты не считаешь, что индекс должен использоваться?

2. Есть некая загадка в регистрозависимости имен регистров:

select * from Регистр_ОстаткиТМц

- не работает, хотя Регистр_ОстаткиТМЦ, Регистр_ОстаткиТмЦ - нормально.
Возможно, эта же проблема с регистр_касса этажом выше у kiruha


select * from Регистр_рПродажи

то же самое, (исходное название РПродажи)
  

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #155 - 29. Октября 2007 :: 16:14
Печать  
Где то ошибся.
по регистру работает
Код
Выбрать все
select * from Регистр_ОстаткиТоваров
select * from РегистрИтоги_ОстаткиТоваров
 


По документу тоже работает.
Так же по документу работает соеденение документа с табличной частью
  
Наверх
 
IP записан
 
kms
1c++ power user
1c++ moderator
Отсутствует


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #156 - 29. Октября 2007 :: 16:19
Печать  
kiruha писал(а) 29. Октября 2007 :: 16:08:
Ошибка выполнения запроса: no such table: Регистр_Касса

Не понятно, откуда тут UTF8 взялся. У меня русским языком пишет "no such table: Регистр_Касса"
Чуть выше написал, видимо есть регистрозависимость по-крайней мере последней буквы имени таблицы.
  

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #157 - 29. Октября 2007 :: 16:24
Печать  
Z1 писал(а) 29. Октября 2007 :: 16:14:
Где то ошибся.
по регистру работает
Код
Выбрать все
select * from Регистр_ОстаткиТоваров
select * from РегистрИтоги_ОстаткиТоваров
 


По документу тоже работает.
Так же по документу работает соеденение документа с табличной частью


У меня на тоже самое
Цитата:
Ошибка выполнения запроса: no such table: Регистр_ОстаткиТоваров

регистр подключил. Server 2003. 25 релиз платформы. Версия компоненты 1.0.0.7
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #158 - 29. Октября 2007 :: 16:27
Печать  
kms писал(а) 29. Октября 2007 :: 16:10:
orefkov

Круто.
1. Из старого неясно только вот это:

Цитата:
3. Для реквизита, по которому стоит галка "Отбор" (флажок, возможные значения 0 и 1)

select * from Номенклатура
where _фпНеВключатьВПрайс > 0

В результат попадают _все_ строки (условие не учитывается), хотя выбор индекса правильный

Видимо, та же проблема несовпадения типов?
Но почему-то при этом условия "=" отрабатываются корректно, а ">" - нет.

Условие "!=" теперь возвращает верный результат.
Но по-прежнему не использует индекс.
Ты не считаешь, что индекс должен использоваться?

2. Есть некая загадка в регистрозависимости имен регистров:

select * from Регистр_ОстаткиТМц

- не работает, хотя Регистр_ОстаткиТМЦ, Регистр_ОстаткиТмЦ - нормально.
Возможно, эта же проблема с регистр_касса этажом выше у kiruha

Причем запрос когда >= 1 отрабатывает правильно.
Правильно также отрабатывает и запрос с явным преобразованием типов
Код
Выбрать все
Select DESCR,ЭтоДиспетчер  from Справочник_Сотрудники where cast(ЭтоДиспетчер as integer )  > 0
 


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


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

Сообщений: 4632
Зарегистрирован: 19. Мая 2006
Re: 1sqlite
Ответ #159 - 29. Октября 2007 :: 16:33
Печать  
Z1 писал(а) 29. Октября 2007 :: 16:27:
Правильно также отрабатывает и запрос с явным преобразованием типов
Код
Выбрать все
Select DESCR,ЭтоДиспетчер  from Справочник_Сотрудники where cast(ЭтоДиспетчер as integer )  > 0
 



Да, но, похоже, при этом теряет способность использовать индекс.
  

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #160 - 29. Октября 2007 :: 16:35
Печать  
О - подключил к типовой - все ОК.
Дело в том, что у меня в базе есть документ Invoice -
наверно с этим.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #161 - 29. Октября 2007 :: 16:41
Печать  
kms писал(а) 29. Октября 2007 :: 16:33:
Z1 писал(а) 29. Октября 2007 :: 16:27:
Правильно также отрабатывает и запрос с явным преобразованием типов
Код
Выбрать все
Select DESCR,ЭтоДиспетчер  from Справочник_Сотрудники where cast(ЭтоДиспетчер as integer )  > 0
 



Да, но, похоже, при этом теряет способность использовать индекс.

Конечно Ведь cast функция ( одна из многих) и откуда sql знает как ее отрабатывать.
А как проверять используется ли индекс ?
И используется индекс при ЭтоДиспетчер  >= 0  ?
И используется индекс при    ЭтоДиспетчер  IN (1,3)  ?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #162 - 29. Октября 2007 :: 17:13
Печать  
kms писал(а) 29. Октября 2007 :: 16:19:
kiruha писал(а) 29. Октября 2007 :: 16:08:
Ошибка выполнения запроса: no such table: Регистр_Касса

Не понятно, откуда тут UTF8 взялся. У меня русским языком пишет "no such table: Регистр_Касса"
Чуть выше написал, видимо есть регистрозависимость по-крайней мере последней буквы имени таблицы.

Тексты запросов я всегда передаю движку SQLite как unicod'ные.
Ошибки же он всегда возвращает как const char*, в кодировке UTF8.
Хотя я перед тем, как ошибку отдать 1Су, вроде как конверчу ее из UTF8 в win-1251.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

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


"!=" неможет использовать индекс, смысла нет.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #164 - 29. Октября 2007 :: 17:21
Печать  
orefkov писал(а) 29. Октября 2007 :: 17:13:
kms писал(а) 29. Октября 2007 :: 16:19:
kiruha писал(а) 29. Октября 2007 :: 16:08:
Ошибка выполнения запроса: no such table: Регистр_Касса

Не понятно, откуда тут UTF8 взялся. У меня русским языком пишет "no such table: Регистр_Касса"
Чуть выше написал, видимо есть регистрозависимость по-крайней мере последней буквы имени таблицы.

Тексты запросов я всегда передаю движку SQLite как unicod'ные.
Ошибки же он всегда возвращает как const char*, в кодировке UTF8.
Хотя я перед тем, как ошибку отдать 1Су, вроде как конверчу ее из UTF8 в win-1251.


И почему из за наличия в базе анг. названий ошибка?
Изменил в тестовой все английские названия - нормально заработало
  
Наверх
 
IP записан
 
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 записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #180 - 30. Октября 2007 :: 12:15
Печать  
orefkov писал(а) 30. Октября 2007 :: 12:02:
Во втором случае таблицы не переставить, выбирается ВСЕ движения из регистра, на каждое движение выбираются все записи из журнала за этот период, каждая запись из журнала сверяется с записью регистра по 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; // Выборка записей из журнала за период


Не самый быстрый способ...
SqlLite не умеет делать соединение по алгоритму "hash join" ?
Ведь не всегда есть возможность соединиться по индексу.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #181 - 30. Октября 2007 :: 12:28
Печать  
http://www.sqlite.org/optoverview.html
Цитата:
The current implementation of SQLite uses only loop joins. That is to say, joins are implemented as nested loops

  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #182 - 30. Октября 2007 :: 12:36
Печать  
kiruha писал(а) 30. Октября 2007 :: 12:15:
orefkov писал(а) 30. Октября 2007 :: 12:02:
Во втором случае таблицы не переставить, выбирается ВСЕ движения из регистра, на каждое движение выбираются все записи из журнала за этот период, каждая запись из журнала сверяется с записью регистра по 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; // Выборка записей из журнала за период


Не самый быстрый способ...
SqlLite не умеет делать соединение по алгоритму "hash join" ?
Ведь не всегда есть возможность соединиться по индексу.

Из-за того, что при подборе индекса я пока при любом попадании в индекс возвращаю один и тот-же cost, SQLite здесь выбрал выполнение выборки из журнала по date, с последующей проверкой записей на iddoc, вместо выборки из журнала по iddoc, с последующей проверкой выбранных записей на date.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #183 - 30. Октября 2007 :: 12:50
Печать  
orefkov писал(а) 30. Октября 2007 :: 12:36:
[quote author=kiruha link=1192855975/180#180 date=1193746547]
Из-за того, что при подборе индекса я пока при любом попадании в индекс возвращаю один и тот-же cost, SQLite здесь выбрал выполнение выборки из журнала по date, с последующей проверкой записей на iddoc, вместо выборки из журнала по iddoc, с последующей проверкой выбранных записей на date.


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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #184 - 30. Октября 2007 :: 13:50
Печать  
kiruha писал(а) 30. Октября 2007 :: 12:50:
orefkov писал(а) 30. Октября 2007 :: 12:36:
[quote author=kiruha link=1192855975/180#180 date=1193746547]
Из-за того, что при подборе индекса я пока при любом попадании в индекс возвращаю один и тот-же cost, SQLite здесь выбрал выполнение выборки из журнала по date, с последующей проверкой записей на iddoc, вместо выборки из журнала по iddoc, с последующей проверкой выбранных записей на date.


Ну данный случай можно и переписать, а вот что делать с циклическим алгоритмом соединения когда переписать нельзя ....
А если он и таблицы подзапросов так соединяет(когда не может развернуть) - ...
И как он группирует - если не создает временные индексы ...

Ну, видимо, все что остается - это

create temp table ttt as select ...
...
create index i_1 on ttt(id)
...
drop table ttt
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #185 - 30. Октября 2007 :: 14:33
Печать  
Хвастанусь
Запрос

select
сн.id Элемент
,сн.descr Название
,(select
    sum(Остаток)
    from РегистрИтоги_Товары рт
    where рт.period = '20071001' and рт.Товар = сн.id) Остаток
from Справочник_Номенклатура сн
where parentid = '   K3O   '
order by parentid, isfolder, descr
limit 50

отрабатывает прктически моментально (1-5 мсек).
Хороший задел для будущего провайдера ТП.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #186 - 30. Октября 2007 :: 14:49
Печать  
Подсунул Join почти реальный запрос - вывести движения по товарам с документами
и в соседней колонке показать текущий остаток
Код
Выбрать все
SELECT
РезервыТоваров.Товар,
РезервыТоваров.iddoc,
РезервыТоваров.РезервНаСкладе,
ОстаткиТоваров.ОстатокНаСкладе

FROM
(SELECT
РегРезервы.Товар as Товар,
РегРезервы.iddoc as iddoc,
РегРезервы.РезервТовара as РезервНаСкладе

FROM
     Регистр_РезервыТоваров as РегРезервы
WHERE
   РегРезервы.Date between '20060101' and '20070101'
) as РезервыТоваров

LEFT JOIN
(SELECT
РегОстатки.Товар as Товар,
Sum(РегОстатки.ОстатокТовара) as ОстатокНаСкладе

FROM
     РегистрИтоги_ОстаткиТоваров as РегОстатки
WHERE
    РегОстатки.PERIOD = '20070801'

GROUP BY  РегОстатки.Товар) as ОстаткиТоваров

on ОстаткиТоваров.Товар=РезервыТоваров.Товар 



Время выполнения 55812 мс.
Локально.
Вообщем реализация join все таки не супер.

Хотя выполнение запросов в temp таблицы скорее всего выход (только много лишней ручной писанины,
особенно для динамических запросов)
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #187 - 30. Октября 2007 :: 15:55
Печать  
Группировка

Запрос
Код
Выбрать все
SELECT

РегРезервы.Товар as Товар,

РегРезервы.Склад as Склад,

SUM(РегРезервы.РезервТовара) as РезервНаСкладе

FROM
     Регистр_РезервыТоваров as РегРезервы
WHERE
   РегРезервы.Date between '20060101' and '20070101'

GROUP BY Товар ,Склад

order by Товар ,Склад 



Вместо 2357 строк - почти 36 000 в результате запроса.
Много повторяющихся значений
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #188 - 30. Октября 2007 :: 16:05
Печать  
kiruha писал(а) 30. Октября 2007 :: 14:49:
Подсунул Join почти реальный запрос - вывести движения по товарам с документами
и в соседней колонке показать текущий остаток

Время выполнения 55812 мс.
Локально.
Вообщем реализация join все таки не супер.

Хотя выполнение запросов в temp таблицы скорее всего выход (только много лишней ручной писанины,
особенно для динамических запросов)

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #189 - 30. Октября 2007 :: 20:38
Печать  
kiruha писал(а) 30. Октября 2007 :: 14:49:
Подсунул Join почти реальный запрос - вывести движения по товарам с документами
и в соседней колонке показать текущий остаток
Код
Выбрать все
SELECT
РезервыТоваров.Товар,
РезервыТоваров.iddoc,
РезервыТоваров.РезервНаСкладе,
ОстаткиТоваров.ОстатокНаСкладе

FROM
(SELECT
РегРезервы.Товар as Товар,
РегРезервы.iddoc as iddoc,
РегРезервы.РезервТовара as РезервНаСкладе

FROM
     Регистр_РезервыТоваров as РегРезервы
WHERE
   РегРезервы.Date between '20060101' and '20070101'
) as РезервыТоваров

LEFT JOIN
(SELECT
РегОстатки.Товар as Товар,
Sum(РегОстатки.ОстатокТовара) as ОстатокНаСкладе

FROM
     РегистрИтоги_ОстаткиТоваров as РегОстатки
WHERE
    РегОстатки.PERIOD = '20070801'

GROUP BY  РегОстатки.Товар) as ОстаткиТоваров

on ОстаткиТоваров.Товар=РезервыТоваров.Товар 



Время выполнения 55812 мс.
Локально.
Вообщем реализация join все таки не супер.

Хотя выполнение запросов в temp таблицы скорее всего выход (только много лишней ручной писанины,
особенно для динамических запросов)


А если переписать запрос так:
Код
Выбрать все
SELECT
РегРезервы.Товар,
РегРезервы.iddoc,
РегРезервы.РезервТовара,
(SELECT
	Sum(РегОстатки.ОстатокТовара)
	FROM РегистрИтоги_ОстаткиТоваров as РегОстатки
	WHERE РегОстатки.PERIOD = '20070801'
	and РегОстатки.Товар = РегРезервы.Товар) ОстатокНаСкладе
FROM Регистр_РезервыТоваров as РегРезервы
WHERE РегРезервы.Date between '20060101' and '20070101'
 


И естественно, желательно галку "Отбор итогов" по измерению "Товар" в РегОстатки.

А вообще в чем смысл выводить все движения товара, и к каждому движению показывать текущий остаток?
то есть
Щетка резерв +1 остаток 10
Щетка резерв +2 остаток 10
Щетка резерв +5 остаток 10
Щетка резерв -6 остаток 10

Да к тому же из регистра остатков выбирать остатки ВСЕХ товаров, независимо от того, были по ним движения по резервам или нет.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #190 - 30. Октября 2007 :: 21:12
Печать  
Да, если по регистру Резервы не стоят ни галка "Быстрый отбор движений", ни по измерению "Товар" не выставлен "Отбор движений", и движений в регистре дохрена,
тогда выборку надо делать из Журнала, ограничив период по Журнал.date, и прицепив к нему регистр резервов inner join'ом по iddoc.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #191 - 30. Октября 2007 :: 21:28
Печать  
Вот у меня такой вариант этого запроса получился:
Код
Выбрать все
SELECT
РегРезервы.Товар,
РегРезервы.iddoc,
РегРезервы.Резерв,
(SELECT
	Sum(РегОстатки.Остаток)
	FROM РегистрИтоги_Товары as РегОстатки
	WHERE РегОстатки.PERIOD = '20071001'
	and РегОстатки.Товар = РегРезервы.Товар) ОстатокНаСкладе
FROM Журнал inner join
Регистр_Резервы as РегРезервы
on   Журнал.iddoc = РегРезервы.iddoc
WHERE Журнал.Date between '20050101' and '20060101'
 


2906 строк, выполняется примерно 1600 мсек.
Штатный запрос 1С, выборка движений по резервам с группировками "Товар без групп", "ТекущийДокумент", без соединения с остатками примерно 5 сек.
Можно ли написать аналогичный запрос 1С, не знаю.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #192 - 31. Октября 2007 :: 05:11
Печать  
Z1 писал(а) 30. Октября 2007 :: 16:05:
а если сделать чтобы можно было работать с sqlite несколькими потоками.
тогда создание и заполнение временных таблиц превратиться из минуса в плюс. ( может
опять бред сказал )

Сейчас в 1sqlite сам SQLite комплится как однопоточный, то бишь no threadsafe.
У меня нет никаких оснований полагать, что движок доступа к дбфкам в 1С потокобезопасный.
Даже сейчас проход по одной таблице двумя "считывателями" по разным индексам приводит к тому, что после перемещения второго "считывателя" первый начинает выдавать поля из записи, на которой остановился второй.
Кроме того, для разделение на потоки необходимо будет еще реализовывать всяческие объекты синхронизации на уровне языка 1С.
Вобщем, овчинка выделки не стоит.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #193 - 31. Октября 2007 :: 07:09
Печать  
orefkov писал(а) 30. Октября 2007 :: 20:38:
И естественно, желательно галку "Отбор итогов" по измерению "Товар" в РегОстатки.

А вообще в чем смысл выводить все движения товара, и к каждому движению показывать текущий остаток?
то есть
Щетка резерв +1 остаток 10
Щетка резерв +2 остаток 10
Щетка резерв +5 остаток 10
Щетка резерв -6 остаток 10

Да к тому же из регистра остатков выбирать остатки ВСЕХ товаров, независимо от того, были по ним движения по резервам или нет.


Пример привожу только с целью наиболее "выпятить" слабое место. В реальных запросах подзапросы
используются сплошь и рядом (например для расчета конечных и начальных остатков в ДБФ - нужен подзапрос с UNION ). Думаю в реальных запросах это не будет так заметно, но даже увеличение времени выполнения в пару раз может повредить идее.

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

P.S. Можно ли выполнить запрос во временную таблицу не типизируя предварительно столбцы временной таблицы?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #194 - 31. Октября 2007 :: 08:13
Печать  
kiruha писал(а) 31. Октября 2007 :: 07:09:
P.S. Можно ли выполнить запрос во временную таблицу не типизируя предварительно столбцы временной таблицы?

Да. Есть специальный синтаксис команды create table
Код
Выбрать все
CREATE [TEMP | TEMPORARY] TABLE [database-name.] table-name AS select-statement
 


Выполняет select, его результат стает таблицей.

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #195 - 31. Октября 2007 :: 09:49
Печать  
Вообщем релизовал сохранение подзапросов во временные таблицы.

Итого на локальной
1. без временных 56 000
2. с временными 1 300
3. Fox около 1000

Но у Fox получилось меньше строк.
SqlLite в компоненте ошибки группировки -  например
Код
Выбрать все
SELECT

РегОстатки.Товар as Товар,
SUM(1) as c

FROM
     Регистр_ОстаткиТоваров as РегОстатки
WHERE
   РегОстатки.Date between '20060101' and '20070101'

GROUP BY Товар

order by Товар 



много одинаковых строк
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #196 - 31. Октября 2007 :: 13:35
Печать  
Смотрим старовый топик.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #197 - 31. Октября 2007 :: 13:44
Печать  
kiruha писал(а) 31. Октября 2007 :: 09:49:
SqlLite в компоненте ошибки группировки -  например
Код
Выбрать все
SELECT

РегОстатки.Товар as Товар,
SUM(1) as c

FROM
     Регистр_ОстаткиТоваров as РегОстатки
WHERE
   РегОстатки.Date between '20060101' and '20070101'

GROUP BY Товар

order by Товар 



много одинаковых строк

Протестил на 1.0.0.8
Вроде стало нормально.
Единственный косяк: неверно выбирает индекс.
У меня в регистре движений по Товару есть индекс, и есть "Быстрая обработка движений".
Так вот выполняется выборка по всему регистру с упорядочиванием по товару, с проверкой каждой записи на попадание в date. Что очень плохо.
Пока лечится так:
Код
Выбрать все
SELECT
РегОстатки.Товар as Товар,
SUM(1) as c
FROM
	Регистр_Товары as РегОстатки
WHERE
   РегОстатки.Date between '20050101' and '20050131'
GROUP BY +Товар
order by +Товар
 


"+" перед названием колонки в SQLite ничего не делают, однако подавляют тест колонки на попадание в индекс.
Если по регистру не установлен флажок "Быстрая обработка движений", то есть нет индекса DATETIME, то бишь date не попадает ни в один индекс, запрос надо модифицировать соединением с Журналом:
Код
Выбрать все
SELECT
РегОстатки.Товар as Товар,
SUM(1) as c
FROM Журнал inner join
	Регистр_Товары as РегОстатки on Журнал.iddoc = РегОстатки.iddoc
WHERE
   Журнал.Date between '20050101' and '20050131'
GROUP BY +Товар
order by +Товар
 


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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #198 - 31. Октября 2007 :: 14:01
Печать  
На справочниках 1.8 субъективно работает быстрее
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #199 - 31. Октября 2007 :: 14:19
Печать  
GROUP BY +РегРезервы.Товар

нормально

GROUP BY РегРезервы.Товар

не группирует (но сортирует)

аналогичный эффект при GROUP BY +Товар и GROUP BY Товар
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #200 - 31. Октября 2007 :: 14:46
Печать  
Потестировал JOIN подзапросов на разных размерах таблиц подзапросов -
почти при всех размерах соединяемых таблиц существенно выгодней создать временную таблицу
и проиндексировать и только потом соединяться, даже на маленьких таблицах.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #201 - 31. Октября 2007 :: 15:14
Печать  
Я может что пропустил...
Такой запрос:
Код
Выбрать все
SELECT
Агенты.descr as ИмяАгента,
Sum(РегОстатки.Количество) as Кол
FROM Регистр_БСО as РегОстатки
  left join Справочник_Сотрудники as Агенты on РегОстатки.Лицо = Агенты.id
WHERE
   РегОстатки.Date between '20050101' and '20050131'
Group by ИмяАгента 


отрабатывает за 913 мс
меняем left на inner и получаем время выполнения: 33519
в случае с лэфтом вот такой план:
0      0      TABLE Регистр_БСО AS РегОстатки VIRTUAL TABLE INDEX 1:RA25709.DATETIME;? 0;0;
1      1      TABLE Справочник_Сотрудники AS Агенты VIRTUAL TABLE INDEX 0:SC208.IDD;?0;

с иннером:
0      1      TABLE Справочник_Сотрудники AS Агенты VIRTUAL TABLE INDEX 4:SC208.DESCR;> ORDER BY
1      0      TABLE Регистр_БСО AS РегОстатки VIRTUAL TABLE INDEX 1:RA25709.DATETIME;? 0;0;

Т.е в случае с "иннер" неправильно выбирается индекс? Я правильно понял?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #202 - 31. Октября 2007 :: 15:23
Печать  
Также похоже SqlLite не строит вспомогательные индексы при группировках и Order By
Код
Выбрать все
SELECT

РегОстатки.Товар as Товар,
РегОстатки.Склад as Склад,
РегОстатки.Фирма as Фирма,
РегОстатки.iddoc as iddoc,

SUM(1) as c

FROM
     Регистр_ОстаткиТоваров as РегОстатки
WHERE
   РегОстатки.Date between '20060101' and '20070101'

GROUP BY +Товар,+Склад,+Фирма,+iddoc

ORDER BY  Товар 



(специально много полей группировки, но так часто пишут)
- Lite  1723 мс
- Fox  832 мс

Т.е. на данный момент SqlLite очень хорошо читает данные, работает с индексами базовых таблиц,
выбирает TOP N по индексам, но слабо работает с групповыми операциями над таблицами.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #203 - 31. Октября 2007 :: 20:25
Печать  
kiruha писал(а) 31. Октября 2007 :: 14:19:
GROUP BY +РегРезервы.Товар

нормально

GROUP BY РегРезервы.Товар

не группирует (но сортирует)

аналогичный эффект при GROUP BY +Товар и GROUP BY Товар

То бишь косяки при проходе по родным индексам....
Слушай, а не пробовал переиндексировать базу?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #204 - 31. Октября 2007 :: 20:34
Печать  
JohnyDeath писал(а) 31. Октября 2007 :: 15:14:
Я может что пропустил...
Такой запрос:
Код
Выбрать все
SELECT
Агенты.descr as ИмяАгента,
Sum(РегОстатки.Количество) as Кол
FROM Регистр_БСО as РегОстатки
  left join Справочник_Сотрудники as Агенты on РегОстатки.Лицо = Агенты.id
WHERE
   РегОстатки.Date between '20050101' and '20050131'
Group by ИмяАгента 


отрабатывает за 913 мс
меняем left на inner и получаем время выполнения: 33519
в случае с лэфтом вот такой план:
0      0      TABLE Регистр_БСО AS РегОстатки VIRTUAL TABLE INDEX 1:RA25709.DATETIME;? 0;
0;
1      1      TABLE Справочник_Сотрудники AS Агенты VIRTUAL TABLE INDEX 0:SC208.IDD;?
0;

с иннером:
0      1      TABLE Справочник_Сотрудники AS Агенты VIRTUAL TABLE INDEX 4:SC208.DESCR;> ORDER BY
1      0      TABLE Регистр_БСО AS РегОстатки VIRTUAL TABLE INDEX 1:RA25709.DATETIME;? 0;
0;

Т.е в случае с "иннер" неправильно выбирается индекс? Я правильно понял?

Именно.
Когда применяется left join, порядок таблиц во from изменять нельзя. Поэтому SQLite вынужден идти по регистру по индексу DATETIME, подтягивать к нему записи из справочника, группируя затем их самостоятельно.
В случае же с inner join таблицы можно поменять местами, и SQLite предпочитает в данном случае пойти сначала по справочнику по индексу DESCR, полагая, что это облегчит ему дальнейшую группировку.
Каюсь, в этом по большей части моя вина, так как о цене использования индексов по таблицам 1С я информирую SQLite пока крайне приблизительно.
Пока же можно для правильного выбора индекса применить трюк с "+" :
Код
Выбрать все
SELECT
Агенты.descr as ИмяАгента,
Sum(РегОстатки.Количество) as Кол
FROM Регистр_БСО as РегОстатки
  inner join Справочник_Сотрудники as Агенты on РегОстатки.Лицо = Агенты.id
WHERE
   РегОстатки.Date between '20050101' and '20050131'
Group by +ИмяАгента 


+ перед колонкой ничего не делает, но исключает ее из кандитатов на использование индексов.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #205 - 31. Октября 2007 :: 20:38
Печать  
kiruha писал(а) 31. Октября 2007 :: 15:23:
Также похоже SqlLite не строит вспомогательные индексы при группировках и Order By
Код
Выбрать все
SELECT

РегОстатки.Товар as Товар,
РегОстатки.Склад as Склад,
РегОстатки.Фирма as Фирма,
РегОстатки.iddoc as iddoc,

SUM(1) as c

FROM
     Регистр_ОстаткиТоваров as РегОстатки
WHERE
   РегОстатки.Date between '20060101' and '20070101'

GROUP BY +Товар,+Склад,+Фирма,+iddoc

ORDER BY  Товар 



(специально много полей группировки, но так часто пишут)
- Lite  1723 мс
- Fox  832 мс

Т.е. на данный момент SqlLite очень хорошо читает данные, работает с индексами базовых таблиц,
выбирает TOP N по индексам, но слабо работает с групповыми операциями над таблицами.

Опять 25.
Уточни у этого регистра есть флаг "Быстрая обработка движений" и "Отбор движений" у ресурса "Товар" ?
И используемость таблиц и индексов неплохо бы привести.
И можно ли как либо узнать что-то типа плана выполнения у Фокса?
Типа по каким таблицам/индексам он пошел.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #206 - 01. Ноября 2007 :: 05:51
Печать  
Так же хотелось бы глянуть статистику по загрузке проца и использованию памяти в сравнении фокса и sqlite.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #207 - 01. Ноября 2007 :: 07:05
Печать  
orefkov писал(а) 31. Октября 2007 :: 20:38:
kiruha писал(а) 31. Октября 2007 :: 15:23:
Также похоже SqlLite не строит вспомогательные индексы при группировках и Order By
Код
Выбрать все
SELECT

РегОстатки.Товар as Товар,
РегОстатки.Склад as Склад,
РегОстатки.Фирма as Фирма,
РегОстатки.iddoc as iddoc,

SUM(1) as c

FROM
     Регистр_ОстаткиТоваров as РегОстатки
WHERE
   РегОстатки.Date between '20060101' and '20070101'

GROUP BY +Товар,+Склад,+Фирма,+iddoc

ORDER BY  Товар 



(специально много полей группировки, но так часто пишут)
- Lite  1723 мс
- Fox  832 мс

Т.е. на данный момент SqlLite очень хорошо читает данные, работает с индексами базовых таблиц,
выбирает TOP N по индексам, но слабо работает с групповыми операциями над таблицами.

Опять 25.
Уточни у этого регистра есть флаг "Быстрая обработка движений" и "Отбор движений" у ресурса "Товар" ?
И используемость таблиц и индексов неплохо бы привести.
И можно ли как либо узнать что-то типа плана выполнения у Фокса?
Типа по каким таблицам/индексам он пошел.


Быстрая обработка движений есть, Отбор движений у измерения товар нет.
Fox использует индекс I=DATETIME  при чтении (явно ему указываю, а что ему явно не указывать - не использует).
Не встречал способов просмотреть план выполнения у Fox, но он известен "теоретически". Есть "аналог":
spock писал(а) 17. Сентября 2007 :: 04:32:
Advantage oledb provider может показывать план.

........
В данном примере скорость получения данных(и индексы) вообще не интересует (можно было работать просто с временными таблицами).
Из 1723 мс общего времени SqlLite на получение данных затратил только 383 мс (20%)- все остальное на группировку и сортировку.
У Fox получение данных 550мс (70%) из 832 мс.

Я просто сравнивал скорость операции группировки. 
И по личному опыту - у Fox наличие группировок и сортировок - крайне слабо отражается на общем времени выполнения.

И даже теоретически - если SqlLite использует простой последовательный перебор в групповых операциях при отсутствии уже сформированного индекса - трудно ожидать высокой скорости выполнения этих операций ...
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #208 - 01. Ноября 2007 :: 07:30
Печать  
Орефков
Цитата:
+ перед колонкой ничего не делает, но исключает ее из кандитатов на использование индексов.

а этот "+" ставиться или не ставиться пока(?) чисто тестово-интуитивном методом?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #209 - 01. Ноября 2007 :: 07:36
Печать  
Да, походу так и есть.
Запрос с группировкой - 3800
Просто выгрузка движений во врем-таблицу 800
Группировка по врем таблице без индекса - 3000
Создал индекс по врем таблице.
Группировка по врем таблице с индексом - 800
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #210 - 01. Ноября 2007 :: 07:40
Печать  
JohnyDeath писал(а) 01. Ноября 2007 :: 07:30:
Орефков
Цитата:
+ перед колонкой ничего не делает, но исключает ее из кандитатов на использование индексов.

а этот "+" ставиться или не ставиться пока(?) чисто тестово-интуитивном методом?

Ну примерно так.
Сначала выполняю только план запроса.
Смотрю, как-что, по каким таблицам индексам идет.
Если вижу, что использован неоптимальный вариант выполнения, даю подсказки плюсиками.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #211 - 01. Ноября 2007 :: 09:30
Печать  
orefkov писал(а) 01. Ноября 2007 :: 07:36:
Да, походу так и есть.
Запрос с группировкой - 3800
Просто выгрузка движений во врем-таблицу 800
Группировка по врем таблице без индекса - 3000
Создал индекс по врем таблице.
Группировка по врем таблице с индексом - 800


Скачал исходники с сайта.
Там есть файлы select.c и where.c,  хорошо комментируемые ...
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #212 - 01. Ноября 2007 :: 10:22
Печать  
Тестовую базу не переиндексировал?
По поводу дубликатов при GROUP BY.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #213 - 01. Ноября 2007 :: 11:17
Печать  
orefkov писал(а) 01. Ноября 2007 :: 10:22:
Тестовую базу не переиндексировал?
По поводу дубликатов при GROUP BY.


Удалил все CDX и воссоздал заново.
Упростил запрос и проверил на другом регистре
Код
Выбрать все
SELECT

РегОстатки.Товар as Товар,
SUM(1) as c

FROM
     Регистр_ОстаткиТоваров as РегОстатки

GROUP BY Товар

order by Товар 



С + нормально, без - только упорядочивает.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


Эх, дайте что-нибудь новенькое
да полезное потести

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #214 - 01. Ноября 2007 :: 12:22
Печать  
Народ, вам автоматические тесты нужны 100%.
И повтора ошибок не будет Улыбка
И разработка намного проще и удобнее становится Улыбка
  

OpenConf developer :: http://openconf.1cpp.ru&&FormEx developer :: http://formex.dorex.ru&&1C++ active developer &amp;&amp; tester :: www.1cpp.ru
Наверх
GTalkSkype/VoIPICQ  
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #215 - 01. Ноября 2007 :: 12:35
Печать  
artbear писал(а) 01. Ноября 2007 :: 12:22:
Народ, вам автоматические тесты нужны 100%.
И повтора ошибок не будет Улыбка
И разработка намного проще и удобнее становится Улыбка


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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #216 - 01. Ноября 2007 :: 12:59
Печать  
2kiruha

Странно как-то все.
Упростил запрос до такого:
Код
Выбрать все
SELECT
Товар,
sum(1)
from Регистр_Скидки
group by Товар
 


Детальный анализ программы выполнения с "group by +Товар", без использования индекса.
Открывается временный индексированный курсор (OpenEphemeral).
Выбираются записи из таблицы регистра, укладываясь в этот курсор в виде полей "Товар", счетчик строк, "Товар" :
Код
Выбрать все
VColumn	0	7    // Извлечение колонки "Товар"
Sequence	1	0    // Получение счетчика строк
VColumn	0	7    // Извлечение колонки "Товар"
MakeRecord	3	0  // Создание записи
IdxInsert	1	0   // Вставка созданной записи в курсор.
 


После выборки всех записей, временный курсор перемещается в начало выборки:
Код
Выбрать все
Sort
 


Потом идет выборка строк из временного курсора (индексированного по "Товар") и сравнение ключа - нулевой колонки (где лежит Товар) с предыдущим значением ключа. Если равно, то агрегирует, если не равно, выдает очередную строку готового результата.

Если же вариант с "group by Товар" (с использованием индекса), то просто не делается выгрузка во временный индексированный курсор. Выбираются записи из регистра, упорядоченные по "Товар", производится сравнение с предудущим значением ключа, если равны, то агрегируется, если не равны, выдает очередную строку результата.

На первый взгляд все верно.
Что при вставке в индекс, что при сравнении ключей используется BINARY сравнение, то бишь memcmp.
Единственно возможный вариант расхождений в результатах - если порядок сортировки в родном индексе не совпадает с порядком сортировки в SQLite.
Можешь попробовать сравнить результаты двух таких запросов:
Код
Выбрать все
SELECT
Товар
from Регистр_Скидки
order by Товар
 


и
Код
Выбрать все
SELECT
Товар
from Регистр_Скидки
order by +Товар
 


То бишь первый запрос выдаст строки в порядке следования их в индексе dbf-файла, а второй - упорядоченные самим SQLite'ом. Будет ли разница между ними?

  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #217 - 01. Ноября 2007 :: 13:11
Печать  
Вот такой код типа:
Код
Выбрать все
Процедура Сформировать()
	база = СоздатьОбъект("SQLiteBase");
	база.Открыть(":memory:");
	запрос = база.НовыйЗапрос();
	запрос.ВыполнитьЗапрос("create virtual table test using dbeng(Регистр.ОстаткиТоваров)");
	тз1 = запрос.ВыполнитьЗапрос("
	|SELECT
	|Товар
	|from test
	|order by +Товар");
	Сообщить("Строк=" + тз1.КоличествоСтрок());
	тз2 = запрос.ВыполнитьЗапрос("
	|SELECT
	|Товар
	|from test
	|order by Товар");
	Для Номер = 1 По тз1.КоличествоСтрок() Цикл
		т1 = тз1.ПолучитьЗначение(Номер, 1);
		т2 = тз2.ПолучитьЗначение(Номер, 1);
		Если т1<>т2 Тогда
			Сообщить("В строке " + Номер + " т1 = " + т1 + " т2 = " + т2);
			Возврат;
		КонецЕсли;
	КонецЦикла;
	Сообщить("Результат одинаков");
КонецПроцедуры
 


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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #218 - 01. Ноября 2007 :: 13:12
Печать  
Да, есть разница.
С "+" сортирует, без - нет.

Только в таблице RA99 по которой запрос - нет индексов с полем товар.
Сортировка Machine
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #219 - 01. Ноября 2007 :: 13:19
Печать  
После добавления индекса на ТОвар  - нормально сортирует и группирует.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #220 - 01. Ноября 2007 :: 13:19
Печать  
kiruha писал(а) 01. Ноября 2007 :: 13:12:
Да, есть разница.
С "+" сортирует, без - нет.

Только в таблице RA99 по которой запрос - нет индексов с полем товар.
Сортировка Machine

Можешь показать хотя бы первое несовпадающее значение?
И как-то странно, если индекса по товару нет, то в обоих случаях результат был бы одинаков.
Можешь закинуть для обоих случаев программы выполнения?
До того, как индекс по товару добавил.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #221 - 01. Ноября 2007 :: 13:32
Печать  
Не прикрепляет Печаль zip

Второе
По товару

Использование таблиц                        
order      from      detail            
0      0      TABLE Регистр_ОстаткиТоваров VIRTUAL TABLE INDEX 1:RA99.DATETIME;? ORDER BY            
                       
Программа выполнения                        
addr      opcode      p1      p2      p3
0      Noop      0      0      
1      Goto      0      11      
2      VOpen      0      0      vtab:26CCC14:30312F8
3      Integer      0      0      
4      Integer      1      0      
5      VFilter      0      9      RA99.DATETIME;?
6      VColumn      0      8      
7      Callback      1      0      
8      VNext      0      6      
9      Close      0      0      
10      Halt      0      0      
11      Transaction      0      0      
12      VerifyCookie      0      5      
13      Goto      0      2      
14      Noop      0      0      

По +Товар

Использование таблиц                        
order      from      detail            
0      0      TABLE Регистр_ОстаткиТоваров VIRTUAL TABLE INDEX -1:            

Программа выполнения                        
addr      opcode      p1      p2      p3
0      OpenEphemeral      1      3      keyinfo(1,BINARY)
1      Goto      0      26      
2      VOpen      0      0      vtab:26CCC14:30312F8
3      Integer      0      0      
4      Integer      -1      0      
5      VFilter      0      14      
6      VColumn      0      8      
7      MakeRecord      1      0      
8      VColumn      0      8      
9      Sequence      1      0      
10      Pull      2      0      
11      MakeRecord      3      0      
12      IdxInsert      1      0      
13      VNext      0      6      
14      Close      0      0      
15      OpenPseudo      2      0      
16      SetNumColumns      2      1      
17      Sort      1      24      
18      Integer      1      0      
19      Column      1      2      
20      Insert      2      0      
21      Column      2      0      
22      Callback      1      0      
23      Next      1      18      
24      Close      2      0      
25      Halt      0      0      
26      Transaction      0      0      
27      VerifyCookie      0      5      
28      Goto      0      2      
29      Noop      0      0      


  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #222 - 01. Ноября 2007 :: 13:43
Печать  
Обассацца.
Че-то где я так накосячил, что он у меня выдает индекс DATETIME, когда надо сортировку по товару?
Ясен пень, что так не сагрегировать.
SQLite думает, что выборка упорядочена по "товар", а я данные отдаю по "datetime".
Ща разберемся как следует.
Спасибо большое за помощь.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #223 - 01. Ноября 2007 :: 13:54
Печать  
Отлично. Ситуацию удалось воспроизвести. Ща буду ковыряться.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #224 - 01. Ноября 2007 :: 14:14
Печать  
Наковырял.
Смотрим стартовый топик.
Баг с подбором индексов для "order by" устранен.

kiruha - проверь теперь плиз.
Теперь если "Товар" ни в один индекс не попадает, то должны быть один план выполнения, что с
group by Товар, что с group by +Товар.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #225 - 01. Ноября 2007 :: 14:26
Печать  
orefkov писал(а) 01. Ноября 2007 :: 14:14:
Наковырял.
Смотрим стартовый топик.
Баг с подбором индексов для "order by" устранен.

kiruha - проверь теперь плиз.
Теперь если "Товар" ни в один индекс не попадает, то должны быть один план выполнения, что с
group by Товар, что с group by +Товар.


Да, похоже все ОК.
Время группировки уменьшилось(хотя индекс отсутствует) .
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #226 - 02. Ноября 2007 :: 07:46
Печать  
Саш, а типизации не будет вообще или её нет "пока"?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #227 - 02. Ноября 2007 :: 08:09
Печать  
JohnyDeath писал(а) 02. Ноября 2007 :: 07:46:
Саш, а типизации не будет вообще или её нет "пока"?

Окстись. Зачем все это затевать, если не делать типизации?
Ща движок отладим, и начнем стеклоподъемники прикручивать.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: 1sqlite
Ответ #228 - 20. Ноября 2007 :: 12:00
Печать  
Скачал последний релиз sqlite с тестовым ert-шником.
Не понял как сделать запрос к таблице Печаль
В подключаемых таблицах поставил галочку на справочнике контрагентов. А как запрос написать?

select * from справчоник_контрагенты

выдает: no such table справчоник_контрагенты

Что не так?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #229 - 20. Ноября 2007 :: 12:36
Печать  
es3000 писал(а) 20. Ноября 2007 :: 12:00:
Скачал последний релиз sqlite с тестовым ert-шником.
Не понял как сделать запрос к таблице Печаль
В подключаемых таблицах поставил галочку на справочнике контрагентов. А как запрос написать?

select * from справчоник_контрагенты

выдает: no such table справчоник_контрагенты

Что не так?

Все работает.
Пример
Код
Выбрать все
Select *  from Справочник_Сотрудники where ЭтоДиспетчер   > 0
 


Это применимо только для  1с dbf баз
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: 1sqlite
Ответ #230 - 20. Ноября 2007 :: 12:50
Печать  
а-а-а понятно, у меня база SQL

а как же быть с SQL-базой? в смысле сделать SQL-запрос, причем база в монопольном режиме?
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #231 - 20. Ноября 2007 :: 13:33
Печать  
А через ODBC почему не хочешь? Там же идёт через родное соединение 1С, поэтому пофиг монопольно ты или нет
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: 1sqlite
Ответ #232 - 21. Ноября 2007 :: 05:12
Печать  
а в ODBC временные таблицы создавать можно?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #233 - 21. Ноября 2007 :: 05:25
Печать  
es3000 писал(а) 21. Ноября 2007 :: 05:12:
а в ODBC временные таблицы создавать можно?

можно. Для MS SQL
Код
Выбрать все
create table #users_1c (   id   char (13),  who  char (50),primary key (id))
 



Твой пост 230 мне не понятен.


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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: 1sqlite
Ответ #234 - 21. Ноября 2007 :: 05:42
Печать  
Z1 писал(а) 21. Ноября 2007 :: 05:25:
Твой пост 230 мне не понятен.



Да, как-то я не рассказал подробно чего хочу... Сейчас исправлюсь...

У меня две базы: одна SQL, одна DBF. В обоих нужно строить сложные отчеты, причем некоторые в монопольном режиме.
Сейчас в основном пользуюсь штатными запросами и ИндексированнойТаблицей, хотя это не всегда удобно.
Удобнее всего было бы такие отчеты строить SQL-запросами с использованием временных таблиц.
Вот в данный момент выбираю технологию, на которую перейти (OLEDB, ODBC, SQLite). Причем хочется, чтобы и на SQL и на DBF базе использовалась одна технология.

Когда прочитал про SQLite решил, что это то что нужно. Но вот оказалось, что это счастье только для DBF Печаль

Итак, подведу итог.
Меня интересует технология, позволяющая работать с БД при помощи SQL-запросов.
Причем важны следующие требования:
- использование временных таблиц
- работа в монопольном режиме
- поддержка и DBF и SQL баз

Ну вот. Что посоветуете?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #235 - 21. Ноября 2007 :: 06:13
Печать  
es3000 писал(а) 21. Ноября 2007 :: 05:42:
Z1 писал(а) 21. Ноября 2007 :: 05:25:
Твой пост 230 мне не понятен.



Да, как-то я не рассказал подробно чего хочу... Сейчас исправлюсь...

Сейчас в основном пользуюсь штатными запросами и ИндексированнойТаблицей, хотя это не всегда удобно.
Удобнее всего было бы такие отчеты строить SQL-запросами с использованием временных таблиц.
Вот в данный момент выбираю технологию, на которую перейти (OLEDB, ODBC, SQLite). Причем хочется, чтобы и на SQL и на DBF базе использовалась одна технология.

Когда прочитал про SQLite решил, что это то что нужно. Но вот оказалось, что это счастье только для DBF Печаль

Из mssql тоже можно сделать sqlite таблицу
делай перебор строк и вноси в sqlite таблицу данные. Далее можно работать с sqlite
таблицей. Все это можно делать компонентой из subj.
Будет очень здорово если этот перебор сделать внутри 1с++. повыситься скорость.
т.е сейчас
Код
Выбрать все
	Запрос = СоздатьОбъект("ODBCRecordSet");
		Запрос.ВыполнитьИнструкцию(ТекстЗапроса,ТЗ,);
 


где ТЗ таблица значений или ИТЗ.
ИХМО надо  сделать возможность выгружать результат sql запроса по родной бд в таблицу sqlite
и второе надо сделать возможным выгружать результаты стандартного запроса
в sqlite таблицу.
Ну и вроде малыми шагами  продвигаемся в этом направлении.
Я рассматриваю sqlite таблицу ( в контексте 1с++ ) как следущий этап после ИТЗ
( и мы к нему придем, создано очень много предпосылок )
т.е
списокзначений --> таблицазначений --> ИТЗ ???--> таблицаsqlite
Но все это ИХМО и естественно я могу заблуждаться, ошибаться
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: 1sqlite
Ответ #236 - 21. Ноября 2007 :: 08:16
Печать  
С общей тенденцией согласен.

Только выше мне подсказали, что ODBC позволяет создавать временные таблицы. Тогда в чем преимущества / недостатки ODBC в сравнении с SQLite?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #237 - 21. Ноября 2007 :: 08:31
Печать  
es3000 писал(а) 21. Ноября 2007 :: 08:16:
С общей тенденцией согласен.

Только выше мне подсказали, что ODBC позволяет создавать временные таблицы. Тогда в чем преимущества / недостатки ODBC в сравнении с SQLite?


ODBC это способ доступа к разным базам данным.
т.к. ODBC создан microsoft то odbc наилучим образом взаимодействует
с базами данных MS SQL, Access

sqlite это БД ( без СУБД можно сказать что это бд в приложении пользователя).
к этой бд sqlite также есть odbc драйвер.
основное преимущество  БДsqlite  очень быстрое выполнение запросов.

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



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: 1sqlite
Ответ #238 - 21. Ноября 2007 :: 09:38
Печать  
Появилась идея: хорошо бы составить большую сводную таблицу по разным технологиям работы с базами данных из 1С++ (SQLite, ODBC, OLEDB) и поддерживаемые ими возможности.
Из которой можно было понять что использовать в зависимсти от конкретных потребностей.

А то я вот не знаю на чем остановиться. Получается пока не поработаешь всеми способами, не набьешь шишек, однозначно определиться невозможно. А сколько времени на этом потеряешь?

Чем например отличается OLEDB от ODBC? Можно ли его использовать для моего случая? Что лучше что хуже?
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #239 - 21. Ноября 2007 :: 09:46
Печать  
Ты хочешь пользоваться прямыми запросами для ДБФ в монопольном режиме - а это невозможно (кроме сабжа, но он ещё сыроват).
Для SQL наилучшим будет использование "родного" ODBC.
В ДБФ также можно использовать ODBC, но здесь он будет крайне тормознутым и малофункциональным. Опттимальным для ДБФ считается OLEDB.
noprogrammer подрихтовал класс acsent'a: теперь не надо каждый раз проверять SQL это база или ДБФ. В общем скачай и посмотри. На инфостарте вроде как выкладывался и в его конфе СКАТ есть.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: 1sqlite
Ответ #240 - 21. Ноября 2007 :: 10:06
Печать  
Цитата:
В ДБФ также можно использовать ODBC, но здесь он будет крайне тормознутым и малофункциональным. Опттимальным для ДБФ считается OLEDB.


Ну вот опять. "Опттимальным ... считается OLEDB". Хотелось бы увидеть, что OLEDB может и что не может. Почему он считается оптимальным? Почему ODBC малофункционален? Чего он не может? Может оно мне и не нужно будет. Все таки хорошо бы сводную подробную информацию иметь.

Может есть желающие составить?

Цитата:
noprogrammer подрихтовал класс acsent'a: теперь не надо каждый раз проверять SQL это база или ДБФ. В общем скачай и посмотри. На инфостарте вроде как выкладывался и в его конфе СКАТ есть.


э-э-э, не понял где качать
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #241 - 21. Ноября 2007 :: 10:42
Печать  
es3000 писал(а) 21. Ноября 2007 :: 10:06:
"Опттимальным ... считается OLEDB". Хотелось бы увидеть, что OLEDB может и что не может. Почему он считается оптимальным? Почему ODBC малофункционален? Чего он не может?

Сам же практически ответил - назови мне что либо все что обсуждается на этом форуме чего нельзя написать на внутреннем языке 1с.  (Даже без объекта Запрос = СоздатьОбъект("Запрос"); )
Что дало 1с++ гораздо большую скорость выполнения задач и/или гораздо
лучшую скорость написания программ.
OLE DB сейчас работает для 1с dbf. чем он лучше. самый быстрый способ извлечения данных для 1с dbf. Недостаток ( по крайней мере для тебя ) не работает в монопол режиме.
ODBC отлично работает с бд 1с mssql - т.е. работает быстро и поддерживает
очень многое из  tsql
ODBC для 1с dbf работает во первых медленее чем OLEDB и по операторам sql
слишком многое чего он не может.
Может перенести дискусию в отдельную ветку а то вроде удаляемся от subj?
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: 1sqlite
Ответ #242 - 21. Ноября 2007 :: 10:55
Печать  
Да , конечно можно перенсти. А как ? Я ни разу не переносил
  
Наверх
ICQ  
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: 1sqlite
Ответ #243 - 21. Ноября 2007 :: 10:56
Печать  
Или в смысле начать новую тему?
  
Наверх
ICQ  
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #244 - 21. Ноября 2007 :: 11:00
Печать  
es3000 писал(а) 21. Ноября 2007 :: 10:56:
Или в смысле начать новую тему?

В смысле начать новую тему. В ней также указать ссылку на посты этой ветки.
  
Наверх
 
IP записан
 
es3000
God Member
*****
Отсутствует



Сообщений: 536
Зарегистрирован: 10. Июля 2006
Re: 1sqlite
Ответ #245 - 21. Ноября 2007 :: 11:40
Печать  
Ну все, сделал:

http://www.1cpp.ru/forum/YaBB.pl?num=1195645171/0

Хорошо бы, если бы модератор туда все перенес с 234 ответа
  
Наверх
ICQ  
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #246 - 11. Января 2008 :: 07:58
Печать  
Александр, а есть какие-нибудь новости по проекту? Стоит ли вообще ждать?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #247 - 11. Января 2008 :: 09:25
Печать  
JohnyDeath писал(а) 11. Января 2008 :: 07:58:
Александр, а есть какие-нибудь новости по проекту? Стоит ли вообще ждать?


Я так понял, что по-хорошему надо было сам движок (sqllite) исправлять (сортировка, индексация, группирование, join) - а это крайне трудоемко, ну и ...
Печаль
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #248 - 11. Января 2008 :: 09:53
Печать  
Ну хотя б самый примитивные запросы для ТП, ну, ес-но, и сам провайдер ТП  Круглые глаза и типизацию.

П.С. Я просто зашёл на форум, смотрю - Саша здесь (а его давно не было, как оказалось, причина - коммуникатор  Улыбка), вот по-быстрому и задал вопрос, думая, что получу быстрый ответ.  Нерешительный
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #249 - 16. Января 2008 :: 09:23
Печать  
Здесь я, здесь Улыбка
Делаю потихоньку.
Довольно долго ковырялся с агрегированием в SQLite.
Вобщем, итог тестов.
На операциях группировки/агрегирования SQLite работает медленнее фокса, однако гораздо менее требователен к памяти, и позволяет проще организовать попадание в индекс.
Под рукой детальных результатов тестов нет, но примерно так:
На тестовом запросе с агрегированием фокс справлялся примерно в два раза быстрее, чем SQLite. При этом потребление памяти процессом 1С увеличивалось с 35 МБ до 250 МБ при использовании фокса, и до 40 МБ при использовании SQLite.
Кроме того, в запросе на фоксе пришлось очень изголятся с текстом условий, дабы фокс догадался использовать индекс.
Так как при работе с дбф базами я в основном юзаю терминал, то память в данном случае для меня является более ценным ресурсом, чем время (пусть лучше юзер подождет лишние 10 сек, чем хапнет 200 метров). Однако актуальность баз на дбф в последнее время для меня упала, и разработка 1sqlite для меня теперь не является рабочей необходимостью, а только хобби.
  
Наверх
 
IP записан
 
rat
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 1
Зарегистрирован: 04. Февраля 2008
Re: 1sqlite
Ответ #250 - 04. Февраля 2008 :: 11:25
Печать  
Потрясающая штука 1sqlite! Александр, огромное спасибо!

Добавил в "1sqlite.ert" кнопочку "статистика базы" - для подсчета кол-ва элементов в таблицах базы. Летает.

Замечено, при попытке выполнить запрос (а может при попытке отображения) по табличной части документа, не имеющей реквизитов, 1с вылетает ссылаясь на склероз.

Код
Выбрать все
select count(*) from ДокументСтроки_Такойто  


  

1sqlite_stat_001.zip ( 181 KB | Загрузки )
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #251 - 04. Февраля 2008 :: 12:36
Печать  
rat писал(а) 04. Февраля 2008 :: 11:25:
Потрясающая штука 1sqlite! Александр, огромное спасибо!

Добавил в "1sqlite.ert" кнопочку "статистика базы" - для подсчета кол-ва элементов в таблицах базы. Летает.

Замечено, при попытке выполнить запрос (а может при попытке отображения) по табличной части документа, не имеющей реквизитов, 1с вылетает ссылаясь на склероз.

Код
Выбрать все
select count(*) from ДокументСтроки_Такойто  



Пересобрать бы библиотеку под sqlite3.5.5 должно еще быстрее работать.
  
Наверх
 
IP записан
 
kollodina
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 34
Зарегистрирован: 07. Июля 2008
Re: 1sqlite
Ответ #252 - 11. Августа 2008 :: 09:13
Печать  
начала широко использовать 1sqlite в ЗиК - и вот проблема... когда работает юзер,в которого в отчетах использована она, то другие вылетают из базы по блокировке таблицы констант.... подскажите - чего надо сделать? не хочется отказываться от 1sqlite.... так хорошо и быстро работает.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #253 - 11. Августа 2008 :: 09:50
Печать  
Если я тебя правильно понял, то Саша Орефков уже работает над этой проблемой. Все ждём.
  
Наверх
 
IP записан
 
kollodina
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 34
Зарегистрирован: 07. Июля 2008
Re: 1sqlite
Ответ #254 - 12. Августа 2008 :: 06:16
Печать  
постоянно все вываливается... юзеры меня скоро бить начнут... получается в многопользховательском режиме не надо использовать 1sqlite? быстрее переходить на 1сpp?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #255 - 12. Августа 2008 :: 06:40
Печать  
kollodina писал(а) 12. Августа 2008 :: 06:16:
постоянно все вываливается... юзеры меня скоро бить начнут... получается в многопользховательском режиме не надо использовать 1sqlite? быстрее переходить на 1сpp?

См. пост выше.
А что значит "переходить на 1cpp"?
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #256 - 12. Августа 2008 :: 06:46
Печать  
to JohnyDeath:
насколько я успел заметить, ты активно юзаешь 1sqlite, вопросик к тебе - насколько критична проблема при работе одного-двух пользователей при условии, что запросы не будут продолжительными по времени?
хочу постепенно польностью перейти на 1sqlite, пока пробовал несколько кусочков реализовать, работает быстро, запросы не больше 2-3 сек.
  
Наверх
 
IP записан
 
kollodina
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 34
Зарегистрирован: 07. Июля 2008
Re: 1sqlite
Ответ #257 - 12. Августа 2008 :: 06:56
Печать  
вот написала много кусков а теперь - полно проблем... посоветуйте, как лучше сделать, чтобы не было блокировок? может, чего-то не так делаю? пользоватлей у меня штук 10 одновременно...
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #258 - 12. Августа 2008 :: 07:12
Печать  
kollodina писал(а) 12. Августа 2008 :: 06:56:
вот написала много кусков а теперь - полно проблем... посоветуйте, как лучше сделать, чтобы не было блокировок? может, чего-то не так делаю? пользоватлей у меня штук 10 одновременно...

Пока выходов несколько:
1. Вообще отказаться от 1sqlite, пока Саша Орефков не поправит
2. Переписывать всё под OLE DB
3. Воспользоваться пропатченным DBEng32 от hogik'a http://infostart.ru/profile/2905/projects/2308/
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #259 - 12. Августа 2008 :: 07:13
Печать  
CaBaT писал(а) 12. Августа 2008 :: 06:46:
to JohnyDeath:
насколько я успел заметить, ты активно юзаешь 1sqlite, вопросик к тебе - насколько критична проблема при работе одного-двух пользователей при условии, что запросы не будут продолжительными по времени?
хочу постепенно польностью перейти на 1sqlite, пока пробовал несколько кусочков реализовать, работает быстро, запросы не больше 2-3 сек.

Ну для одного пользователя вообще не критично  Улыбка. Для 2-х и более надо смотреть по обстановке..
Я тоже постепенно всё под 1sqlite переписываю, но в боевой пока применяется поминимуму. Жду..
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #260 - 12. Августа 2008 :: 07:19
Печать  
JohnyDeath писал(а) 12. Августа 2008 :: 07:13:
Я тоже постепенно всё под 1sqlite переписываю, но в боевой пока применяется поминимуму. Жду..

ясно, спасиб.
руки чешутся переделать все на 1slite Улыбка
надеюсь саша поправит эти грабли.
  
Наверх
 
IP записан
 
kollodina
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 34
Зарегистрирован: 07. Июля 2008
Re: 1sqlite
Ответ #261 - 12. Августа 2008 :: 07:21
Печать  
ну на боевую ставить этот патч страшновато...
к сожалению много чего понаписала на 1sqlite....
вот счас сижу - думаю чего делать мне бедной...
ole db - имеет в виду 1с++?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #262 - 12. Августа 2008 :: 08:28
Печать  
kollodina писал(а) 12. Августа 2008 :: 07:21:
ну на боевую ставить этот патч страшновато...
к сожалению много чего понаписала на 1sqlite....
вот счас сижу - думаю чего делать мне бедной...
ole db - имеет в виду 1с++?

Переписывать всё под OLE DB будет очень напряжно http://www.1cpp.ru/forum/YaBB.pl?num=1184317705 (в монопольном работать не будет).
Если пропатченный движок ставить страшновато, тогда жди решения автора.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #263 - 01. Ноября 2008 :: 06:59
Печать  
Тут небольшой баг нарисовался.
Но меня другое немного пугает. Может кто-нибудь сказать (тут же есть люди, которые сидят бок о бок с ним  Круглые глаза ), Саша Орефков будет продолжать проект?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: 1sqlite
Ответ #264 - 04. Ноября 2008 :: 15:52
Печать  
Народ а подскажите как в SQLite типизировать значение справочника Контрагенты (например) к значению хранящемуся в 1sbkktl в колонке SCx. ?
Т.е. в запросе я пишу
Код
Выбрать все
.....
WHERE
SC0 = @ВыбКонтрагент 


Потом
Код
Выбрать все
Запрос.УстановитьПараметр("@ВыбКонтрагент",Контр.ТекущийЭлемент(),0) 


А на деле таблица становиться пустой.  Озадачен
Подскажите как 1С хранить значение субконто в таблице?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: 1sqlite
Ответ #265 - 05. Ноября 2008 :: 05:29
Печать  
Цитата:
Подскажите как 1С хранить значение субконто в таблице?

http://metaprog.co.ua/secrprog/buh_s.html
  
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: 1sqlite
Ответ #266 - 05. Ноября 2008 :: 13:06
Печать  
leshik писал(а) 05. Ноября 2008 :: 05:29:
Цитата:
Подскажите как 1С хранить значение субконто в таблице?

http://metaprog.co.ua/secrprog/buh_s.html

Вроде читал но плохо видимо. Попробуем еще раз вникнуть.  Подмигивание
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
leshik
1c++ donor
Отсутствует



Сообщений: 820
Местоположение: Пятигорск
Зарегистрирован: 22. Апреля 2007
Пол: Мужской
Re: 1sqlite
Ответ #267 - 05. Ноября 2008 :: 13:13
Печать  
У тебя в параметрах субконто что прописано? как субконто задано?
  
Наверх
IP записан
 
poops
YaBB Newbies
*
Отсутствует


I Love YaBB 2!

Сообщений: 3
Зарегистрирован: 06. Ноября 2008
Re: 1sqlite
Ответ #268 - 03. Декабря 2008 :: 12:47
Печать  
Проблема в следующем, формирую таблицу значений, ТЗ не пустая проверял. При выполнении кода:
Код
Выбрать все
БазаДанных.Открыть(":memory:");  
запрос = базаДанных.НовыйЗапрос();
тзКлиентыТорговых = получитьСписокКонтрагентов();
БазаДанных.УложитьТЗ(тзКлиентыТорговых,"Clients",0);
ТекстЗапроса="SELECT
          |Сlients.Клиент,
          |Сlients.проект
          |FROM
          | Сlients;";
ТЗ=Запрос.ВыполнитьЗапрос(ТекстЗапроса);
 



выдает, что no such table Clients. В чем косяк не пойму. Попробывал так:
Код
Выбрать все
Запрос.ВыполнитьЗапрос("create table  Clients1 (ID_Cl TEXT, ID_pr TEXT)");
ТекстЗапроса="INSERT INTO Clients1
				|SELECT
				|	Контрагент,
				|	Проект
				|FROM
				|	ClProjects
				|WHERE ClProjects.Проект in (select val FROM Projects)";

Запрос.ВыполнитьЗапрос(ТекстЗапроса);
запрос.ВыполнитьЗапрос("Create index ID_Cl ON Clients1(ID_Cl)");
ТекстЗапроса="SELECT
				 |ID_Cl,
				 |ID_pr
				 |FROM
				 | Сlients1";
ТЗ=Запрос.ВыполнитьЗапрос(ТекстЗапроса);

 


Выдает no such table Clients1. Что не так делаю? Печаль
  
Наверх
 
IP записан
 
sashas09
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 148
Местоположение: Киев
Зарегистрирован: 26. Апреля 2007
Пол: Мужской
Re: 1sqlite
Ответ #269 - 04. Декабря 2008 :: 09:56
Печать  
а в запросе есть ; после имени таблицы или мне кажется
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #270 - 05. Декабря 2008 :: 05:28
Печать  
sashas09 писал(а) 04. Декабря 2008 :: 09:56:
а в запросе есть ; после имени таблицы или мне кажется

Человек ответил на мисте, здесь почему-то не отписал.
У него просто между выгрузкой тз в базу и вытаскиванием тз из базы затесалось
База.Открыть(":memory:")
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: 1sqlite
Ответ #271 - 08. Декабря 2008 :: 11:20
Печать  
Доброе время суток!
Может искал плохо, но вот нормальных примеров по работе с регистрами не нашел.
В общем пытаюсь выдернуть остатки из регистра:
SELECT
Товар as [Номенклатура $Справочник.Номенклатура],
Количество
FROM
РегистрСклад

Затем выдергиваю итоги средствами запроса 1С
Товар = Регистр.Склад.Товар;
Количество = Регистр.Склад.Количество;

Функция Кон = КонОст(Количество);

Группировка Товар;

В результате получаю различные данные. В результате, полученном с SQLite присутствуют итоги по номенклатуре, которой в наличии нет и которая отсутствует в результате 1-совского запроса.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #272 - 08. Декабря 2008 :: 11:24
Печать  
DrunkProgrammer писал(а) 08. Декабря 2008 :: 11:20:
Доброе время суток!
Может искал плохо, но вот нормальных примеров по работе с регистрами не нашел.
В общем пытаюсь выдернуть остатки из регистра:
SELECT
Товар as [Номенклатура $Справочник.Номенклатура],
Количество
FROM
РегистрСклад

Затем выдергиваю итоги средствами запроса 1С
Товар = Регистр.Склад.Товар;
Количество = Регистр.Склад.Количество;

Функция Кон = КонОст(Количество);

Группировка Товар;

В результате получаю различные данные. В результате, полученном с SQLite присутствуют итоги по номенклатуре, которой в наличии нет и которая отсутствует в результате 1-совского запроса.

Как говорится, учи мат. часть. Или хотя бы статью почитай: http://www.1cpp.ru/forum/YaBB.pl?num=1148874473 (обрати внимание на то, как получают остатки в ДБФ базах)
  
Наверх
 
IP записан
 
blindvic
Senior Member
****
Отсутствует



Сообщений: 486
Местоположение: Moldova
Зарегистрирован: 23. Июня 2008
Пол: Мужской
Re: 1sqlite
Ответ #273 - 27. Декабря 2008 :: 19:07
Печать  
Пытаюсь сделать запрос с использованием 1sqlite:
http://www.1cpp.ru/forum/YaBB.pl?num=1230067163/14#14
Там какая-то проблема с индексами. не могли бы вы посмотреть тестовую конфу (внутрь положить компоненту, запустить отчет тест->запрос.
Либо я запрос неправильно сделал, либо что-то с 1sqlite.
  

test_001.7z ( 13 KB | Загрузки )
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: 1sqlite
Ответ #274 - 15. Января 2009 :: 19:14
Печать  
Заметил что если со справочниками в 1sqlite в плане попадания в индекс можно поиграть с отборами реквизитов (конечно что попало лучше не ставить, но 1-2 реквизита на некоторых справочниках не критично имхо) и тогда попасть в индекс довольно легко, но что касается перебора таблиц документов, это невозможно долго. как вариант сначала к journ потом коннектить к ней док чтобы попасть в индекс... ну не знаю, много раз испытывал и заметил что джойнить sqlite умеет довольно плохо и ввиду этого выигрыша нет... или мне так кажется..ю
А какой вы знаете способ добавить в таблицу документов индекс скажем по нужной мне переменной?
Создавать ВТ, в ней индекс, туда пихать всю таблицу и потом разбираться в плане условий?

Кстати еще один тут случай был у меня:
Справочник... подчиненный другому, ставлю WHERE PARENTEXT = :ТекЭлемент, попадаю с помощью оптимизатора в Parent-овских индекс, стоило добавить еще одно условие вроде AND Дата = :ТекДата OR () ... и сразу же вылетел из индекса, потом подумал, в проверки подставил вместо даты сразу через MEtaDataWork значение, вместо других значений еще строковые и обратно попал в Parent-овский индекс.  Улыбка Во как было.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
DO
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 1
Местоположение: Смоленск
Зарегистрирован: 23. Июня 2009
Пол: Мужской
Re: 1sqlite
Ответ #275 - 23. Июня 2009 :: 18:05
Печать  
подскажите, плиз, что не так делаю:
Код
Выбрать все
"create table Движ as select distinct
	|Журнал.docno docno, Журнал.date, Реализ.iddoc [Докум :Документ.Реализация],
	|Реализ.Контрагент [Контрагент :Справочник.Контрагенты], РеализТЧ.Номенклатура [Номенклатура :Справочник.Номенклатура],
	|SUM(РеализТЧ.Количество) [Количество :Число.14.3], SUM(РеализТЧ.Сумма) [Сумма :Число.17.2],
	|СвваКонтр.ТипКонтрагента as [ТипКонтрагента :Справочник.ТипыКонтрагентов], СвваНоменкл.Категория as [Категория :Справочник.КатегорииНоменклатуры]
	|from Реализ, РеализТЧ, Журнал
	|left join СвваКонтр on Реализ.Контрагент = СвваКонтр.Контрагент
	|left join СвваНоменкл on РеализТЧ.Номенклатура = СвваНоменкл.Номенклатура
	|where (date between '"+ДатаН+"' and '"+ДатаК+"') and (Журнал.iddoc = Реализ.iddoc)
	|and (Реализ.iddoc = РеализТЧ.iddoc) and (Журнал.ismark NOT LIKE '*') and (Журнал.closed = 5)
	|" 


вот таким запросом создаю виртуальную таблицу с именем Движ, соответственно. При запросе всего ее содержимого в обычную ТЗ все проходит гладко. Поля у ТЗ соответствуют именам колонок, заданным при создании. Если нужно выполнить доп. фильтрацию или агрегирование по таблице Движ - ругается на отсутствие колонок. Например, запрос:
Код
Выбрать все
"select sum(Количество) as КоличествоИ, sum(Сумма) as СуммаИ from Движ where Движ.ТипКонтрагента = @ТекТипКонтрагента group by 1" 

сообщает, что no such column Количество.
Где сидит ошибка?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #276 - 23. Июня 2009 :: 18:39
Печать  
Создается таблица с именами колонок в точности как ты написал в запросе по её созданию. Т.е. если ты пишешь:
Код
Выбрать все
Реализ.iddoc [Докум :Документ.Реализация] 


то создаётся колонка с именем "[Докум :Документ.Реализация]" , а не "Докум" как ты скорее всего ожидал.
В общем, зачем делать типизацию при создании таблицы? Делай её во время получения данных.
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: 1sqlite
Ответ #277 - 24. Июня 2009 :: 03:57
Печать  
Код
Выбрать все
"create table Движ
|as
|select distinct
|  Журнал.docno docno
|, Журнал.date
|, Реализ.iddoc Докум
|, Реализ.Контрагент Контрагент
|, РеализТЧ.Номенклатура Номенклатура
|, SUM(РеализТЧ.Количество) Количество
|, SUM(РеализТЧ.Сумма) Сумма
|, СвваКонтр.ТипКонтрагента as ТипКонтрагента
|, СвваНоменкл.Категория as Категория
|from
|  Журнал
|  Inner join Реализ on Журнал.iddoc = Реализ.iddoc
|  left join РеализТЧ on РеализТЧ.iddoc = Реализ.iddoc
|  left join СвваКонтр on СвваКонтр.Контрагент = Реализ.Контрагент
|  left join СвваНоменкл on СвваНоменкл.Номенклатура = РеализТЧ.Номенклатура
|where
|  (Журнал.date between '"+ДатаН+"' and '"+ДатаК+"')
|   and (Журнал.ismark = '')
|   and (Журнал.closed = 5)
|"
 

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


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #278 - 24. Июля 2009 :: 07:38
Печать  
Народ, уверен, что кто то наверняка использует компоненту для работы с файлами БД sqlite, есть вопрос - никто не испытывал проблем с быстродействием при вставке данных в базу?
У меня в конфе сделана система логирования на основе нескольких баз sqlite, для разных подсистем свой лог.
При запуске конфигурации туда пишется различная системная инфа, дык вот заметил, что долго запускается, посмотрел под отладчиком и вроде как выходит, что много времени уходит на запись данных в логи...
структура фалов баз логов простая: event_date DATE ,event_time CHAR, event_text CHAR

1sqlite версия 1.0.1.9
  
Наверх
 
IP записан
 
nvg
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 72
Местоположение: Киев
Зарегистрирован: 14. Сентября 2006
Пол: Мужской
Re: 1sqlite
Ответ #279 - 24. Июля 2009 :: 08:44
Печать  
Замечал тоже подобное.
У меня запись большими порциями, потом только чтение.
Так вот само открытие БД притормаживает. Но файл БД у меня немаленький...
  
Наверх
ICQ  
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #280 - 24. Июля 2009 :: 09:12
Печать  
Наверное попробую реализовать что то типа кеширования - писать в таблицу в памяти и периодически скидывать в файл - может быстрее получится.
Хотя конечно странно - у меня файлики плевые, килов по 500, а при старте системы порядка 2 х секунд уходит на то что бы в лог несколько сообщений записать...
Наверно все-таки не там ищу или руки кривые.. Улыбка
  
Наверх
 
IP записан
 
leov-001
Full Member
***
Отсутствует


1C++ rocks!

Сообщений: 150
Зарегистрирован: 05. Марта 2009
Re: 1sqlite
Ответ #281 - 24. Июля 2009 :: 09:12
Печать  
Индексы используете?
Можно ощутимо уменьшить время загрузки и производительность выполнения некоторых операций, 
через проведение чистки и дефрагментации БД в SQLite.
Выполняя Команду
Код
Выбрать все
 VACUUM  

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


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #282 - 24. Июля 2009 :: 09:25
Печать  
не, индексов нет
да и размер файлов уж больно маленький, по мне так летать должно, я понимаю если бы было хотя бы 100Мb
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #283 - 24. Июля 2009 :: 09:49
Печать  
Перед вставкой открывай транзакцию. После вставки - фиксируй. http://sqlite.org/lang_transaction.html
У меня так в разы скорость увеличивается.
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #284 - 24. Июля 2009 :: 09:54
Печать  
А если при этом за раз вставляется только одна строка?
У меня такая схема: идет запуск конфигурации, по ходу инициализации подсистем вставляются сообщения вида "ВК такая то загружена", "подсистема такая-то инициализирована", т.е. у меня нет массированной вставки данных а есть некоторое кол-во вставок одиночных строк в таблицу.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #285 - 24. Июля 2009 :: 10:03
Печать  
Все равно попробуй Подмигивание

И еще. Скорее всего время вставки должно уменьшится, если отключить журнал http://sqlite.org/pragma.html
Попробуй установить journal_mode в OFF (конечно, если тебе роллбэк не нужен).
Ну можешь поиграться и с другими параметрами с этой странички (может размер кэша на что-нибудь повлияет ил еще что-нибудь отключить)
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #286 - 24. Июля 2009 :: 10:05
Печать  
а как правильно делать?
типа выполнить команду вида "PRAGMA journal_mode = OFF"?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #287 - 24. Июля 2009 :: 10:07
Печать  
По-моему да (просто под рукой нет эсины, проверить не могу. а память уже не та Подмигивание )
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #288 - 24. Июля 2009 :: 10:11
Печать  
о блин, кажется помогло!
спасибо большое за наводку!
ща еще потестирую..
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #289 - 24. Июля 2009 :: 10:12
Печать  
Если не трудно, положи сюда замеры с различными параметрами.
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #290 - 24. Июля 2009 :: 10:22
Печать  
точные замеры представить сложно, потому что там множественные запросы
но предварительно получилось такое - раньше под отладчиком время на эти запросы суммарно было около 1,7сек, теперь около 0,7сек
т.е. даже на вставке одной строки есть выигрыш, и он порядка 2-3 раза по скорсти
  
Наверх
 
IP записан
 
Inteco
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 6
Зарегистрирован: 10. Декабря 2008
Re: 1sqlite
Ответ #291 - 28. Апреля 2010 :: 12:47
Печать  
Кто-нибудь может ответить, работает эта чудо-компонента с sql базами 1с или только с DBF?  Озадачен
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: 1sqlite
Ответ #292 - 28. Апреля 2010 :: 12:54
Печать  
Тока с DBF. А те для каких целей?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Inteco
YaBB Newbies
*
Отсутствует


1C++ rocks!

Сообщений: 6
Зарегистрирован: 10. Декабря 2008
Re: 1sqlite
Ответ #293 - 28. Апреля 2010 :: 13:04
Печать  
Под дбф работала обработка по экспорту с применением этой компоненты. База будет переведена под скл, и тут два варианта: либо как-то заставить ее дружить с скл, либо писать заново, но уже с применением 1с++. Ну если однозначно 1sqlite не дружит с скл версиями 1с, тогда пишу заново.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #294 - 29. Апреля 2010 :: 05:39
Печать  
Это компонента в sql версии 1С не будет создавать виртуальные таблички 1С, но будет работать с sqlite базами
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать