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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #210 - 01. Ноября 2007 :: 07:40
Печать  
JohnyDeath писал(а) 01. Ноября 2007 :: 07:30:
Орефков
Цитата:
+ перед колонкой ничего не делает, но исключает ее из кандитатов на использование индексов.

а этот "+" ставиться или не ставиться пока(?) чисто тестово-интуитивном методом?

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #211 - 01. Ноября 2007 :: 09:30
Печать  
orefkov писал(а) 01. Ноября 2007 :: 07:36:
Да, походу так и есть.
Запрос с группировкой - 3800
Просто выгрузка движений во врем-таблицу 800
Группировка по врем таблице без индекса - 3000
Создал индекс по врем таблице.
Группировка по врем таблице с индексом - 800


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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #212 - 01. Ноября 2007 :: 10:22
Печать  
Тестовую базу не переиндексировал?
По поводу дубликатов при GROUP BY.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #213 - 01. Ноября 2007 :: 11:17
Печать  
orefkov писал(а) 01. Ноября 2007 :: 10:22:
Тестовую базу не переиндексировал?
По поводу дубликатов при GROUP BY.


Удалил все CDX и воссоздал заново.
Упростил запрос и проверил на другом регистре
Код
Выбрать все
SELECT

РегОстатки.Товар as Товар,
SUM(1) as c

FROM
     Регистр_ОстаткиТоваров as РегОстатки

GROUP BY Товар

order by Товар 



С + нормально, без - только упорядочивает.
  
Наверх
 
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #214 - 01. Ноября 2007 :: 12:22
Печать  
Народ, вам автоматические тесты нужны 100%.
И повтора ошибок не будет Улыбка
И разработка намного проще и удобнее становится Улыбка
  

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #215 - 01. Ноября 2007 :: 12:35
Печать  
artbear писал(а) 01. Ноября 2007 :: 12:22:
Народ, вам автоматические тесты нужны 100%.
И повтора ошибок не будет Улыбка
И разработка намного проще и удобнее становится Улыбка


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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #216 - 01. Ноября 2007 :: 12:59
Печать  
2kiruha

Странно как-то все.
Упростил запрос до такого:
Код
Выбрать все
SELECT
Товар,
sum(1)
from Регистр_Скидки
group by Товар
 


Детальный анализ программы выполнения с "group by +Товар", без использования индекса.
Открывается временный индексированный курсор (OpenEphemeral).
Выбираются записи из таблицы регистра, укладываясь в этот курсор в виде полей "Товар", счетчик строк, "Товар" :
Код
Выбрать все
VColumn	0	7    // Извлечение колонки "Товар"
Sequence	1	0    // Получение счетчика строк
VColumn	0	7    // Извлечение колонки "Товар"
MakeRecord	3	0  // Создание записи
IdxInsert	1	0   // Вставка созданной записи в курсор.
 


После выборки всех записей, временный курсор перемещается в начало выборки:
Код
Выбрать все
Sort
 


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

Если же вариант с "group by Товар" (с использованием индекса), то просто не делается выгрузка во временный индексированный курсор. Выбираются записи из регистра, упорядоченные по "Товар", производится сравнение с предудущим значением ключа, если равны, то агрегируется, если не равны, выдает очередную строку результата.

На первый взгляд все верно.
Что при вставке в индекс, что при сравнении ключей используется BINARY сравнение, то бишь memcmp.
Единственно возможный вариант расхождений в результатах - если порядок сортировки в родном индексе не совпадает с порядком сортировки в SQLite.
Можешь попробовать сравнить результаты двух таких запросов:
Код
Выбрать все
SELECT
Товар
from Регистр_Скидки
order by Товар
 


и
Код
Выбрать все
SELECT
Товар
from Регистр_Скидки
order by +Товар
 


То бишь первый запрос выдаст строки в порядке следования их в индексе dbf-файла, а второй - упорядоченные самим SQLite'ом. Будет ли разница между ними?

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #217 - 01. Ноября 2007 :: 13:11
Печать  
Вот такой код типа:
Код
Выбрать все
Процедура Сформировать()
	база = СоздатьОбъект("SQLiteBase");
	база.Открыть(":memory:");
	запрос = база.НовыйЗапрос();
	запрос.ВыполнитьЗапрос("create virtual table test using dbeng(Регистр.ОстаткиТоваров)");
	тз1 = запрос.ВыполнитьЗапрос("
	|SELECT
	|Товар
	|from test
	|order by +Товар");
	Сообщить("Строк=" + тз1.КоличествоСтрок());
	тз2 = запрос.ВыполнитьЗапрос("
	|SELECT
	|Товар
	|from test
	|order by Товар");
	Для Номер = 1 По тз1.КоличествоСтрок() Цикл
		т1 = тз1.ПолучитьЗначение(Номер, 1);
		т2 = тз2.ПолучитьЗначение(Номер, 1);
		Если т1<>т2 Тогда
			Сообщить("В строке " + Номер + " т1 = " + т1 + " т2 = " + т2);
			Возврат;
		КонецЕсли;
	КонецЦикла;
	Сообщить("Результат одинаков");
КонецПроцедуры
 


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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #218 - 01. Ноября 2007 :: 13:12
Печать  
Да, есть разница.
С "+" сортирует, без - нет.

Только в таблице RA99 по которой запрос - нет индексов с полем товар.
Сортировка Machine
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #219 - 01. Ноября 2007 :: 13:19
Печать  
После добавления индекса на ТОвар  - нормально сортирует и группирует.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #220 - 01. Ноября 2007 :: 13:19
Печать  
kiruha писал(а) 01. Ноября 2007 :: 13:12:
Да, есть разница.
С "+" сортирует, без - нет.

Только в таблице RA99 по которой запрос - нет индексов с полем товар.
Сортировка Machine

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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #221 - 01. Ноября 2007 :: 13:32
Печать  
Не прикрепляет Печаль zip

Второе
По товару

Использование таблиц                        
order      from      detail            
0      0      TABLE Регистр_ОстаткиТоваров VIRTUAL TABLE INDEX 1:RA99.DATETIME;? ORDER BY            
                       
Программа выполнения                        
addr      opcode      p1      p2      p3
0      Noop      0      0      
1      Goto      0      11      
2      VOpen      0      0      vtab:26CCC14:30312F8
3      Integer      0      0      
4      Integer      1      0      
5      VFilter      0      9      RA99.DATETIME;?
6      VColumn      0      8      
7      Callback      1      0      
8      VNext      0      6      
9      Close      0      0      
10      Halt      0      0      
11      Transaction      0      0      
12      VerifyCookie      0      5      
13      Goto      0      2      
14      Noop      0      0      

По +Товар

Использование таблиц                        
order      from      detail            
0      0      TABLE Регистр_ОстаткиТоваров VIRTUAL TABLE INDEX -1:            

Программа выполнения                        
addr      opcode      p1      p2      p3
0      OpenEphemeral      1      3      keyinfo(1,BINARY)
1      Goto      0      26      
2      VOpen      0      0      vtab:26CCC14:30312F8
3      Integer      0      0      
4      Integer      -1      0      
5      VFilter      0      14      
6      VColumn      0      8      
7      MakeRecord      1      0      
8      VColumn      0      8      
9      Sequence      1      0      
10      Pull      2      0      
11      MakeRecord      3      0      
12      IdxInsert      1      0      
13      VNext      0      6      
14      Close      0      0      
15      OpenPseudo      2      0      
16      SetNumColumns      2      1      
17      Sort      1      24      
18      Integer      1      0      
19      Column      1      2      
20      Insert      2      0      
21      Column      2      0      
22      Callback      1      0      
23      Next      1      18      
24      Close      2      0      
25      Halt      0      0      
26      Transaction      0      0      
27      VerifyCookie      0      5      
28      Goto      0      2      
29      Noop      0      0      


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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #222 - 01. Ноября 2007 :: 13:43
Печать  
Обассацца.
Че-то где я так накосячил, что он у меня выдает индекс DATETIME, когда надо сортировку по товару?
Ясен пень, что так не сагрегировать.
SQLite думает, что выборка упорядочена по "товар", а я данные отдаю по "datetime".
Ща разберемся как следует.
Спасибо большое за помощь.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #224 - 01. Ноября 2007 :: 14:14
Печать  
Наковырял.
Смотрим стартовый топик.
Баг с подбором индексов для "order by" устранен.

kiruha - проверь теперь плиз.
Теперь если "Товар" ни в один индекс не попадает, то должны быть один план выполнения, что с
group by Товар, что с group by +Товар.
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 13 14 [15] 16 17 ... 20
ОтправитьПечать