Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите оптимизировать запрос!  [new]
kika
Member

Откуда:
Сообщений: 585
Всем привет!
У меня есть запрос:
SELECT
	1 tag,
	NULL parent,
	NULL 'Main!1!hide',
	NULL 'Item!2!Name',
	NULL 'Item!2!Quantity',
	NULL 'Item!2!Rate'
UNION ALL
SELECT 
	2,
	1,
	NULL,
	a.Words,
	Sum(a.Count_),
	convert(varchar(255),convert(money, ROUND(((Sum(a.Count_)*100.0)/        (select Sum(Count_) from _SearchWords WHERE
											IDStat in (	select ID 
											from 
												_Statistic 
											where 	
												dateadd(hh, -datepart(hh,LDate),LDate) >= @DateFrom
												and dateadd(hh, -datepart(hh,LDate),LDate) <= @DateTo
												and IDSite = @SiteID
												))      ),2),0),0)
FROM 
	SearchWords a
	
WHERE
	a.IDStat in (	select ID 
			from 
				_Statistic 
			where 	
				dateadd(hh, -datepart(hh,LDate),LDate) >= @DateFrom
				and dateadd(hh, -datepart(hh,LDate),LDate) <= @DateTo
				and IDSite = @SiteID
			) 
	and @ID=5
Group by 
		a.Words
Order by 
		tag,
		'Item!3!Quantity' desc




Помогите избавиться от двойного одинакового подзапроса!

select ID 
			from 
				_Statistic 
			where 	
				dateadd(hh, -datepart(hh,LDate),LDate) >= @DateFrom
				and dateadd(hh, -datepart(hh,LDate),LDate) <= @DateTo
				and IDSite = @SiteID

Какие могут быть варианты решения?
1 июл 05, 16:13    [1668136]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
А _SearchWords и SearchWords это одна таблица или разные?
1 июл 05, 16:16    [1668165]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
kika
Member

Откуда:
Сообщений: 585
Да, одна!
1 июл 05, 16:19    [1668181]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
Самое простое - это так:

declare @t table (id int)
insert into @t
select ID 
			from 
				_Statistic 
			where 	
				dateadd(hh, -datepart(hh,LDate),LDate) >= @DateFrom
				and dateadd(hh, -datepart(hh,LDate),LDate) <= @DateTo
				and IDSite = @SiteID

и дальше в фильтрах использовать выборку из табличной переменной. Можно еще и общую сумму в переменную вытащить.
1 июл 05, 16:26    [1668226]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
kika
Member

Откуда:
Сообщений: 585
А как будет выглядеть выборка из табличной переменной?
1 июл 05, 16:41    [1668346]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
WHERE IDStat in (select ID from @t)
1 июл 05, 16:49    [1668390]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
kika
Member

Откуда:
Сообщений: 585
Оооооо!!!! Спасибо!!! Раньше не приходилось использовать табличную переменную!!! Теперь буду!
1 июл 05, 16:53    [1668414]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
kika
Member

Откуда:
Сообщений: 585
А вот скажите, временная таблица и табличная переменная - это одно и тоже?
1 июл 05, 16:57    [1668446]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
kika
А вот скажите, временная таблица и табличная переменная - это одно и тоже?


Это очень похожие похожие, но все же разные вещи.
1 июл 05, 17:01    [1668485]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
kika
Member

Откуда:
Сообщений: 585
А в чем разница? Кроме как в обозначении @name b #name..... ????
1 июл 05, 17:03    [1668494]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
злой шаман
Member

Откуда: Питер
Сообщений: 1253
Разница есть. Перечислю основное.

1. Временные таблицы нельзя использовать в функциях. Табличные переменные нельзя использовать в конструкциях INSERT EXEC и SELECT INTO.
2. Табличные переменные существуют только в пределах батча, после окончания которого автоматически удаляются. Временные таблицы существуют минимум в пределах сессии.
3. Табличные переменные существуют "вне" транзакций, то есть при откате транзакции информация в табличных переменных не меняется.
4. На табличные переменные нельзя повесить индексы (можно только неявно создать PK).

P.S. За подробностями отправил бы в BOL, но не нашел нужную страничку. =)
1 июл 05, 17:15    [1668559]     Ответить | Цитировать Сообщить модератору
 Re: Помогите оптимизировать запрос!  [new]
kika
Member

Откуда:
Сообщений: 585
Ага....
А вот что в инете пишут:
Use table variables instead of temporary tables, whenever possible. table variables provide the following benefits: 

A table variable behaves like a local variable. It has a well-defined scope, which is the function, stored procedure, or batch in which it is declared. 
Within its scope, a table variable may be used like a regular table. It may be applied anywhere a table or table expression is used in SELECT, INSERT, UPDATE, and DELETE statements. However, table may not be used in the following statements:

INSERT INTO table_variable EXEC stored_procedure 

SELECT select_list INTO table_variable statements.

table variables are cleaned up automatically at the end of the function, stored procedure, or batch in which they are defined.

table variables used in stored procedures result in fewer recompilations of the stored procedures than when temporary tables are used.


Transactions involving table variables last only for the duration of an update on the table variable. Thus, table variables require less locking and logging resources. 
Assignment operation between table variables is not supported. In addition, because table variables have limited scope and are not part of the persistent database, they are not impacted by transaction rollbacks.
1 июл 05, 17:18    [1668572]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить