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



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #195 - 31. Октября 2007 :: 09:49
Печать  
Вообщем релизовал сохранение подзапросов во временные таблицы.

Итого на локальной
1. без временных 56 000
2. с временными 1 300
3. Fox около 1000

Но у Fox получилось меньше строк.
SqlLite в компоненте ошибки группировки -  например
Код
Выбрать все
SELECT

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

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

GROUP BY Товар

order by Товар 



много одинаковых строк
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #197 - 31. Октября 2007 :: 13:44
Печать  
kiruha писал(а) 31. Октября 2007 :: 09:49:
SqlLite в компоненте ошибки группировки -  например
Код
Выбрать все
SELECT

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

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

GROUP BY Товар

order by Товар 



много одинаковых строк

Протестил на 1.0.0.8
Вроде стало нормально.
Единственный косяк: неверно выбирает индекс.
У меня в регистре движений по Товару есть индекс, и есть "Быстрая обработка движений".
Так вот выполняется выборка по всему регистру с упорядочиванием по товару, с проверкой каждой записи на попадание в date. Что очень плохо.
Пока лечится так:
Код
Выбрать все
SELECT
РегОстатки.Товар as Товар,
SUM(1) as c
FROM
	Регистр_Товары as РегОстатки
WHERE
   РегОстатки.Date between '20050101' and '20050131'
GROUP BY +Товар
order by +Товар
 


"+" перед названием колонки в SQLite ничего не делают, однако подавляют тест колонки на попадание в индекс.
Если по регистру не установлен флажок "Быстрая обработка движений", то есть нет индекса DATETIME, то бишь date не попадает ни в один индекс, запрос надо модифицировать соединением с Журналом:
Код
Выбрать все
SELECT
РегОстатки.Товар as Товар,
SUM(1) as c
FROM Журнал inner join
	Регистр_Товары as РегОстатки on Журнал.iddoc = РегОстатки.iddoc
WHERE
   Журнал.Date between '20050101' and '20050131'
GROUP BY +Товар
order by +Товар
 


  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #198 - 31. Октября 2007 :: 14:01
Печать  
На справочниках 1.8 субъективно работает быстрее
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #199 - 31. Октября 2007 :: 14:19
Печать  
GROUP BY +РегРезервы.Товар

нормально

GROUP BY РегРезервы.Товар

не группирует (но сортирует)

аналогичный эффект при GROUP BY +Товар и GROUP BY Товар
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #200 - 31. Октября 2007 :: 14:46
Печать  
Потестировал JOIN подзапросов на разных размерах таблиц подзапросов -
почти при всех размерах соединяемых таблиц существенно выгодней создать временную таблицу
и проиндексировать и только потом соединяться, даже на маленьких таблицах.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #201 - 31. Октября 2007 :: 15:14
Печать  
Я может что пропустил...
Такой запрос:
Код
Выбрать все
SELECT
Агенты.descr as ИмяАгента,
Sum(РегОстатки.Количество) as Кол
FROM Регистр_БСО as РегОстатки
  left join Справочник_Сотрудники as Агенты on РегОстатки.Лицо = Агенты.id
WHERE
   РегОстатки.Date between '20050101' and '20050131'
Group by ИмяАгента 


отрабатывает за 913 мс
меняем left на inner и получаем время выполнения: 33519
в случае с лэфтом вот такой план:
0      0      TABLE Регистр_БСО AS РегОстатки VIRTUAL TABLE INDEX 1:RA25709.DATETIME;? 0;0;
1      1      TABLE Справочник_Сотрудники AS Агенты VIRTUAL TABLE INDEX 0:SC208.IDD;?0;

с иннером:
0      1      TABLE Справочник_Сотрудники AS Агенты VIRTUAL TABLE INDEX 4:SC208.DESCR;> ORDER BY
1      0      TABLE Регистр_БСО AS РегОстатки VIRTUAL TABLE INDEX 1:RA25709.DATETIME;? 0;0;

Т.е в случае с "иннер" неправильно выбирается индекс? Я правильно понял?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #202 - 31. Октября 2007 :: 15:23
Печать  
Также похоже SqlLite не строит вспомогательные индексы при группировках и Order By
Код
Выбрать все
SELECT

РегОстатки.Товар as Товар,
РегОстатки.Склад as Склад,
РегОстатки.Фирма as Фирма,
РегОстатки.iddoc as iddoc,

SUM(1) as c

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

GROUP BY +Товар,+Склад,+Фирма,+iddoc

ORDER BY  Товар 



(специально много полей группировки, но так часто пишут)
- Lite  1723 мс
- Fox  832 мс

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #203 - 31. Октября 2007 :: 20:25
Печать  
kiruha писал(а) 31. Октября 2007 :: 14:19:
GROUP BY +РегРезервы.Товар

нормально

GROUP BY РегРезервы.Товар

не группирует (но сортирует)

аналогичный эффект при GROUP BY +Товар и GROUP BY Товар

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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #204 - 31. Октября 2007 :: 20:34
Печать  
JohnyDeath писал(а) 31. Октября 2007 :: 15:14:
Я может что пропустил...
Такой запрос:
Код
Выбрать все
SELECT
Агенты.descr as ИмяАгента,
Sum(РегОстатки.Количество) as Кол
FROM Регистр_БСО as РегОстатки
  left join Справочник_Сотрудники as Агенты on РегОстатки.Лицо = Агенты.id
WHERE
   РегОстатки.Date between '20050101' and '20050131'
Group by ИмяАгента 


отрабатывает за 913 мс
меняем left на inner и получаем время выполнения: 33519
в случае с лэфтом вот такой план:
0      0      TABLE Регистр_БСО AS РегОстатки VIRTUAL TABLE INDEX 1:RA25709.DATETIME;? 0;
0;
1      1      TABLE Справочник_Сотрудники AS Агенты VIRTUAL TABLE INDEX 0:SC208.IDD;?
0;

с иннером:
0      1      TABLE Справочник_Сотрудники AS Агенты VIRTUAL TABLE INDEX 4:SC208.DESCR;> ORDER BY
1      0      TABLE Регистр_БСО AS РегОстатки VIRTUAL TABLE INDEX 1:RA25709.DATETIME;? 0;
0;

Т.е в случае с "иннер" неправильно выбирается индекс? Я правильно понял?

Именно.
Когда применяется left join, порядок таблиц во from изменять нельзя. Поэтому SQLite вынужден идти по регистру по индексу DATETIME, подтягивать к нему записи из справочника, группируя затем их самостоятельно.
В случае же с inner join таблицы можно поменять местами, и SQLite предпочитает в данном случае пойти сначала по справочнику по индексу DESCR, полагая, что это облегчит ему дальнейшую группировку.
Каюсь, в этом по большей части моя вина, так как о цене использования индексов по таблицам 1С я информирую SQLite пока крайне приблизительно.
Пока же можно для правильного выбора индекса применить трюк с "+" :
Код
Выбрать все
SELECT
Агенты.descr as ИмяАгента,
Sum(РегОстатки.Количество) as Кол
FROM Регистр_БСО as РегОстатки
  inner join Справочник_Сотрудники as Агенты on РегОстатки.Лицо = Агенты.id
WHERE
   РегОстатки.Date between '20050101' and '20050131'
Group by +ИмяАгента 


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


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #205 - 31. Октября 2007 :: 20:38
Печать  
kiruha писал(а) 31. Октября 2007 :: 15:23:
Также похоже SqlLite не строит вспомогательные индексы при группировках и Order By
Код
Выбрать все
SELECT

РегОстатки.Товар as Товар,
РегОстатки.Склад as Склад,
РегОстатки.Фирма as Фирма,
РегОстатки.iddoc as iddoc,

SUM(1) as c

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

GROUP BY +Товар,+Склад,+Фирма,+iddoc

ORDER BY  Товар 



(специально много полей группировки, но так часто пишут)
- Lite  1723 мс
- Fox  832 мс

Т.е. на данный момент SqlLite очень хорошо читает данные, работает с индексами базовых таблиц,
выбирает TOP N по индексам, но слабо работает с групповыми операциями над таблицами.

Опять 25.
Уточни у этого регистра есть флаг "Быстрая обработка движений" и "Отбор движений" у ресурса "Товар" ?
И используемость таблиц и индексов неплохо бы привести.
И можно ли как либо узнать что-то типа плана выполнения у Фокса?
Типа по каким таблицам/индексам он пошел.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #206 - 01. Ноября 2007 :: 05:51
Печать  
Так же хотелось бы глянуть статистику по загрузке проца и использованию памяти в сравнении фокса и sqlite.
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #207 - 01. Ноября 2007 :: 07:05
Печать  
orefkov писал(а) 31. Октября 2007 :: 20:38:
kiruha писал(а) 31. Октября 2007 :: 15:23:
Также похоже SqlLite не строит вспомогательные индексы при группировках и Order By
Код
Выбрать все
SELECT

РегОстатки.Товар as Товар,
РегОстатки.Склад as Склад,
РегОстатки.Фирма as Фирма,
РегОстатки.iddoc as iddoc,

SUM(1) as c

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

GROUP BY +Товар,+Склад,+Фирма,+iddoc

ORDER BY  Товар 



(специально много полей группировки, но так часто пишут)
- Lite  1723 мс
- Fox  832 мс

Т.е. на данный момент SqlLite очень хорошо читает данные, работает с индексами базовых таблиц,
выбирает TOP N по индексам, но слабо работает с групповыми операциями над таблицами.

Опять 25.
Уточни у этого регистра есть флаг "Быстрая обработка движений" и "Отбор движений" у ресурса "Товар" ?
И используемость таблиц и индексов неплохо бы привести.
И можно ли как либо узнать что-то типа плана выполнения у Фокса?
Типа по каким таблицам/индексам он пошел.


Быстрая обработка движений есть, Отбор движений у измерения товар нет.
Fox использует индекс I=DATETIME  при чтении (явно ему указываю, а что ему явно не указывать - не использует).
Не встречал способов просмотреть план выполнения у Fox, но он известен "теоретически". Есть "аналог":
spock писал(а) 17. Сентября 2007 :: 04:32:
Advantage oledb provider может показывать план.

........
В данном примере скорость получения данных(и индексы) вообще не интересует (можно было работать просто с временными таблицами).
Из 1723 мс общего времени SqlLite на получение данных затратил только 383 мс (20%)- все остальное на группировку и сортировку.
У Fox получение данных 550мс (70%) из 832 мс.

Я просто сравнивал скорость операции группировки. 
И по личному опыту - у Fox наличие группировок и сортировок - крайне слабо отражается на общем времени выполнения.

И даже теоретически - если SqlLite использует простой последовательный перебор в групповых операциях при отсутствии уже сформированного индекса - трудно ожидать высокой скорости выполнения этих операций ...
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #208 - 01. Ноября 2007 :: 07:30
Печать  
Орефков
Цитата:
+ перед колонкой ничего не делает, но исключает ее из кандитатов на использование индексов.

а этот "+" ставиться или не ставиться пока(?) чисто тестово-интуитивном методом?
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #209 - 01. Ноября 2007 :: 07:36
Печать  
Да, походу так и есть.
Запрос с группировкой - 3800
Просто выгрузка движений во врем-таблицу 800
Группировка по врем таблице без индекса - 3000
Создал индекс по врем таблице.
Группировка по врем таблице с индексом - 800
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 12 13 [14] 15 16 ... 20
ОтправитьПечать