Переключение на Главную Страницу Страницы: 1 [2] 3 4 ... 6 ОтправитьПечать
Очень популярная тема (более 25 ответов) Вопрос по ТП (число прочтений - 16197 )
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #15 - 16. Сентября 2009 :: 14:26
Печать  
chessman писал(а) 16. Сентября 2009 :: 14:15:
Доков 2х видов 18509
Всего доков 78874

это за год ?

это очень мало странно что без явного хинта индекса все так плохо.
Скорее всего что-то со статистикой не так либо очень огромная фрагментация таблицы и слабая дисковая система.

Только что проверил без явного указания индекса журнала
select идет сканирование по кластерному индексу журнала т.е. перебирает все документы.
Когда указан журнал select c (NOLOCK INDEX=JOURNAL) то сразу scan seek по индексу JOURN
и поиск намного быстрее.так что был не прав я почему то предполагал что sql сможет сам найти индекс ан нет.

Подумал почему бы вместо union all
не попробовать запрос написать через case вроде красивее получается.
« Последняя редакция: 17. Сентября 2009 :: 06:08 - Z1 »  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #16 - 16. Сентября 2009 :: 14:32
Печать  
За  2,5 года, на счет case посмотрю Улыбка
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #17 - 17. Сентября 2009 :: 08:19
Печать  
C case все оказалось гораздо хуже
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #18 - 17. Сентября 2009 :: 08:20
Печать  
Вариант 1 ( аналогичный твоему )
Код
Выбрать все
|SELECT
|		 Журн.date_time_iddoc as [Дт $Дата]
|		,Журн.iddoc    [Док $Документ]
|		,Журн.iddocdef					  Док_вид
|		,Журн.docno as НомерДок
|	 ,$ПКО.Валюта [Валюта $Справочник.Валюты]
|	 ,$ПКО.Фирма  [Фирма $Справочник.Фирмы]
|	 ,$ПКО.Сумма123  as СуммаПКО
|	 ,0 as СуммаРКО
|FROM   _1SJourn  Журн with(NOLOCK  INDEX=JOURNAL)
|INNER JOIN    $Документ.ПриходныйКассовый ПКО (NOLOCK)
|ON ПКО.iddoc = Журн.iddoc
|WHERE  IDJOURNAL = 331
|AND 	(Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата )
|AND    Журн.iddocdef = 336
|UNION ALL
|SELECT
|		 Журн.date_time_iddoc
|		,Журн.iddoc
|		,Журн.iddocdef
|		,Журн.docno
|	 ,$РКО.Валюта
|	 ,$РКО.Фирма
|	 ,0
|	 ,$РКО.Сумма123
|FROM   _1SJourn  Журн with(NOLOCK  INDEX=JOURNAL)
|INNER JOIN    $Документ.РасходныйКассовый РКО (NOLOCK)
|ON РКО.iddoc = Журн.iddoc
|WHERE  IDJOURNAL = 331
|AND 	(Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата )
|AND    Журн.iddocdef = 322
|";

 

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #19 - 17. Сентября 2009 :: 08:21
Печать  
Вариант 2
Код
Выбрать все
|SELECT
|		 Журн.date_time_iddoc as [Дт $Дата]
|		,Журн.iddoc    [Док $Документ]
|		,Журн.iddocdef					  Док_вид
|		,Журн.docno as НомерДок
|	 ,(case when Журн.iddocdef = 336 then $ПКО.Валюта    else $РКО.Валюта    end)  [Валюта $Справочник.Валюты]
|	 ,(case when Журн.iddocdef = 336 then $ПКО.Фирма     else $РКО.Фирма     end)  [Фирма $Справочник.Фирмы]
|	 ,(case when Журн.iddocdef = 336 then $ПКО.Сумма123  else 0		  end) as СуммаПКО
|	 ,(case when Журн.iddocdef = 336 then 0		  else $РКО.Сумма123  end) as СуммаРКО
|FROM   _1SJourn  Журн with(NOLOCK  INDEX=JOURNAL)
|LEFT JOIN    $Документ.ПриходныйКассовый ПКО (NOLOCK)
|ON ПКО.iddoc = Журн.iddoc
|LEFT JOIN    $Документ.РасходныйКассовый РКО (NOLOCK)
|ON РКО.iddoc = Журн.iddoc
|WHERE  IDJOURNAL = 331
|AND 	(Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата )
|";
 

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



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #20 - 17. Сентября 2009 :: 08:29
Печать  
2-й сильнее тормозит?
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #21 - 17. Сентября 2009 :: 08:36
Печать  
chessman писал(а) 17. Сентября 2009 :: 08:29:
2-й сильнее тормозит?

по фактическому времени делал в qa
Вариант 1    всегда мгновенно 0 сек
Вариант 2    1-2 секунды
Интервал выборки год. Сумарно выбрано документов 34 100 обоими запросами одинаково.

По планам выполнения вариант 2 выглядит очень плохо по сравнению с вариантом 1.

Кстати для твоего запроса зачем в твоем запросе left со справочниками
и второе можно сразу писать  Журн.date_time_iddoc as [Дт $Дата]
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #22 - 17. Сентября 2009 :: 08:42
Печать  
left со справочниками для "правильной" сортировки в ТП, иначе он по id будет сортировать, а не по descr

Цитата:
и второе можно сразу писать  Журн.date_time_iddoc as [Дт $Дата]


буду знать Круглые глаза
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #23 - 17. Сентября 2009 :: 08:48
Печать  
chessman писал(а) 17. Сентября 2009 :: 08:42:
left со справочниками для "правильной" сортировки в ТП, иначе он по id будет сортировать, а не по descr

Цитата:
и второе можно сразу писать  Журн.date_time_iddoc as [Дт $Дата]


буду знать Круглые глаза

ну тогда надо формировать разные запросы в зависимости есть или нет сортировка.( с left или без left )
Ну и вообще не очень увлекаться сортировками.

Кстати Вариант 1 и Вариант 2 все может по времени выполнения  измениться если нужно будет добавить сортировку
в варианте 2 уже есть упорядоченность по времени
а в варианте 1 ее еще надо отсортировать.
  
Наверх
 
IP записан
 
chessman
God Member
*****
Отсутствует



Сообщений: 1084
Зарегистрирован: 10. Августа 2007
Re: Вопрос по ТП
Ответ #24 - 17. Сентября 2009 :: 09:20
Печать  
Цитата:
ну тогда надо формировать разные запросы в зависимости есть или нет сортировка.( с left или без left )
Ну и вообще не очень увлекаться сортировками.


Ну тогда мне нужно "весь" цикл установки запроса пройти, а так я просто меняю КП (ключ порядка)
Я делал замеры с join-ми и без них - это особо не сказывалось на результатах, так что я решил join-ить справочники
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #25 - 17. Сентября 2009 :: 09:48
Печать  
chessman писал(а) 17. Сентября 2009 :: 09:20:
Цитата:
ну тогда надо формировать разные запросы в зависимости есть или нет сортировка.( с left или без left )
Ну и вообще не очень увлекаться сортировками.


Ну тогда мне нужно "весь" цикл установки запроса пройти, а так я просто меняю КП (ключ порядка)
Я делал замеры с join-ми и без них - это особо не сказывалось на результатах, так что я решил join-ить справочники

ну это потому что справочники малые.
ну и как бы если можно не нагружать sql то надо к этому стремиться.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #26 - 17. Сентября 2009 :: 09:49
Печать  
Вариант 21
Код
Выбрать все
|SELECT
|		 Журн.date_time_iddoc as [Дт $Дата]
|		,Журн.iddoc    [Док $Документ]
|		,Журн.iddocdef					  Док_вид
|		,Журн.docno as НомерДок
|	 ,$ПКО.Валюта [Валюта $Справочник.Валюты]
|	 ,$ПКО.Фирма  [Фирма $Справочник.Фирмы]
|	 ,$ПКО.Сумма123  as СуммаПКО
|	 ,0 as СуммаРКО
|FROM   _1SJourn  Журн with(NOLOCK  INDEX=JOURNAL)
|INNER JOIN    $Документ.ПриходныйКассовый ПКО (NOLOCK)
|ON ПКО.iddoc = Журн.iddoc
|WHERE  IDJOURNAL = 331
|AND 	(Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата )
|AND    Журн.iddocdef = 336
|UNION ALL
|SELECT
|		 Журн.date_time_iddoc
|		,Журн.iddoc
|		,Журн.iddocdef
|		,Журн.docno
|	 ,$РКО.Валюта
|	 ,$РКО.Фирма
|	 ,0
|	 ,$РКО.Сумма123
|FROM   _1SJourn  Журн with(NOLOCK  INDEX=JOURNAL)
|INNER JOIN    $Документ.РасходныйКассовый РКО (NOLOCK)
|ON РКО.iddoc = Журн.iddoc
|WHERE  IDJOURNAL = 331
|AND 	(Журн.date_time_iddoc BETWEEN :НачДата AND :КонДата )
|AND    Журн.iddocdef = 322
|ORDER BY  Журн.date_time_iddoc
|";
 

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


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #27 - 17. Сентября 2009 :: 09:50
Печать  
Вариант21 Отличается от  Варианта 2 только наличием сортировки по времени
и вот уже вариант 21 и вариант 1 выполняются за одинаковое время.
Может вечером попробую эти варианты
за больший период. Можно также будет попробовать на более
слабом сервере чтобы увидеть разницу в скорости выполнения.
  
Наверх
 
IP записан
 
Z1
God Member
*****
Отсутствует


I Love YaBB 2!

Сообщений: 2906
Местоположение: Москва
Зарегистрирован: 26. Мая 2006
Пол: Мужской
Re: Вопрос по ТП
Ответ #28 - 17. Сентября 2009 :: 14:49
Печать  
на выборке из 217000 отобранных документов
Вариант 1     8 сек
Вариант 2     4 сек
Вариант 21   6 сек
  
Наверх
 
IP записан
 
vandalsvq
1c++ power user
Отсутствует


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

Сообщений: 2487
Местоположение: Уфа
Зарегистрирован: 18. Июля 2007
Пол: Мужской
Re: Вопрос по ТП
Ответ #29 - 17. Сентября 2009 :: 17:16
Печать  
У меня организовано аналогично второму варианту, только не через case, а через coalesce. Вроде работает нормально.  Подмигивание
  

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