Переключение на Главную Страницу Страницы: [1]  ОтправитьПечать
Очень популярная тема (более 25 ответов) Запрос прямой и черный (число прочтений - 6702 )
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Запрос прямой и черный
11. Августа 2009 :: 07:22
Печать  
Много читал про преимущества прямых запросов к ИБ 1С. Но наверное не внимательно или не все понял, т. к. не могу увидеть этого преимущества.
Попытался сам создать два варианта запроса: один "черный" другой  "прямой" с использованием 1sqlite (база ДБФ):

Код
Выбрать все
	Время1 = _GetPerformanceCounter();
	тЗап = "//{{ЗАПРОС(Сформировать)
	|Период с ДатаНачала по ДатаКонца;
	|ДатаДок = Документ.ЗаказНаряд.ДатаДок;
	|НомерДок = Документ.ЗаказНаряд.НомерДок;
	|ТекущийДокумент = Документ.ЗаказНаряд.ТекущийДокумент;
	|Подразделение = Документ.ЗаказНаряд.Подразделение;
	|Количество = Документ.ЗаказНаряд.Количество;
	|Функция КоличествоСумма = Сумма(Количество);
	|Группировка ТекущийДокумент Упорядочить по ТекущийДокумент.ДатаДок;
	|Условие (Подразделение = ВыбПодразделение);
	|";//}}ЗАПРОС

	Зап = СоздатьОбъект("Запрос");
	Зап.Выполнить(тЗап);
	Зап.Выгрузить(тзНаФорме,1,0);
	Время2 = _GetPerformanceCounter();
	Сообщить("1. Прошло = " + (Время2-Время1));
	Сообщить("Документов = " + тзНаформе.КоличествоСтрок());
 



и

Код
Выбрать все
	Время1 = _GetPerformanceCounter();
	Запрос.Подставлять("ДатаНачала", ДатаНачала);
	Запрос.Подставлять("ДатаКонца", ДатаКонца);
	Запрос.Подставлять("Подразделение", ВыбПодразделение);

	ТекстЗапроса = "
	|SELECT
	|	Жур.DATE AS [ДатаДок $Дата]
	|	,Жур.DOCNO AS НомерДок
	|	,Жур.IDDOC AS [Документ $Документ.ЗаказНаряд]
	|	,Подр.ID AS [Подразделение $Справочник.Подразделения]
	|	,SUM(ДокСтроки.Количество) AS Количество
	|FROM
	|	Журнал AS Жур
	|LEFT JOIN
	|	ДокументСтроки_ЗаказНаряд AS ДокСтроки
	|ON
	|	ДокСтроки.IDDOC = Жур.IDDOC
	|LEFT JOIN
	|	Документ_ЗаказНаряд AS ЗН
	|ON
	|	ЗН.IDDOC = Жур.IDDOC
	|LEFT JOIN
	|	Справочник_Подразделения AS Подр
	|ON
	|	ЗН.Подразделение = Подр.ID
	|WHERE
	|	Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
	|AND
	|	Подр.ID = :Подразделение AND
	|	Жур.CLOSED = 1
	|GROUP BY
	|	ДокСтроки.IDDOC
	|ORDER BY
	|	Жур.DATE
	|";

	//Запрос.Отладка(1);
	ТЗ = Запрос.ВыполнитьЗапрос(ТекстЗапроса);
	ТЗ.Выгрузить(тзНаФорме);
	Время2 = _GetPerformanceCounter();
	Сообщить("2. Прошло = " + (Время2-Время1));
	Сообщить("Документов = " + тзНаформе.КоличествоСтрок());
 



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



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #1 - 11. Августа 2009 :: 07:35
Печать  
соединение со справочником подразделений не нужно
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #2 - 11. Августа 2009 :: 07:35
Печать  
итога по колонке "количество" нет?
если есть, то соединение с ДокументСтроки_ЗаказНаряд тоже лишнее.
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #3 - 11. Августа 2009 :: 07:38
Печать  
что бы прямой запрос полностью соответствовал "черному" убери условие Жур.CLOSED = 1
  

1&&2&&3
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #4 - 11. Августа 2009 :: 07:39
Печать  
и еще знатоки дбф-ных индексов что-нибудь могут сказать про Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
  

1&&2&&3
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #5 - 11. Августа 2009 :: 07:40
Печать  
Ну во первых, ты делаешь суммирование по таблице строк документа, при этом проверь, если есть галка ИтогПоКолонке = 1 тогда использовать аналогичную колонку только в таблице шапки документа.
Во вторых я не понял зачем ты соединяешься с таблицей справочника... только в целях фильтрации?
Может переписать запрос таким образом:
Код
Выбрать все
ВЫБРАТЬ
	$Жур.ДатаДокумента КАК Дата
	,$Жур.НомерДокумента КАК Номер
	,$Жур.ТекущийДокумент КАК [Документ $Документ.ЗаказНаряд]
	,$Док.Подразделение КАК [Подразделение $Справочник.Подразделения]
	,$Док.Количество КАК Количество
ИЗ
	ЖурналДокументов КАК Жур $nolock
ЛЕВОЕ СОЕДИНЕНИЕ
	Документ.ЗаказНаряд КАК Док $nolock
ПО
	$Док.ТекущийДокумент = СРЕД($Жур.ПозицияДокумента,15,9)
ГДЕ
	$Жур.ПозицияДокумента МЕЖДУ :ДатаНачала И :ДатаКонца
И
	$Док.Подразделение = :Подразделение
УПОРЯДОЧИТЬ
	$Жур.ДатаДокумента 



Извините что пишу на привычном мне диалекте КОП ПрямойЗапрос...
Пы.Сы. это не реклама... мне так удобнее
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #6 - 11. Августа 2009 :: 07:43
Печать  
Вообще надо в данном случае включать режим отладки + _GetPerformanceCounter() и замерять
Вполне возможно что
Жур.idx_DATE_TIME_IDDOC BETWEEN ... AND ...
и соответственно соединение по вырезанной части индекса будет быстрее чем соединение по IDDOC и фильтр по DATE BETWEEN.
Я чет как то не замерял

Пы.сы. автору на заметку... может и так и так попробуешь расскажешь как получится?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос прямой и черный
Ответ #7 - 11. Августа 2009 :: 07:44
Печать  
trad писал(а) 11. Августа 2009 :: 07:35:
соединение со справочником подразделений не нужно

И как отобрать по конкретному подразделению;

trad писал(а) 11. Августа 2009 :: 07:35:
итога по колонке "количество" нет?
если есть, то соединение с ДокументСтроки_ЗаказНаряд тоже лишнее.


Итога по колонке нет.

trad писал(а) 11. Августа 2009 :: 07:35:
что бы прямой запрос полностью соответствовал "черному" убери условие Жур.CLOSED = 1


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


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #8 - 11. Августа 2009 :: 07:47
Печать  
Цитата:
И как отобрать по конкретному подразделению;

Док.Подразделение = :Подразделение

Цитата:
Итога по колонке нет.

Тогда поставь Смех шучу... тогда да + соединение с таб строки + сумма с группировкой по IDDOC

Цитата:
Но тогда черный выберет только проведенные, а прямой - все.

А у тя в черном запросе нет условий по проведенным или не проведенным документам  Подмигивание
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос прямой и черный
Ответ #9 - 11. Августа 2009 :: 07:50
Печать  
vandalsvq писал(а) 11. Августа 2009 :: 07:47:
Цитата:
И как отобрать по конкретному подразделению;

Док.Подразделение = :Подразделение

Цитата:
Итога по колонке нет.

Тогда поставь Смех шучу... тогда да + соединение с таб строки + сумма с группировкой по IDDOC

Цитата:
Но тогда черный выберет только проведенные, а прямой - все.

А у тя в черном запросе нет условий по проведенным или не проведенным документам  Подмигивание


Черному если ничего не указывать выберет только проведенные.
  
Наверх
 
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #10 - 11. Августа 2009 :: 07:52
Печать  
Kondarat писал(а) 11. Августа 2009 :: 07:44:
Но тогда черный выберет только проведенные, а прямой - все.

согласен. забыл что по умолчанию действует: ОбрабатыватьДокументы Проведенные;
  

1&&2&&3
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #11 - 11. Августа 2009 :: 07:54
Печать  
Каюсь.... вслед за trad, я тоже забыл... а может и не знал  Очень довольный

плохо когда не знал, да еще и забыл  Смех
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #12 - 11. Августа 2009 :: 07:56
Печать  
vandalsvq
ты лучше расскажи как грамотно попасть в индекс DOCTYPE
  

1&&2&&3
Наверх
 
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос прямой и черный
Ответ #13 - 11. Августа 2009 :: 07:57
Печать  
vandalsvq писал(а) 11. Августа 2009 :: 07:43:
Вообще надо в данном случае включать режим отладки + _GetPerformanceCounter() и замерять
Вполне возможно что
Жур.idx_DATE_TIME_IDDOC BETWEEN ... AND ...
и соответственно соединение по вырезанной части индекса будет быстрее чем соединение по IDDOC и фильтр по DATE BETWEEN.
Я чет как то не замерял

Пы.сы. автору на заметку... может и так и так попробуешь расскажешь как получится?


Не понял (опыта маловато). Речь идет об этой части запроса:
     |LEFT JOIN
     |      Документ_ЗаказНаряд AS ЗН
     |ON
     |      ЗН.IDDOC = Жур.IDDOC
     |WHERE
     |      Жур.idx_DATE_TIME_IDDOC BETWEEN :ДатаНачала AND :ДатаКонца
     |AND
     |      ЗН.Подразделение = :Подразделение AND
     |      Жур.CLOSED = 1
     |GROUP BY
     |      ДокСтроки.IDDOC
     |ORDER BY
     |      Жур.DATE      


  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #14 - 11. Августа 2009 :: 07:57
Печать  
2 trad
в SQLite или где?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
trad
1c++ power user
1c++ donor
1c++ moderator
Отсутствует



Сообщений: 3051
Местоположение: Киров
Зарегистрирован: 23. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #15 - 11. Августа 2009 :: 07:59
Печать  
vandalsvq писал(а) 11. Августа 2009 :: 07:57:
2 trad
в SQLite или где?

ну я не знаю где там у вас дбф-щиков это делается Улыбка
  

1&&2&&3
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #16 - 11. Августа 2009 :: 08:13
Печать  
Вот примеры с расчетом времени выполнения

Код
Выбрать все
SELECT Жур.*
FROM Журнал AS Жур
LEFT JOIN Документ_АвансовыйОтчет AS ДокАвансовыйОтчет
ON Жур.IDDOC = ДокАвансовыйОтчет.IDDOC
WHERE Жур.idx_IDDOCDEF_DATE_TIME_IDDOC BETWEEN ' A2L'||'20070101' AND ' A2L'||'20080101'
Подбор индекса для таблицы 1SJOURN:
	Ограничения: DOCTYPE[dx_IDDOCDEF_DATE_TIME_IDDOC]>=; DOCTYPE[dx_IDDOCDEF_DATE_TIME_IDDOC]<=;
	Найдено в кэше
	Выбран индекс DOCTYPE: IDDOCDEF+DTOS(DATE)+TIME+IDDOC
	Стоимость: 18
Подбор индекса для таблицы DH13053:
	Ограничения: IDDOC=;
	Найдено в кэше
	Выбран индекс ID: IDDOC
	Стоимость: 14
Время подготовки запроса: 32 мс, время выполнения запроса: 226 мс. 



Код
Выбрать все
SELECT Жур.*
FROM Журнал AS Жур
LEFT JOIN Документ_АвансовыйОтчет AS ДокАвансовыйОтчет
ON Жур.IDDOC = ДокАвансовыйОтчет.IDDOC
WHERE Жур.IDDOCDEF = ' A2L'
AND Жур.DATE BETWEEN '20070101' AND '20080101'
Подбор индекса для таблицы 1SJOURN:
	Ограничения: IDDOCDEF=; DATE>=; DATE<=;
	Найдено в кэше
	Выбран индекс DOCTYPE: IDDOCDEF+DTOS(DATE)+TIME+IDDOC
	Стоимость: 36
Подбор индекса для таблицы DH13053:
	Ограничения: IDDOC=;
	Найдено в кэше
	Выбран индекс ID: IDDOC
	Стоимость: 14
Время подготовки запроса: 30 мс, время выполнения запроса: 231 мс. 



Как видим разница не значительна. SQLite и в том и в другом случае выбирает индекс DOCTYPE, правда цена его использования несколько разная, и если приписать к датам '     0     0   ' то будет еще капельку эффективнее. В общем вот  Улыбка
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос прямой и черный
Ответ #17 - 11. Августа 2009 :: 08:55
Печать  
В моем случае результаты следующие:
Код
Выбрать все
	|LEFT JOIN
	|	Документ_ЗаказНаряд AS ЗН
	|ON
	|	ЗН.IDDOC = Жур.IDDOC
	|WHERE
//	|   Жур.IDDOCDEF = :ВидДокумента.ЗаказНаряд AND
//	|	Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
	|	idx_IDDOCDEF_DATE_TIME_IDDOC BETWEEN :ВидДокумента.ЗаказНаряд||:ДатаНачала AND :ВидДокумента.ЗаказНаряд||:ДатаКонца~
	|AND
	|	ЗН.Подразделение = :Подразделение AND
	|	Жур.CLOSED = 1
	|GROUP BY
	|	ДокСтроки.IDDOC
	|ORDER BY
	|	Жур.DATE
	|";

 



Черный -  Прошло = 102
Документов = 36
Прямой - Прошло = 83
Документов = 36

Код
Выбрать все
	|ON
	|	ЗН.IDDOC = Жур.IDDOC
	|WHERE
	|   Жур.IDDOCDEF = :ВидДокумента.ЗаказНаряд AND
	|	Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
//	|	idx_IDDOCDEF_DATE_TIME_IDDOC BETWEEN :ВидДокумента.ЗаказНаряд||:ДатаНачала AND :ВидДокумента.ЗаказНаряд||:ДатаКонца~
	|AND
	|	ЗН.Подразделение = :Подразделение AND
	|	Жур.CLOSED = 1
	|GROUP BY
	|	ДокСтроки.IDDOC
	|ORDER BY
	|	Жур.DATE
	|";

 



Черный -  Прошло = 101
Документов = 36
Прямой - Прошло = 84
Документов = 36

Значит использование
Код
Выбрать все
	|   Жур.IDDOCDEF = :ВидДокумента.ЗаказНаряд AND
	|	Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
 



или

Код
Выбрать все
idx_IDDOCDEF_DATE_TIME_IDDOC BETWEEN ...
 



практически не меняет результата.
А вот в третьем случае, если отключить отбор в журнале по виду документа прямой пригрывает черному:

Код
Выбрать все
	|LEFT JOIN
	|	Документ_ЗаказНаряд AS ЗН
	|ON
	|	ЗН.IDDOC = Жур.IDDOC
	|WHERE
//	|   Жур.IDDOCDEF = :ВидДокумента.ЗаказНаряд AND
	|	Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
//	|	idx_IDDOCDEF_DATE_TIME_IDDOC BETWEEN :ВидДокумента.ЗаказНаряд||:ДатаНачала AND :ВидДокумента.ЗаказНаряд||:ДатаКонца~
	|AND
	|	ЗН.Подразделение = :Подразделение AND
	|	Жур.CLOSED = 1
	|GROUP BY
	|	ДокСтроки.IDDOC
	|ORDER BY
	|	Жур.DATE
	|";

Черный -  Прошло = 109
Документов = 36
Прямой - Прошло = 147
Документов = 36
 



Выходит не зависимо от типизации в полях выборки и соединения с таблицей документа, отбор в журнале по виду документа является предпочтительным?


  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #18 - 11. Августа 2009 :: 09:07
Печать  
В последнем варианте скорее всего выбран индекс DATE_TIME_IDDOC? Посмотри в отладке... если нет, попробуй принудительно указать. Хотя скорее всего выигрыш будет маленьким. Вероятнее всего проблема именнов CLOSED = 1 и Подразделение = :Подразделение поскольку по обоим данным полям индекса нет.

А если интересно, можно перекинуть конфу на SQL посмотреть какой запрос пойдет в профайлере, может что поумнее 1С придумает там Улыбка  Подмигивание
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Kondarat
Junior Member
**
Отсутствует


I Love YaBB 2!

Сообщений: 83
Зарегистрирован: 21. Декабря 2007
Re: Запрос прямой и черный
Ответ #19 - 11. Августа 2009 :: 10:15
Печать  
vandalsvq писал(а) 11. Августа 2009 :: 09:07:
В последнем варианте скорее всего выбран индекс DATE_TIME_IDDOC? Посмотри в отладке... если нет, попробуй принудительно указать. Хотя скорее всего выигрыш будет маленьким. Вероятнее всего проблема именнов CLOSED = 1 и Подразделение = :Подразделение поскольку по обоим данным полям индекса нет.

А если интересно, можно перекинуть конфу на SQL посмотреть какой запрос пойдет в профайлере, может что поумнее 1С придумает там Улыбка  Подмигивание



Насчет индекса так и есть
Подбор индекса для таблицы 1SJOURN:
     Ограничения: CLOSED=; DATE>=; DATE<=;
     Найдено в кэше
     Выбран индекс ACDATETIM: DTOS(DATE)+TIME+IDDOC
     Стоимость: 54
Подбор индекса для таблицы DT4373:
     Ограничения: IDDOC=;
     Найдено в кэше
     Выбран индекс IDLINE: IDDOC+STR(LINENO,4)
     Стоимость: 36
Подбор индекса для таблицы DH4373:
     Ограничения: IDDOC=;
     Найдено в кэше
     Выбран индекс ID: IDDOC
     Стоимость: 16

Если убрать отбор по подразделению, прямой обгоняет черный, однако запрос без отбора теряет весь смысл.

Перекинуть конфу на SQL  не могу ввиду отсутствия последнего.
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #20 - 11. Августа 2009 :: 10:54
Печать  
Если честно случаи когда прямой запрос проигрывает 1С-вскому встречаются в природе. Но в общем и целом статистика на самом деле не в пользу 1С, совсем не в пользу 1С.
Я бы даже сказал что на столько не в пользу, что я даже не знаю синтаксис 7-шного объекта запрос...  Смех для меня его просто не существует
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
artbear
1c++ developer
1c++ moderator
Отсутствует


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

Сообщений: 6303
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #21 - 11. Августа 2009 :: 11:51
Печать  
ИМХО было что-то про виртуальные индексы у Саши Орефкова Улыбка
  

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


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #22 - 11. Августа 2009 :: 11:57
Печать  
artbear писал(а) 11. Августа 2009 :: 11:51:
ИМХО было что-то про виртуальные индексы у Саши Орефкова Улыбка

В какой то старой теме когда sqlite только раскручивалось Александр объяснял очень подробно многие вещи. Счас уже все точно не помню.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Eprst
God Member
*****
Отсутствует



Сообщений: 3397
Зарегистрирован: 08. Октября 2007
Re: Запрос прямой и черный
Ответ #23 - 11. Августа 2009 :: 12:10
Печать  
А на фоксовом провайдере, не замерял ?
Улыбка
  
Наверх
 
IP записан
 
kiruha
1c++ power user
Отсутствует



Сообщений: 1249
Зарегистрирован: 11. Апреля 2007
Re: Запрос прямой и черный
Ответ #24 - 13. Августа 2009 :: 12:37
Печать  
Eprst писал(а) 11. Августа 2009 :: 12:10:
А на фоксовом провайдере, не замерял ?
Улыбка

+5

У SqlLite
1. Проблема с масштабируемостью
2. Агрегирование и Join в случае отсутствия индекса происходит по алгоритму последовательного перебора -
что весьма небыстро на больших выборках
  
Наверх
 
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #25 - 13. Августа 2009 :: 13:29
Печать  
kiruha писал(а) 13. Августа 2009 :: 12:37:
У SqlLite
1. Проблема с масштабируемостью

Это как?
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #26 - 02. Сентября 2009 :: 13:51
Печать  
Да.... kiruha расскажи-ка про проблемы с масштабируемостью.
А вообще про join и агрегирование я давно понял.

Пы.сы. А еще он inner join делает плохо, и есть еще кое-какие проблемы. Но все-таки выигрыш порой весьма хорош. Хотя иногда и "проигрывать" приходиться.
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
JohnyDeath
1c++ power user
1c++ donor
Отсутствует



Сообщений: 3050
Местоположение: Волгоград
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Запрос прямой и черный
Ответ #27 - 02. Сентября 2009 :: 17:43
Печать  
У фокса тоже своих проблем хватает. И самая главная - это то, что приходется делать подбор индекса каждый раз ручками + условия становятся вообще нечитаемыми. А до универсальности вообще далеко. Пробовал как-то делать ВТ по регистрам для фокса, потом бросил, т.к. построение оптимального запроса происходило дольше чем выполнение самого запроса. Конечно, я много вещей не знаю, поэтому делал как мог.
Ну и не забываем про поставщика для ТП и монопольный режим (патч не предлагать) Подмигивание
  
Наверх
 
IP записан
 
orefkov
1c++ developer
1c++ moderator
Отсутствует


I Love YaBB 2!

Сообщений: 896
Зарегистрирован: 20. Мая 2006
Re: Запрос прямой и черный
Ответ #28 - 08. Сентября 2009 :: 05:28
Печать  
Вот скорее всего быстрее чем этот вариант выжать не получится.

Код
Выбрать все
|SELECT
|	Жур.DATE AS [ДатаДок :Дата]
|	,Жур.DOCNO AS НомерДок
|	,Жур.IDDOC AS [Документ :Документ.ЗаказНаряд]
|	,ЗН.Подразделение AS [Подразделение :Справочник.Подразделения]
|	,(SELECT SUM(ЗНС.Количество)
|		FROM ДокументСтроки_ЗаказНаряд ЗНС WHERE ЗНС.IDDOC=Жур.IDDOC)
|	AS [Количество :Число.15.3]
|FROM
|	Журнал AS Жур
|INNER JOIN
|	Документ_ЗаказНаряд AS ЗН
|ON
|	ЗН.IDDOC = Жур.IDDOC
|WHERE
|	Жур.DATE BETWEEN :ДатаНачала AND :ДатаКонца
|	AND Жур.IDDOCDEF = :ВидДокумента.ЗаказНаряд
|	AND
|	ЗН.Подразделение = :Подразделение AND
|	Жур.CLOSED = 1
|ORDER BY
|	Жур.DATE 

  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


Я всего лишь als-особиратель
;-)

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Запрос прямой и черный
Ответ #29 - 11. Сентября 2009 :: 03:24
Печать  
В целом вариант хороший. Но с левым еще чуток малость поэффективнее. По крайней мере на моих замерах так. И.... конечно SQLite позволяет не указывать группировку, но все таки наверное это немного не правильно, с точки зрения синтаксиса... или я ошибаюсь?
  

Отхожу от дел. Долго и мучительно.
Наверх
IP записан
 
Переключение на Главную Страницу Страницы: [1] 
ОтправитьПечать