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