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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #60 - 24. Июня 2008 :: 09:31
Печать  
Создал проект на googlecode
http://code.google.com/p/sqlite1c/
Бинарники можно качать оттудова.
Исходники тянуть любым svn-клиентом: http://sqlite1c.googlecode.com/svn/trunk/*sqlite1c-read-only
* замените на пробел, чето форум непонимает линки с пробелами
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #61 - 24. Июня 2008 :: 09:35
Печать  
kiruha писал(а) 24. Июня 2008 :: 09:11:
orefkov писал(а) 24. Июня 2008 :: 08:59:
Chieftain писал(а) 24. Июня 2008 :: 08:00:
А как у SQLite обстоят дела с ХП?

ХП нет. Только запросы.

А файловые операции?
И как дела тогда с запросом вида :
Код
Выбрать все
Select TOP N
...
WHERE MyIndex>'Какое то значение'
Order by MyIndex 

??
Как используется ли индекс в этом случае?

В SQLite пишется
Код
Выбрать все
Select
...
WHERE MyIndex>'Какое то значение'
Order by MyIndex
limit N
 


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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #62 - 24. Июня 2008 :: 09:40
Печать  
orefkov писал(а) 24. Июня 2008 :: 09:35:
В SQLite пишется
Код
Выбрать все
Select
...
WHERE MyIndex>'Какое то значение'
Order by MyIndex
limit N
 


если индекс есть по полю MyIndex, он используется.

Непонятно :
будет произведено позиционирование и далее считывание N записей (что очень быстро)
или
Выборка WHERE, потом упорядочивание выборки, потом отбор N записей
?
Если поставщик табличного поля запрашивает N записей от текущей (упорядоченной по индексу)
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #63 - 24. Июня 2008 :: 10:00
Печать  
При таком простом условии (сравнение по одному полю, входящему в индекс), будет очень хорошо:
двинет по индксу, отсчитает нужное количество записей.

При ключе с двумя полями входящими в один индекс, все гораздо хуже. Для MSSQL у Дмитро применяется сейчас такая конструкция:
Код
Выбрать все
where field1 > 'key1' or (field1 = 'key1' and field2 > 'key2')
 


MSSQL нормально понимает такую запись, двигает по индексу.
SQLite - во-первых выражения, объединенные по OR не оптимизирует, только по AND.
Во-вторых, с константами не работает (те он все равно не поймет, что в обоих подусловиях одинаковый 'key1')

Если переписать условие вот так:
Код
Выбрать все
where field1 >= 'key1' AND NOT (field1 = 'key1' AND field2 <='key2')
 


то SQLite для начала двинет по индексу на 'key1', потом будет идти по индексу, проверяя каждую запись на NOT (field1 = 'key1' AND field2 <='key2')
Это конечно несколько оптимальнее, но все равно не то, чего бы хотелось. А если еще и по первому полю селективность низкая, вообще хреново.
К сожалению, умение составлять английские предложения - не сильная моя черта, а то бы давно им фичереквест написал.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #64 - 24. Июня 2008 :: 10:03
Печать  
Вести с мисты - говорят, под вайном работает.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #65 - 24. Июня 2008 :: 10:31
Печать  
А такой запрос:
Код
Выбрать все
SELECT *
	|FROM Сотрудники
	|WHERE UPPER(Сотрудники.Descr) like 'Орефков%' 


не должен попадать в индекс Descr ?
Fox попадает.

и ещё:
1. так НЕ попадает:
Код
Выбрать все
WHERE UPPER(Сотрудники.Descr) = 'Орефков' 


2. так попадает:
Код
Выбрать все
WHERE Сотрудники.Descr = 'Орефков' 


3. так НЕ попадает
Код
Выбрать все
WHERE Сотрудники.Descr like 'Орефков%' 

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #66 - 24. Июня 2008 :: 10:53
Печать  
JohnyDeath писал(а) 24. Июня 2008 :: 10:31:
А такой запрос:
Код
Выбрать все
SELECT *
	|FROM Сотрудники
	|WHERE UPPER(Сотрудники.Descr) like 'Орефков%' 


не должен попадать в индекс Descr ?
Fox попадает.

Не попадет. SQLite для попадания в индекс должен видеть условие
ПолеТаблицы = | > | < | >= | <= | like выражение

Здесь же у тебя Выражение = выражение.
При сравнении с полями таблиц SQLite он может оптимизироватьусловие like 'строка%', заменяя его на два условия >= and <=.
Но если условие like применяется к полю виртуальной таблицы, он запрашивает мой модуль, могу ли я его обработать. В текущей версии ВК никак не обрабатывает условия like, отдавая их на откуп SQLite.
В этом случае SQLite не разбивает like 'строка%' на два условия.
  
Наверх
 
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #67 - 24. Июня 2008 :: 11:33
Печать  
[quote author=orefkov link=1214205575/30#42 date=1214287457]Ошибку нашел.
Исправил.
В шапке.
1.0.1.3[/quote]
гут. :)
спасибо.

А типизацию субконто а-ля ODBCRecordset сложно сделать?
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: 1sqlite
Ответ #68 - 24. Июня 2008 :: 11:46
Печать  
Есть вопрос к этому разделу хелпа:
Цитата:
О числовых полях.

В SQLite нет поддержки работы с полями типа numeric. Для числовых полей в SQLite используются либо целые числа, либо double. Тип double гарантирует 16 точных знаков числа, то есть для нецелых числовых полей таблиц 1С, с длинной больше 17, возможна потеря точности. Также известно, что нецелые числа в double хранятся не всегда точно (с возможной ошибкой в 17 знаке, те например 0.3 хранится как 0.30000000000000001). Например, условие 0.3 - 0.1 = 0.2 не будет выполнятся. Поэтому в запросах с умом пользуйтесь функцией round. Например, условие round(0.3 - 0.1, 1) = 0.2 будет выполнятся.


Получается, чтобы не нарваться на косяки везде при расчетах нужно вставлять "round".
Плюс числовые колонки жестко типизировать в числу?
Неужели сделать ничего нельзя?

ЗЫ... И почему это меня сильно напрягает Озадачен
  
Наверх
ICQ  
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #69 - 24. Июня 2008 :: 11:49
Печать  
[quote author=steban link=1214205575/60#67 date=1214307188][quote author=orefkov link=1214205575/30#42 date=1214287457]Ошибку нашел.
Исправил.
В шапке.
1.0.1.3[/quote]
гут. :)
спасибо.

А типизацию субконто а-ля ODBCRecordset сложно сделать?[/quote]

Как раз таки делаю. Если посмотреть исходники, видно ведь
[code]
case ttSubconto:
     break;
[/code]
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #70 - 24. Июня 2008 :: 11:54
Печать  
Chieftain писал(а) 24. Июня 2008 :: 11:46:
Есть вопрос к этому разделу хелпа:
Цитата:
О числовых полях.

В SQLite нет поддержки работы с полями типа numeric. Для числовых полей в SQLite используются либо целые числа, либо double. Тип double гарантирует 16 точных знаков числа, то есть для нецелых числовых полей таблиц 1С, с длинной больше 17, возможна потеря точности. Также известно, что нецелые числа в double хранятся не всегда точно (с возможной ошибкой в 17 знаке, те например 0.3 хранится как 0.30000000000000001). Например, условие 0.3 - 0.1 = 0.2 не будет выполнятся. Поэтому в запросах с умом пользуйтесь функцией round. Например, условие round(0.3 - 0.1, 1) = 0.2 будет выполнятся.


Получается, чтобы не нарваться на косяки везде при расчетах нужно вставлять "round".
Плюс числовые колонки жестко типизировать в числу?
Неужели сделать ничего нельзя?

ЗЫ... И почему это меня сильно напрягает Озадачен


Ну, на практике у меня не было случаев, когда бы это сильно напрягало.
Поделать в рамках текущей версии SQLite в-принципе можно: все поля numeric отдавать как blob, а для всех арифметических операций реализовать свои функции (и для агрегирования тоже)
те вместо
Код
Выбрать все
sum((а + б) / с)
 


будет что-то типа
Код
Выбрать все
numSum(numDiv(numAdd(а, б), c))
  


Оно это надо?
  
Наверх
 
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: 1sqlite
Ответ #71 - 24. Июня 2008 :: 11:58
Печать  
orefkov писал(а) 24. Июня 2008 :: 11:54:
Ну, на практике у меня не было случаев, когда бы это сильно напрягало.
Поделать в рамках текущей версии SQLite в-принципе можно: все поля numeric отдавать как blob, а для всех арифметических операций реализовать свои функции (и для агреширования тоже)
те вместо
Код
Выбрать все
sum((а + б) / с)
 


будет что-то типа
Код
Выбрать все
numSum(numDiv(numAdd(а, б), c))
  


Оно это надо?

В таком виде, конечно нет
Но я вот сейчас и тестирую все это дело...
Самый частый вопрос - разбивка остатка на основные и базовые единицы... Коэффициент основной единицы возвращается криво очень часто, все дальнейшие расчеты с его использованием ессно тоже кривые. Т.е. для норального расчета нужно юзать ROUND.
А потом сидеть и думать - как бы где еще не попалось число, которое храниться будет неправильно. ИМХО нездорово это
  
Наверх
ICQ  
IP записан
 
steban
1c++ developer
Отсутствует


#define sizeof(x) rand()

Сообщений: 787
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #72 - 24. Июня 2008 :: 12:07
Печать  
orefkov писал(а) 24. Июня 2008 :: 09:31:
Исходники тянуть любым svn-клиентом: http://sqlite1c.googlecode.com/svn/trunk/*sqlite1c-read-only
* замените на пробел, чето форум непонимает линки с пробелами

Консольным клиентом тянуть так:
Код
Выбрать все
svn checkout http://sqlite1c.googlecode.com/svn/trunk/ sqlite1c-read-only 


Для GUI-клиентов указывать URL: http://sqlite1c.googlecode.com/svn/trunk/
  

int getRandomNumber()&&{&&  return 4; //chosen by fair dice roll&&         //guaranteed to be random&&}
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #73 - 24. Июня 2008 :: 12:09
Печать  
Chieftain писал(а) 24. Июня 2008 :: 11:58:
Но я вот сейчас и тестирую все это дело...
Самый частый вопрос - разбивка остатка на основные и базовые единицы... Коэффициент основной единицы возвращается криво очень часто, все дальнейшие расчеты с его использованием ессно тоже кривые. Т.е. для норального расчета нужно юзать ROUND.
А потом сидеть и думать - как бы где еще не попалось число, которое храниться будет неправильно. ИМХО нездорово это

Можешь показать пример на конкретных числах, где конечный результат расчета (при установке типизации колонки Число.Длина.Точность) отличается от результата Фокса или 1С ?
  
Наверх
 
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: 1sqlite
Ответ #74 - 24. Июня 2008 :: 12:15
Печать  
orefkov писал(а) 24. Июня 2008 :: 12:09:
Chieftain писал(а) 24. Июня 2008 :: 11:58:
Но я вот сейчас и тестирую все это дело...
Самый частый вопрос - разбивка остатка на основные и базовые единицы... Коэффициент основной единицы возвращается криво очень часто, все дальнейшие расчеты с его использованием ессно тоже кривые. Т.е. для норального расчета нужно юзать ROUND.
А потом сидеть и думать - как бы где еще не попалось число, которое храниться будет неправильно. ИМХО нездорово это

Можешь показать пример на конкретных числах, где конечный результат расчета (при установке типизации колонки Число.Длина.Точность) отличается от результата Фокса или 1С ?

При установке типизации числовых колонок и использовании ROUND считает нормально.
Хотя конструкция
Код
Выбрать все
Select ROUND(ЧисловоtПоле,3) as ЧисловаяКолонка 


не дает нормальное число в колонке, баааальшие дроби, хотя и только на некоторых числах.
И математические операции без использования ROUND приводят к весьма странным результатам с дробной частью
  
Наверх
ICQ  
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 3 4 [5] 6 7 ... 79
ОтправитьПечать