Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Having count, оптимизация  [new]
o-o
Guest
свое Object1 считайте 1 раз, сложив во временную таблицу:
with Object1 as ... --> select ... into #object1 from...

и в нем же inner join смените на inner hash join
6 дек 16, 16:01    [19973194]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
AmKad
Member

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

Это как?
Дай пример тестовых данных и описание того, что хочешь получить, попробую накидать решение.
6 дек 16, 16:06    [19973225]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
AmKad
Homasters
пропущено...

Это как?
Дай пример тестовых данных и описание того, что хочешь получить, попробую накидать решение.


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

Откуда: Москва
Сообщений: 50
o-o
свое Object1 считайте 1 раз, сложив во временную таблицу:
with Object1 as ... --> select ... into #object1 from...

и в нем же inner join смените на inner hash join


Заполнение временной таблицы:
with x as  (select f06.MCCO, f02.IBITM, f02.IBLITM, f02.IBMCU, f02.IBTAX1  
			from JDE_PRODUCTION.PRODDTA.F4102 as f02 WITH (NOLOCK)
				inner hash join JDE_PRODUCTION.PRODDTA.F0006 as f06 on f02.IBMCU=f06.MCMCU
				)
select * into #obj_x from x


К сообщению приложен файл. Размер - 58Kb
6 дек 16, 16:39    [19973369]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
o-o
Guest
ну не повезло, таблица шире, чем ожидалось.
значит, выкладывайте скрипт таблиц и индексов,
и план аттачментом, а не картинкой
-----
а пока:
хинт убирайте, но слив во временную таблицу оставьте.
и зачем cte, почему не просто
select f06.MCCO, f02.IBITM, f02.IBLITM, f02.IBMCU, f02.IBTAX1 
into #obj_x 
from JDE_PRODUCTION.PRODDTA.F4102 as f02 WITH (NOLOCK)
	inner join JDE_PRODUCTION.PRODDTA.F0006 as f06 on f02.IBMCU=f06.MCMCU

дальше ее используйте в коде вместо Object1
6 дек 16, 16:52    [19973438]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
o-o,
почему не просто

Изначально он выглядел так:
SELECT MCCO, IBITM, IBLITM, IBMCU,IBTAX1
FROM JDE_PRODUCTION.PRODDTA.F4102 WITH (NOLOCK)
INNER JOIN JDE_PRODUCTION.PRODDTA.F0006
	ON MCMCU=IBMCU
INNER JOIN (
	SELECT MCCO CO,IBITM ITM
	FROM JDE_PRODUCTION.PRODDTA.F4102 WITH (NOLOCK)
	INNER JOIN JDE_PRODUCTION.PRODDTA.F0006
	ON MCMCU=IBMCU
	GROUP BY MCCO,IBITM
	HAVING COUNT(DISTINCT IBTAX1)!=1
	) DATA
ON MCCO=DATA.CO
AND IBITM=DATA.ITM
6 дек 16, 17:09    [19973525]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
o-o,
но слив во временную таблицу оставьте.

Это очень долго ~ 96сек. А исходный запрос 26-40 сек.
6 дек 16, 17:18    [19973570]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
invm
Member

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

Прикажете догадаться какой столбец к какой таблице относится?
6 дек 16, 17:20    [19973577]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

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

Прикажете догадаться какой столбец к какой таблице относится?


Те что с IB - это F4102
6 дек 16, 17:25    [19973597]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
o-o
Guest
Homasters
o-o,
но слив во временную таблицу оставьте.

Это очень долго ~ 96сек. А исходный запрос 26-40 сек.

говорю, хинт убирайте, невыгодно оказалось inner hash join.
оставьте как было inner join, но сложите во временную таблицу
6 дек 16, 17:29    [19973613]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
o-o
Homasters
пропущено...

Это очень долго ~ 96сек. А исходный запрос 26-40 сек.

говорю, хинт убирайте, невыгодно оказалось inner hash join.
оставьте как было inner join, но сложите во временную таблицу


Заделал как вы сказали, все равно долго(больше минуты
6 дек 16, 17:40    [19973641]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
aleks2
Guest
o-o
Homasters
пропущено...

Это очень долго ~ 96сек. А исходный запрос 26-40 сек.

говорю, хинт убирайте, невыгодно оказалось inner hash join.
оставьте как было inner join, но сложите во временную таблицу


Бессмысленное метание бисера.
У тредстартера туго с индексами => сканирование таблицы дает наилучший результат.

Если запариваться с "быстрее", то индексированное представление решает.
7 дек 16, 07:23    [19974730]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

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

К сожалению индексы трогать нельзя
7 дек 16, 07:33    [19974742]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
Индексы такие:
PRIMARY KEY CLUSTERED
[F0006]
[MCMCU] ASC
[F4102]
[IBMCU] ASC,
[IBITM] ASC
7 дек 16, 07:43    [19974753]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

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

Переписать через аналитический count.

Если я правильно понял вас, этот запрос тоже медленно выполняется
	select distinct * from 
	(
	SELECT f06.MCCO,f02.IBITM,
	COUNT(f02.IBTAX1) OVER(PARTITION BY f02.IBITM,f06.MCCO) as co
	FROM JDE_PRODUCTION.PRODDTA.F4102 as f02 WITH (NOLOCK)
	INNER JOIN JDE_PRODUCTION.PRODDTA.F0006 as f06
	ON f06.MCMCU=f02.IBMCU
	GROUP BY f06.MCCO,f02.IBITM,f02.IBTAX1
	) as t where co > 1


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

Откуда:
Сообщений: 5211
Homasters
Если я правильно понял вас, этот запрос тоже медленно выполняется
	select distinct * from 
	(
	SELECT f06.MCCO,f02.IBITM,
	COUNT(f02.IBTAX1) OVER(PARTITION BY f02.IBITM,f06.MCCO) as co
	FROM JDE_PRODUCTION.PRODDTA.F4102 as f02 WITH (NOLOCK)
	INNER JOIN JDE_PRODUCTION.PRODDTA.F0006 as f06
	ON f06.MCMCU=f02.IBMCU
	GROUP BY f06.MCCO,f02.IBITM,f02.IBTAX1
	) as t where co > 1
Без тестовых данных и примера ожидаемого результата не хочу гадать. Тема и так уже разрослась на две страницы в попытке подобрать решение брутфорсом.
7 дек 16, 11:34    [19975380]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
invm
Member

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

Вы уж как-нибудь определитесь - вам нужен count() или count(distinct).
И хватит уже партизанить. Выкладывайте планы в формате sqlplan, а не картинками.
7 дек 16, 12:05    [19975529]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Homasters,
Trace Flag 4199 включён? какая вообще версия скл
7 дек 16, 12:10    [19975558]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

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

Microsoft SQL Server 2005 - 9.00.5292.00 (Intel X86)
Apr 13 2011 15:56:31
Copyright (c) 1988-2005 Microsoft Corporation
Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
TaPaK,
Trace Flag 4199 включён?

Он доступен только с Service Pack 3;
7 дек 16, 12:52    [19975752]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
TaPaK
Member

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

ну да... второй раз за день: сервиспаки выпускают, но мы их конечно же ставить не будем
7 дек 16, 12:58    [19975787]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
AmKad,
Без тестовых данных и примера ожидаемого результата не хочу гадать.


Тестовые данные
+

DECLARE @F0006  TABLE (
					[MCCO] [char](5) NULL,			--регион
					[MCMCU] [char](12) NOT NULL		--склад
					)
DECLARE @F4102  TABLE ([IBITM] [float] NOT NULL,	--код товара
						[IBMCU] [char](12) NOT NULL,--склад
						[IBTAX1] [char](1) NULL		--ставка
						)

Declare @Counter Int;
set @Counter = 1;

	WHILE @Counter <= 5
	BEGIN
		INSERT INTO @F4102
		SELECT * FROM (
					 SELECT @Counter AS IBITM,'      СКЛАД1' AS IBMCU,'3' AS IBTAX1 UNION ALL
					 SELECT @Counter AS IBITM,'      СКЛАД2' AS IBMCU,'3' AS IBTAX1 UNION ALL
					 SELECT @Counter AS IBITM,'      СКЛАД3' AS IBMCU,'3' AS IBTAX1 UNION ALL
					 SELECT @Counter AS IBITM,'      СКЛАД4' AS IBMCU,'3' AS IBTAX1
					 ) AS TMP
		Set @Counter = @Counter + 1;
	END

INSERT INTO @F4102 
SELECT * FROM	( 	
					SELECT 1 AS IBITM,'      СКЛАД1' AS IBMCU,'2' AS IBTAX1	UNION ALL
					SELECT 2 AS IBITM,'      СКЛАД2' AS IBMCU,'2' AS IBTAX1 UNION ALL
					SELECT 3 AS IBITM,'      СКЛАД3' AS IBMCU,'2' AS IBTAX1
				) AS TMP


INSERT INTO @F0006  
SELECT * FROM (									   
					SELECT '00001' AS MCCO,'      СКЛАД1' AS MCMCU UNION ALL
					SELECT '00001' AS MCCO,'      СКЛАД2' AS MCMCU UNION ALL
					SELECT '00001' AS MCCO,'      СКЛАД3' AS MCMCU UNION ALL 
					SELECT '00001' AS MCCO,'      СКЛАД4' AS MCMCU
				) AS T


SELECT f06.MCCO, f02.IBITM, f02.IBMCU, f02.IBTAX1
FROM @F4102 as f02 
INNER JOIN @F0006 as f06
	ON f06.MCMCU=f02.IBMCU
INNER JOIN (
	SELECT MCCO,IBITM
	FROM @F4102
	INNER JOIN @F0006
	ON MCMCU=IBMCU
	GROUP BY MCCO,IBITM
	HAVING COUNT(DISTINCT IBTAX1)>1
	) DATA
ON f06.MCCO=DATA.MCCO
AND f02.IBITM=DATA.IBITM

7 дек 16, 14:40    [19976447]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
AmKad
Member

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

Задача заключается в том, чтобы вывести товары, которые в рамках региона имеют больше одной ставки?
7 дек 16, 15:20    [19976734]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
AmKad
Member

Откуда:
Сообщений: 5211
Аналитический count() не подходит, так как он не поддерживает distinct, по крайней мере в 2014-ой версии. Поэтому воспользуемся двумя другими аналитическими функциями.
select mcco, ibitm, mcmcu,  ibtax1
from
   (select  mcco, mcmcu, ibitm, ibtax1, max(dr) over (partition by mcco, ibitm) mx
    from
       (select t1.mcco, t1.mcmcu, t2.ibitm, t2.ibtax1,
        dense_rank() over (partition by mcco, ibitm order by ibtax1) dr
        from       @f0006 t1  -- склад
        inner join @f4102 t2 on t1.mcmcu = t2.ibmcu
        ) t
   )t
where mx > 1;
--order by mcco, ibitm, mcmcu, ibtax1;
7 дек 16, 15:40    [19976851]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

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

Задача заключается в том, чтобы вывести товары, которые в рамках региона имеют больше одной ставки?


да
7 дек 16, 16:02    [19976948]     Ответить | Цитировать Сообщить модератору
 Re: Having count, оптимизация  [new]
Homasters
Member

Откуда: Москва
Сообщений: 50
AmKad
Аналитический count() не подходит, так как он не поддерживает distinct, по крайней мере в 2014-ой версии. Поэтому воспользуемся двумя другими аналитическими функциями.
+

select mcco, ibitm, mcmcu,  ibtax1
from
   (select  mcco, mcmcu, ibitm, ibtax1, max(dr) over (partition by mcco, ibitm) mx
    from
       (select t1.mcco, t1.mcmcu, t2.ibitm, t2.ibtax1,
        dense_rank() over (partition by mcco, ibitm order by ibtax1) dr
        from       @f0006 t1  -- склад
        inner join @f4102 t2 on t1.mcmcu = t2.ibmcu
        ) t
   )t
where mx > 1;
--order by mcco, ibitm, mcmcu, ibtax1;


SQL Server Execution Times:
CPU time = 102796 ms, elapsed time = 72567 ms.
+ПЛАН

К сообщению приложен файл (V6.sqlplan - 83Kb) cкачать
7 дек 16, 16:06    [19976972]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить