Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
 Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
Уважаемые подскажите, как можно оптимизировать запрос?
Кол. Строк: t1=10млн., t2=4000, дикий план смогу позже предоставить.

Select t1.f1, t1.f2
From t1
 Inner join t2 on t1.f1=t2.f1
 Inner join 
  (
  Select t1.f1, t2.f2 
  From t1
   Inner join t2 on t1.f1=t2.f1
  Group by t1.f1, t2.f2
  Having count(t1.f3) >1
  ) as t3 on t3.f1=t1.f1 and t3.f2=t1.f2
2 дек 16, 22:45    [19961889]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
iljy
Member

Откуда:
Сообщений: 8711
Homasters,

а индексы какие-нибудь есть? поле t1.f3 насколько селективно (сколько в нем not null)? Вообще запрос реально дикий, напишите словами, че сделать-то надо
2 дек 16, 23:03    [19961930]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
iljy,

f3 уникальных значений 6, null около 20-30, индекс есть на f1
Суть задачи: выбрать товары и их свойство(f1+f2 уникальное значение) которые находятся больше чем в 1м месте (f3) , и после этого выбрать уже все записи из таблиц t1 и t2.
2 дек 16, 23:53    [19962047]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
iljy
Member

Откуда:
Сообщений: 8711
Homasters,

"больше чем в 1м месте (f3)" - это count(distinct) что ли? А структуру таблиц показать, индексы?
f2 есть и в t1, и в t2? Тогда зачем его надо из т2 тащить, почему нельзя т1 обойтись?
3 дек 16, 00:20    [19962124]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
iljy,
Именно count(distinct)), да поле ф2 можно брать из т1, но в т2 есть поля отличные от т1 которые нужно выводить( я этого не указал).
3 дек 16, 00:39    [19962159]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
iljy,

Индексы,структура- я могу только модифицировать запрос(,вот!
3 дек 16, 00:43    [19962168]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
Тормоза явно из за:
  Group by t1.f1, t2.f2
  Having count(distinct t1.f3) >1

Может как-то можно без группировки и дистинкт обойтись?
3 дек 16, 00:49    [19962185]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
aleks2
Guest
Homasters
Уважаемые подскажите, как можно оптимизировать запрос?
Кол. Строк: t1=10млн., t2=4000, дикий план смогу позже предоставить.

Select t1.f1, t1.f2
From t1
 Inner join t2 on t1.f1=t2.f1
 Inner join 
  (
  Select t1.f1, t2.f2 
  From t1
   Inner join t2 on t1.f1=t2.f1
  Group by t1.f1, t2.f2
  Having count(t1.f3) >1
  ) as t3 on t3.f1=t1.f1 and t3.f2=t1.f2


Самое тупое

;with x as ( select t1.f1, t1.f2, t1.f3 From t1 Inner join t2 on t1.f1=t2.f1)
  select f1, f2 from x
    where exists( select * from x as x1 where x1.f1=x.f1 and x1.f2=x.f2 and x1.f3 <> x.f3 )


Если же подумать, то

;with x as ( select t1.f1, t1.f2, t1.f3 From t1 Inner join t2 on t1.f1=t2.f1)
  select f1, f2 from x
    where exists( select * from t1 as x1 where x1.f1=x.f1 and x1.f3 <> x.f3 )
3 дек 16, 08:19    [19962395]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
aleks2
Guest
Если же еще напрячься...

;with x as ( select t1.f1 from t1 where exists( select * from t1 as x1 where x1.f1 = t1.f1 and x1.f3 <> t1.f3 ) )
  select x.f1, t1.f2 From x inner join t2 on t1.f1=t2.f1
3 дек 16, 08:24    [19962398]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
iljy
Member

Откуда:
Сообщений: 8711
Homasters
iljy,
Именно count(distinct)), да поле ф2 можно брать из т1, но в т2 есть поля отличные от т1 которые нужно выводить( я этого не указал).


Ну так и берите из т1, а т2 цепляйте в конце уже к результату отбора, примерно как aleks2 написал. Правда, если нужен вывод без дублей, все равно придется делать группировку, и уж лучше тогда сразу. Но по одной таблице будет проще.
3 дек 16, 10:36    [19962470]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
iljy, aleks2

Спасибо, в понедельник попробую о результатах сообщу!

Если кто ещё подкинит идею, будет здорово)
3 дек 16, 20:02    [19963821]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
Запрос и план выполнения, вариант1:
SELECT Column1, Column3, Column7, Column9
INTO Object1
		FROM Database1.Schema1.Object2 WITH (NOLOCK)
		INNER JOIN Database1.Schema1.Object3
			ON Column11=Column7
		INNER JOIN (
			SELECT Column1 Column2,Column3 Column4
			FROM Database1.Schema1.Object2 WITH (NOLOCK)
			INNER JOIN Database1.Schema1.Object3
			ON Column11=Column7
			GROUP BY Column1,Column3
			HAVING count(DISTINCT Column9)>1
			) Object4
		ON Column1=Object4.Column2
		AND Column3=Object4.Column4


К сообщению приложен файл. Размер - 66Kb
5 дек 16, 12:16    [19967531]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Homasters,
зачем
			INNER JOIN Database1.Schema1.Object3
			ON Column11=Column7

в
INNER JOIN (
			SELECT Column1 Column2,Column3 Column4
			FROM Database1.Schema1.Object2 WITH (NOLOCK)
			INNER JOIN Database1.Schema1.Object3
			ON Column11=Column7
			GROUP BY Column1,Column3
			HAVING count(DISTINCT Column9)>1
			) Object4
5 дек 16, 12:19    [19967550]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
Вариант 2:
aleks2
Самое тупое



;with Object1 as (select Object2.Column1, Object3.Column2, Object3.Column3, Object3.Column4, Object3.Column5  
			  from Database1.Schema1.Object4 as Object3 WITH (NOLOCK)
				Inner join Database1.Schema1.Object5 as Object2 on Object3.Column4=Object2.Column6)
select Column1, Column2, Column3, Column4, Column5  
from Object1
where exists(select * from Object1 as Object6 
		   where	Object6.Column2=Object1.Column2 
					and Object6.Column1=Object1.Column1 
					and Object6.Column5<>Object1.Column5)


К сообщению приложен файл. Размер - 61Kb
5 дек 16, 12:23    [19967573]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
TaPaK,
там связь с этой таблицей
ON Column1=Object4.Column2
AND Column3=Object4.Column4
5 дек 16, 12:28    [19967600]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Homasters
TaPaK,
там связь с этой таблицей
ON Column1=Object4.Column2
AND Column3=Object4.Column4

а вы на плане не видите что делаете 2 раза одно и тоже?
5 дек 16, 12:32    [19967623]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
aleks2
Guest
Осподе! Спаси и сохрани!
Homasters
from Object1 as Object6 [/src]


Партизаны.
5 дек 16, 12:33    [19967626]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50


К сообщению приложен файл. Размер - 40Kb
5 дек 16, 12:35    [19967640]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
aleks2
Guest
Homasters


Ну запрети параллелизм.
А ишо лучше - сделай индексы.

ЗЫ. Менее тупой вариант уберет одно соединение. Это много
5 дек 16, 12:40    [19967665]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
Если делаю так:
;with Object1 as (select Object2.Column1, Object3.Column2, Object3.Column3, Object3.Column4, Object3.Column5  
			from Database1.Schema1.Object4 as Object3 WITH (NOLOCK)
				Inner join Database1.Schema1.Object5 as Object2 on Object3.Column4=Object2.Column6)
select Column1, Column2, Column3, Column4, Column5  
from Object1
where exists( select * from Object1 as Object6 
				where	Object6.Column2=Object1.Column2 and Object6.Column1=Object1.Column1
				GROUP BY Column1,Column2 
				HAVING Function1(DISTINCT Column5)>1)


К сообщению приложен файл. Размер - 77Kb
5 дек 16, 12:41    [19967668]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
aleks2
Guest
Ну и, про между прочим, в запросах РАЗНЫЕ поля используются.
Поэтому, сравнение ниочем.

Партизаны хреновы.
5 дек 16, 12:44    [19967689]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
aleks2
Guest
Homasters
Если делаю так:

Лучше не делай. Просто убейся ап стенку.
5 дек 16, 12:46    [19967698]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
aleks2,
Ну запрети параллелизм.

это так: option (maxdop 1)
5 дек 16, 12:59    [19967762]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
AmKad
Member

Откуда:
Сообщений: 5308
Homasters
Уважаемые подскажите, как можно оптимизировать запрос?

Переписать через аналитический count.
6 дек 16, 15:36    [19973046]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
AmKad,
Переписать через аналитический count.

Это как?
6 дек 16, 15:59    [19973181]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить