Переключение на Главную Страницу Страницы: 1 ... 27 28 [29] 30 31 ... 79 ОтправитьПечать
Очень популярная тема (более 25 ответов) 1sqlite (число прочтений - 532460 )
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #420 - 18. Ноября 2008 :: 10:42
Печать  
Chieftain писал(а) 18. Ноября 2008 :: 10:25:
Может мне кто подскажет, в чем засада. Пробую два аналогичныйх запроса на Oledb и 1sqlite

База в обоих случаях локально на висте, пробовал и транзакции и вообще все подряд. Результат, с незначителными изменениями, одинаковый


В SQLLite соединение с временными таблицами(вложенный подзапрос) идет по алгоритму полного перебора - а в Fox предварительно индексируется.
Можно либо принудительно проиндексировать подзапрос до соединения или писать запрос без вложенного подзапроса (вышеприведенный пример это позволяет)
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #421 - 18. Ноября 2008 :: 10:44
Печать  
kiruha писал(а) 18. Ноября 2008 :: 10:42:
Можно либо принудительно проиндексировать подзапрос

а можно спросить, как это сделать? через временную таблицу?
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #422 - 18. Ноября 2008 :: 10:49
Печать  
Наверное как-то так: http://sb-news.net/sqlite.php?page=41
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #423 - 18. Ноября 2008 :: 11:00
Печать  
это то понятно, но для этого подзапрос нужно выкинуть видимо во временную таблицу, проиндексировать ее и потом в запросе с ней джойнить, я правильно понял мысль?
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: 1sqlite
Ответ #424 - 18. Ноября 2008 :: 11:00
Печать  
CaBaT писал(а) 18. Ноября 2008 :: 10:44:
kiruha писал(а) 18. Ноября 2008 :: 10:42:
Можно либо принудительно проиндексировать подзапрос

а можно спросить, как это сделать? через временную таблицу?


Да. Во временную. Потом добавить индекс во временной по тем полям, по которым будет соединение.
  
Наверх
 
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #425 - 18. Ноября 2008 :: 11:03
Печать  
спасибо
конечно по сравнению с OLEDB решение получается более громоздким...
но я все равно сейчас всю конфу переделываю на 1sqilte Улыбка
  
Наверх
 
IP записан
 
Djelf
God Member
*****
Отсутствует


Ubuntu + wine@etersoft
+ 1C 7.7

Сообщений: 635
Местоположение: Питер
Зарегистрирован: 02. Ноября 2007
Пол: Мужской
Re: 1sqlite
Ответ #426 - 18. Ноября 2008 :: 11:34
Печать  
Замер() только у меня отвалился?
0% загрузки процессора и нет ответа от 1С (на любом запросе в 1sqlite_console).
  
Наверх
www  
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: 1sqlite
Ответ #427 - 18. Ноября 2008 :: 11:44
Печать  
kiruha писал(а) 18. Ноября 2008 :: 11:00:
Да. Во временную. Потом добавить индекс во временной по тем полям, по которым будет соединение.


Да, кстати... скорость выросла значительно. Хотя в предыдущие разы сокращалось до ~2000 мс

Код
Выбрать все
НачВремя=_GetPerformanceCounter();
БазаSQLite		    = СоздатьОбъект("SQLiteBase");
БазаSQLite.Открыть(":memory:");
Запрос			  = БазаSQLite.НовыйЗапрос();
Запрос.ВыполнитьЗапрос("Create table SQL_OSTATKI (ID TEXT,Количество REAL)");
Запрос.ВыполнитьЗапрос("Create index ID ON SQL_OSTATKI (ID)");
Запрос.Подставлять("НачДата",НачМесяца(ТекущаяДата()));
Запрос.ВыполнитьЗапрос("INSERT INTO SQL_OSTATKI
|    SELECT врОст.Номенклатура,SUM(врОст.Количество)
|	  FROM РегистрИтоги_ОстаткиТМЦ as врОст
|		 WHERE врОст.period=:НачДата
|	  GROUP BY 1
|	  HAVING SUM(врОст.Количество)<>0
|");

ТекстЗапроса		= "
|SELECT		Товары.Descr [Наименование:Строка],
|			Товары.IsMark as [Пометка as $Строка],
|			Остатки.Количество [Остаток:Число.19.3]
|FROM		Справочник_Номенклатура as Товары
|LEFT JOIN SQL_OSTATKI as Остатки ON Остатки.ID=Товары.ID
|";
Табл			  = Запрос.ВыполнитьЗапрос(ТекстЗапроса);
 


Упало время выполнения в разделенном до 380, в монопольном до 170
  
Наверх
ICQ  
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #428 - 18. Ноября 2008 :: 12:17
Печать  
Полуофф.
А разве сначала заполнение данных, а уж потом создание индекса/индексация не будет пошустрее?
  

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
Ответ #429 - 18. Ноября 2008 :: 13:52
Печать  
Chieftain писал(а) 18. Ноября 2008 :: 10:25:
Может мне кто подскажет, в чем засада.

Засада в том, что этот запрос для 1sqlite надо писать так:

Код
Выбрать все
SELECT
	Товары.Descr [Наименование:Строка],
	Товары.IsMark as [Пометка as $Строка],
	(
		select SUM(врОст.Количество) FROM РегистрИтоги_ОстаткиТМЦ as врОст
		WHERE period=:НачДата and врОст.Номенклатура = Товары.ID
	) [Остаток:Число.19.3]
FROM Справочник_Номенклатура as Товары
WHERE (Товары.IsMark<>'*')AND(Товары.IsFolder=2)
ORDER BY 1
 



скорее всего, в данном случае куцый оптимизатор sqlite не смог втащить условие соединения внутрь позапроса, то есть на КАЖДУЮ запись из справочника товаров в памяти во временную таблицу суммируются ВСЕ записи из регистра с нужным периодом, и потом среди этих просуммированных записей ищется одна строка с нужным ID. Либо суммы просчитываются один раз, но поиск в них по ID неиндексирован.
Более точно можно ответить, выполнив explain и explain query plan, либо включив замер.

Ну и естественно, многое зависит от есть ли отбор итогов по измерению Номенклатура.
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #430 - 18. Ноября 2008 :: 14:04
Печать  
Александр, так стОит ждать БыстрыйПоиск в поставщике для ТП? Без него, ИМХО, как без рук.
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: 1sqlite
Ответ #431 - 18. Ноября 2008 :: 14:05
Печать  
JohnyDeath писал(а) 18. Ноября 2008 :: 14:04:
Александр, так стОит ждать БыстрыйПоиск в поставщике для ТП? Без него, ИМХО, как без рук.

Ок. Посмотрю на неделе.
  
Наверх
 
IP записан
 
Chieftain
Senior Member
****
Отсутствует


___

Сообщений: 498
Местоположение: Тула
Зарегистрирован: 15. Февраля 2007
Пол: Мужской
Re: 1sqlite
Ответ #432 - 21. Ноября 2008 :: 06:53
Печать  
orefkov писал(а) 18. Ноября 2008 :: 13:52:
Chieftain писал(а) 18. Ноября 2008 :: 10:25:
Может мне кто подскажет, в чем засада.

Засада в том, что этот запрос для 1sqlite надо писать так:

Код
Выбрать все
SELECT
	Товары.Descr [Наименование:Строка],
	Товары.IsMark as [Пометка as $Строка],
	(
		select SUM(врОст.Количество) FROM РегистрИтоги_ОстаткиТМЦ as врОст
		WHERE period=:НачДата and врОст.Номенклатура = Товары.ID
	) [Остаток:Число.19.3]
FROM Справочник_Номенклатура as Товары
WHERE (Товары.IsMark<>'*')AND(Товары.IsFolder=2)
ORDER BY 1
 



скорее всего, в данном случае куцый оптимизатор sqlite не смог втащить условие соединения внутрь позапроса, то есть на КАЖДУЮ запись из справочника товаров в памяти во временную таблицу суммируются ВСЕ записи из регистра с нужным периодом, и потом среди этих просуммированных записей ищется одна строка с нужным ID. Либо суммы просчитываются один раз, но поиск в них по ID неиндексирован.
Более точно можно ответить, выполнив explain и explain query plan, либо включив замер.

Ну и естественно, многое зависит от есть ли отбор итогов по измерению Номенклатура.


Да, возможно такой варант был бы приемлим. Но этот пример решает проблему только с одним запросом. В реале вложенный запрос может иметь более сложную структуру с соединением движений регистра, а также получением итогов и движений по второму регистру. В такоем случае лучше подход как в
http://www.1cpp.ru/forum/YaBB.pl?num=1214205575/420#427
  
Наверх
ICQ  
IP записан
 
CaBaT
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 718
Местоположение: Санкт-Петербург
Зарегистрирован: 26. Октября 2007
Пол: Мужской
Re: 1sqlite
Ответ #433 - 21. Ноября 2008 :: 11:57
Печать  
Решил тут глянуть поставщика ТП для SQLite, обнаружил такое ограничение: в доке написано, что нельзя в запросе использовать конструкцию "order by".
Возможно мой вопрос очень глупый, но все же - а как делать сортировку результата?
Например если делать замену формы списка справочника "Номенклатура"?
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: 1sqlite
Ответ #434 - 21. Ноября 2008 :: 12:12
Печать  
сортировка в ТП определяется ключем порядка (метод УстКлючПорядка)
  

1&&2&&3
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1 ... 27 28 [29] 30 31 ... 79
ОтправитьПечать