Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 60046 )
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