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

Откуда:
Сообщений: 10
Есть табличка в которой порядка 3 миллионов записей, ну и каждую неделю еще добавляется по миллионы...
ее упрощенный вид
table balance
{
[Id] int IDENTITY (1, 1) NOT NULL,,
[Balance] float NOT NULL ,
[ChangeTime] datetime NOT NULL ,
[Group] int NOT NULL ,
}

запрос вида:
select sum(balance) where ChangeTime >= '2009-11-11' and ChangeTime < '2009-11-11' and group = 1

Запрос выполняется минуту, а что будет если данных станет больше?

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


Установлен MS SQL 2005, если надо так можно переставить БД.

P. S. Запрос очень упрощен, но думаю что он выражает суть проблемы.
30 ноя 09, 14:45    [7997059]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
Влом регистрироваться
Guest
Mig2009,


Improving Performance with SQL Server 2005 Indexed Views
30 ноя 09, 15:03    [7997233]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
Mig2009
Member

Откуда:
Сообщений: 10
Обратите внимание на запрос: sum(balance)

Индексы все созданы, это только упрощенная версия базы без указания параметров.

Я думаю что тут проблема с алгоритмом, а не оптимизацией...
30 ноя 09, 15:11    [7997322]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
aleks2
Guest
Влом регистрироваться
Mig2009,


Improving Performance with SQL Server 2005 Indexed Views


Интересна: а нафига тут Indexed View?

Тредстартеру: почтай лучше про кластерный индекс (CLUSTERED).

И никогда не пиши
ChangeTime >= '2009-11-11' 
а только
ChangeTime >= cast('20091111' as datetime) 
.
30 ноя 09, 15:12    [7997336]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
Mig2009
Member

Откуда:
Сообщений: 10
Хотя может Вы и правы, проверю, скажу результат...
30 ноя 09, 15:14    [7997359]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
iljy
Member

Откуда:
Сообщений: 8711
Mig2009
Есть табличка в которой порядка 3 миллионов записей, ну и каждую неделю еще добавляется по миллионы...
ее упрощенный вид
table balance
{
[Id] int IDENTITY (1, 1) NOT NULL,,
[Balance] float NOT NULL ,
[ChangeTime] datetime NOT NULL ,
[Group] int NOT NULL ,
}

запрос вида:
select sum(balance) where ChangeTime >= '2009-11-11' and ChangeTime < '2009-11-11' and group = 1

Запрос выполняется минуту, а что будет если данных станет больше?

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


Установлен MS SQL 2005, если надо так можно переставить БД.

P. S. Запрос очень упрощен, но думаю что он выражает суть проблемы.


Такая проблема решается созданием индекса (group, ChangeTime) include(balance). Если избирательность по group очень низкая - можно так: (ChangeTime) include(balance, group).
30 ноя 09, 15:19    [7997395]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31204
aleks2
Интересна: а нафига тут Indexed View?
Создать индексированную вьюху (ChangeDate - это из ChangeTimeвыделяем день):
select group, ChangeDate, sum(balance) from ... group by group, ChangeDate
разве не поможет?
30 ноя 09, 17:28    [7998260]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
Mig2009
Member

Откуда:
Сообщений: 10
А как можно группировать view по дням?
То есть ChangeTime записанно время, а мне надо грпировать по суткам.
30 ноя 09, 18:47    [7998644]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31204
Mig2009
А как можно группировать view по дням?
То есть ChangeTime записанно время, а мне надо грпировать по суткам.
ну это можно было и самому :-)

select group, convert(datetime, convert(varchar, ChangeTime, 112), 112), sum(balance) 
from ... 
group by group, convert(datetime, convert(varchar, ChangeTime, 112), 112)
1 дек 09, 08:42    [7999989]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Mig2009
запрос вида:
select sum(balance) where ChangeTime >= '2009-11-11' and ChangeTime < '2009-11-11' and group = 1

Запрос выполняется минуту, а что будет если данных станет больше?
Какая разница? Разве этот запрос что-нибудь возвращает?
Его можно оптимизировать радикально:
SELECT balance FROM ... /*Кстати, а где FROM??*/ WHERE 2*2=5;
1 дек 09, 09:11    [8000077]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
Mig2009
Member

Откуда:
Сообщений: 10
iap

Какая разница? Разве этот запрос что-нибудь возвращает?
Его можно оптимизировать радикально:
SELECT balance FROM ... /*Кстати, а где FROM??*/ WHERE 2*2=5;


То есть лучше было бы показать полный запрос?

SELECT RoomInfo.Id, RoomInfo.Name, sum(BalanceInfo.bet) as bet,
sum(case when BalanceInfo.bet > 0 then 1 else 0 end) as betcount,
sum(case when BalanceInfo.ChangeType = 1 then BalanceInfo.bet + BalanceInfo.Profit else 0 end) as Win,
sum(case when BalanceInfo.ChangeType = 1 then 1 else 0 end) as wincount,
sum(case when BalanceInfo.ChangeType = 2 then BalanceInfo.Profit else 0 end) as WinBonus,
sum(case when BalanceInfo.ChangeType = 2 then 1 else 0 end) as wincountBonus,
1 FROM BalanceInfo left join UserInfo on UserInfo.id = BalanceInfo.UserId left join RoomInfo on
UserInfo.RoomId = RoomInfo.Id
where (BalanceInfo.ChangeType = 1 or BalanceInfo.ChangeType = 2) and
BalanceInfo.ChangeTime >= '2009-11-22' and BalanceInfo.ChangeTime < '2009-11-29' and
UserInfo.Role = 0 and UserInfo.OfficeId = 39 GROUP BY RoomInfo.Id, RoomInfo.Name
2 дек 09, 01:10    [8005634]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
Mig2009
Member

Откуда:
Сообщений: 10
Вдогонку:
Данные запроса передаются не как строки, а как подготовленные параметры.
2 дек 09, 01:13    [8005635]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Mig2009
То есть лучше было бы показать полный запрос?
Нет. Я пытался обратить Ваше внимание на то,
что дата не может быть одновременно и меньше и не меньше '20091111'.
А по поводу индексов и так уже говорили.

Выложили запрос - это хорошо. Оказывается, там 3 таблицы.

Но про индексы опять ничего не говорите.
План запроса в текстовом виде никто не видел.
Версия сервера по-прежнему неизвестна.

И пользуйтесь тегом [SRС], пожалуйста.
2 дек 09, 08:55    [8005891]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
aleks2
Guest
Mig2009

SELECT RoomInfo.Id, RoomInfo.Name, sum(BalanceInfo.bet) as bet,
sum(case when BalanceInfo.bet > 0 then 1 else 0 end) as betcount,
sum(case when BalanceInfo.ChangeType = 1 then BalanceInfo.bet + BalanceInfo.Profit else 0 end) as Win,
sum(case when BalanceInfo.ChangeType = 1 then 1 else 0 end) as wincount,
sum(case when BalanceInfo.ChangeType = 2 then BalanceInfo.Profit else 0 end) as WinBonus,
sum(case when BalanceInfo.ChangeType = 2 then 1 else 0 end) as wincountBonus,
1 FROM BalanceInfo left join UserInfo on UserInfo.id = BalanceInfo.UserId left join RoomInfo on
UserInfo.RoomId = RoomInfo.Id
where (BalanceInfo.ChangeType = 1 or BalanceInfo.ChangeType = 2) and
BalanceInfo.ChangeTime >= '2009-11-22' and BalanceInfo.ChangeTime < '2009-11-29' and
UserInfo.Role = 0 and UserInfo.OfficeId = 39 GROUP BY RoomInfo.Id, RoomInfo.Name


Ну..., для начала, осознайте: группировка - и так грузит сервер, дык НЕ надо грузить его еще и лишними соединениями
SELECT UserInfo.RoomId as [RoomInfo.Id]
--, RoomInfo.Name
, sum(BalanceInfo.bet) as bet, 
sum(case when BalanceInfo.bet > 0 then 1 else 0 end) as betcount, 
sum(case when BalanceInfo.ChangeType = 1 then BalanceInfo.bet + BalanceInfo.Profit else 0 end) as Win, 
sum(case when BalanceInfo.ChangeType = 1 then 1 else 0 end) as wincount, 
sum(case when BalanceInfo.ChangeType = 2 then BalanceInfo.Profit else 0 end) as WinBonus, 
sum(case when BalanceInfo.ChangeType = 2 then 1 else 0 end) as wincountBonus, 
1 FROM BalanceInfo left join UserInfo on UserInfo.id = BalanceInfo.UserId  
--left join RoomInfo on 
--UserInfo.RoomId = RoomInfo.Id 
where  (BalanceInfo.ChangeType = 1 or  BalanceInfo.ChangeType = 2) and 
BalanceInfo.ChangeTime >= '2009-11-22' and BalanceInfo.ChangeTime < '2009-11-29' and 
UserInfo.Role = 0 and UserInfo.OfficeId = 39 
--GROUP BY RoomInfo.Id, RoomInfo.Name
GROUP BY UserInfo.RoomId

Ну а RoomInfo.Name присобачьте ПОСЛЕ группировки. Уже будет на треть быстрее.
2 дек 09, 09:19    [8005982]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
Mig2009
Member

Откуда:
Сообщений: 10
Сделал следующее
CREATE VIEW PROFITREPORT WITH SCHEMABINDING AS 
SELECT UserInfo.RoomId as roomid, sum(BalanceInfo.bet) as bet, 
sum(case when BalanceInfo.bet > 0 then 1 else 0 end) as betcount, 
sum(case when BalanceInfo.ChangeType = 1 then BalanceInfo.bet + BalanceInfo.Profit else 0 end) as Win, 
sum(case when BalanceInfo.ChangeType = 1 then 1 else 0 end) as wincount, 
sum(case when BalanceInfo.ChangeType = 2 then BalanceInfo.Profit else 0 end) as WinBonus, 
sum(case when BalanceInfo.ChangeType = 2 then 1 else 0 end) as wincountBonus, 
convert(datetime, convert(varchar, ChangeTime, 112), 112) as ChangeTime,
COUNT_BIG(*) AS Count
FROM dbo.BalanceInfo inner join dbo.UserInfo on UserInfo.id = BalanceInfo.UserId
where  (BalanceInfo.ChangeType = 1 or  BalanceInfo.ChangeType = 2) and 
UserInfo.Role = 0
GROUP BY UserInfo.RoomId, convert(datetime, convert(varchar, ChangeTime, 112), 112)
go
CREATE UNIQUE CLUSTERED INDEX IndexViewRoomId ON PROFITREPORT (roomid, ChangeTime)

СУБД: Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Express Edition with Advanced Services on Windows NT 5.1 (Build 2600: Service Pack 2)

Выполняю запрос:
  
select * from PROFITREPORT where roomid = 39 
and ChangeTime >= '2009-11-22' and ChangeTime < '2009-11-29'


Те же тормаза. Вот план запроса.
  
|--Stream Aggregate(GROUP BY:([Expr1006]) DEFINE:([Expr1013]=Count(*), [Expr1007]=SUM([casinowork].[dbo].[BALANCEINFO].[Bet]), [Expr1008]=SUM([Expr1017]), [Expr1009]=SUM([Expr1018]), [Expr1010]=SUM([Expr1019]), [Expr1011]=SUM([Expr1020]), [Expr1012]=SUM([Expr1021]), [casinowork].[dbo].[USERINFO].[RoomId]=ANY([casinowork].[dbo].[USERINFO].[RoomId])))
       |--Sort(ORDER BY:([Expr1006] ASC))
            |--Compute Scalar(DEFINE:([Expr1006]=CONVERT(datetime,CONVERT(varchar(30),[casinowork].[dbo].[BALANCEINFO].[ChangeTime],112),112), [Expr1017]=CASE WHEN [casinowork].[dbo].[BALANCEINFO].[Bet]>(0.000000000000000e+000) THEN (1) ELSE (0) END, [Expr1018]=CASE WHEN [casinowork].[dbo].[BALANCEINFO].[ChangeType]=(1) THEN [casinowork].[dbo].[BALANCEINFO].[Bet]+[casinowork].[dbo].[BALANCEINFO].[Profit] ELSE (0.000000000000000e+000) END, [Expr1019]=CASE WHEN [casinowork].[dbo].[BALANCEINFO].[ChangeType]=(1) THEN (1) ELSE (0) END, [Expr1020]=CASE WHEN [casinowork].[dbo].[BALANCEINFO].[ChangeType]=(2) THEN [casinowork].[dbo].[BALANCEINFO].[Profit] ELSE (0.000000000000000e+000) END, [Expr1021]=CASE WHEN [casinowork].[dbo].[BALANCEINFO].[ChangeType]=(2) THEN (1) ELSE (0) END))
                 |--Filter(WHERE:(CONVERT(datetime,CONVERT(varchar(30),[casinowork].[dbo].[BALANCEINFO].[ChangeTime],112),112)>='2009-11-22 00:00:00.000' AND CONVERT(datetime,CONVERT(varchar(30),[casinowork].[dbo].[BALANCEINFO].[ChangeTime],112),112)<'2009-11-29 00:00:00.000' AND ([casinowork].[dbo].[BALANCEINFO].[ChangeType]=(1) OR [casinowork].[dbo].[BALANCEINFO].[ChangeType]=(2))))
                      |--Nested Loops(Inner Join, OUTER REFERENCES:([casinowork].[dbo].[BALANCEINFO].[Id], [Expr1034]) OPTIMIZED WITH UNORDERED PREFETCH)
                           |--Nested Loops(Inner Join, OUTER REFERENCES:([casinowork].[dbo].[USERINFO].[Id]) OPTIMIZED)
                           |    |--Clustered Index Scan(OBJECT:([casinowork].[dbo].[USERINFO].[PK__USERINFO]), WHERE:([casinowork].[dbo].[USERINFO].[RoomId]=(39) AND [casinowork].[dbo].[USERINFO].[Role]=(0)))
                           |    |--Index Seek(OBJECT:([casinowork].[dbo].[BALANCEINFO].[IX__BALANCEINFO_USERID]), SEEK:([casinowork].[dbo].[BALANCEINFO].[UserId]=[casinowork].[dbo].[USERINFO].[Id]) ORDERED FORWARD)
                           |--Clustered Index Seek(OBJECT:([casinowork].[dbo].[BALANCEINFO].[PK__BALANCEINFO]), SEEK:([casinowork].[dbo].[BALANCEINFO].[Id]=[casinowork].[dbo].[BALANCEINFO].[Id]) LOOKUP ORDERED FORWARD)

Хочу еще раз уточнить задачу:
Необходимо выводить посуточную статистику.

Уверен что что-то должно быть, не создавать ведь дополнительную таблицу, в которой еще дополнительно обновлять агрегированные данные.
3 дек 09, 00:35    [8011425]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
Mig2009
Member

Откуда:
Сообщений: 10
iap
[quot Mig2009]
не может быть одновременно и меньше и не меньше '20091111'.


На счёт времени сразу и не понял, так как время вставлял только для общего понимания проблемы... :)
3 дек 09, 00:38    [8011428]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
Mig2009
Member

Откуда:
Сообщений: 10
В запросе без VIEW такой план:

  |--Compute Scalar(DEFINE:([Expr1012]=(1)))
       |--Stream Aggregate(GROUP BY:([casinowork].[dbo].[USERINFO].[RoomId]) DEFINE:([Expr1006]=SUM([partialagg1023]), [Expr1007]=SUM([partialagg1024]), [Expr1008]=SUM([partialagg1025]), [Expr1009]=SUM([partialagg1026]), [Expr1010]=SUM([partialagg1027]), [Expr1011]=SUM([partialagg1028])))
            |--Sort(ORDER BY:([casinowork].[dbo].[USERINFO].[RoomId] ASC))
                 |--Hash Match(Inner Join, HASH:([casinowork].[dbo].[USERINFO].[Id])=([casinowork].[dbo].[BALANCEINFO].[UserId]))
                      |--Clustered Index Scan(OBJECT:([casinowork].[dbo].[USERINFO].[PK__USERINFO]), WHERE:([casinowork].[dbo].[USERINFO].[Role]=(0) AND [casinowork].[dbo].[USERINFO].[OfficeId]=(39)))
                      |--Hash Match(Aggregate, HASH:([casinowork].[dbo].[BALANCEINFO].[UserId]) DEFINE:([partialagg1023]=SUM([casinowork].[dbo].[BALANCEINFO].[Bet]), [partialagg1024]=SUM([Expr1013]), [partialagg1025]=SUM([Expr1014]), [partialagg1026]=SUM([Expr1015]), [partialagg1027]=SUM([Expr1016]), [partialagg1028]=SUM([Expr1017])))
                           |--Compute Scalar(DEFINE:([Expr1013]=CASE WHEN [casinowork].[dbo].[BALANCEINFO].[Bet]>(0.000000000000000e+000) THEN (1) ELSE (0) END, [Expr1014]=CASE WHEN [casinowork].[dbo].[BALANCEINFO].[ChangeType]=(1) THEN [casinowork].[dbo].[BALANCEINFO].[Bet]+[casinowork].[dbo].[BALANCEINFO].[Profit] ELSE (0.000000000000000e+000) END, [Expr1015]=CASE WHEN [casinowork].[dbo].[BALANCEINFO].[ChangeType]=(1) THEN (1) ELSE (0) END, [Expr1016]=CASE WHEN [casinowork].[dbo].[BALANCEINFO].[ChangeType]=(2) THEN [casinowork].[dbo].[BALANCEINFO].[Profit] ELSE (0.000000000000000e+000) END, [Expr1017]=CASE WHEN [casinowork].[dbo].[BALANCEINFO].[ChangeType]=(2) THEN (1) ELSE (0) END))
                                |--Clustered Index Scan(OBJECT:([casinowork].[dbo].[BALANCEINFO].[PK__BALANCEINFO]), WHERE:([casinowork].[dbo].[BALANCEINFO].[ChangeTime]>='2009-11-22 00:00:00.000' AND [casinowork].[dbo].[BALANCEINFO].[ChangeTime]<'2009-11-29 00:00:00.000' AND ([casinowork].[dbo].[BALANCEINFO].[ChangeType]=(1) OR [casinowork].[dbo].[BALANCEINFO].[ChangeType]=(2))))
3 дек 09, 00:52    [8011447]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
iljy
Member

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

сделайет не view, а табличную inline-функцию
CREATE FUNCTION GetProfit(@RoomId int, @BeginDate datetime, @EndDate datetime)
as return(
	SELECT @RoomId roomid, sum(bi.bet) as bet, 
	sum(case when bi.bet > 0 then 1 else 0 end) as betcount, 
	sum(case when bi.ChangeType = 1 then bi.bet + bi.Profit else 0 end) as Win, 
	sum(case when bi.ChangeType = 1 then 1 else 0 end) as wincount, 
	sum(case when bi.ChangeType = 2 then bi.Profit else 0 end) as WinBonus, 
	sum(case when bi.ChangeType = 2 then 1 else 0 end) as wincountBonus, 
	dateadd(d, datediff(d, 0, bi.ChangeTime),0) as ChangeTime,
	COUNT_BIG(*) AS Count
	FROM dbo.BalanceInfo bi inner join dbo.UserInfo ui on ui.id = bi.UserId
	where  (bi.ChangeType = 1 or  bi.ChangeType = 2) and 
			ui.Role = 0 and ui.RoomId = @RoomId and
			bi.ChangeTime >= @BeginDate and bi.ChangeTime < @EndDate
	GROUP BY dateadd(d, datediff(d, 0, bi.ChangeTime),0)
)
На BalanceInfo создайте индекс
CREATE INDEX IX_BalanceInfo_ChangeTime ON BalanceInfo
(ChangeTime)
include
(ChangeType, bet,profit,UserId)
либо просто кластерный по ChangeTime. Если не сработает - выкладывайте реальный полный план.
3 дек 09, 01:06    [8011458]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
Mig2009
Member

Откуда:
Сообщений: 10
iljy
Mig2009,
На BalanceInfo создайте индекс
CREATE INDEX IX_BalanceInfo_ChangeTime ON BalanceInfo
(ChangeTime)
include
(ChangeType, bet,profit,UserId)
либо просто кластерный по ChangeTime. Если не сработает - выкладывайте реальный полный план.


Большой спасибо!
CREATE INDEX IX_BalanceInfo_ChangeTime ON BalanceInfo (ChangeTime) include (ChangeType, bet,profit,UserId) - это помогло.

Вы думаете что это увеличит производительность, я имею в виду табличную inline-функцию?
iljy

сделайет не view, а табличную inline-функцию
3 дек 09, 01:24    [8011474]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
aleks2
Guest
Mig2009
Сделал следующее
CREATE VIEW PROFITREPORT WITH SCHEMABINDING AS 
SELECT UserInfo.RoomId as roomid, sum(BalanceInfo.bet) as bet, 
sum(case when BalanceInfo.bet > 0 then 1 else 0 end) as betcount, 
sum(case when BalanceInfo.ChangeType = 1 then BalanceInfo.bet + BalanceInfo.Profit else 0 end) as Win, 
sum(case when BalanceInfo.ChangeType = 1 then 1 else 0 end) as wincount, 
sum(case when BalanceInfo.ChangeType = 2 then BalanceInfo.Profit else 0 end) as WinBonus, 
sum(case when BalanceInfo.ChangeType = 2 then 1 else 0 end) as wincountBonus, 
convert(datetime, convert(varchar, ChangeTime, 112), 112) as ChangeTime,
COUNT_BIG(*) AS Count
FROM dbo.BalanceInfo inner join dbo.UserInfo on UserInfo.id = BalanceInfo.UserId
where  (BalanceInfo.ChangeType = 1 or  BalanceInfo.ChangeType = 2) and 
UserInfo.Role = 0
GROUP BY UserInfo.RoomId, convert(datetime, convert(varchar, ChangeTime, 112), 112)
go
CREATE UNIQUE CLUSTERED INDEX IndexViewRoomId ON PROFITREPORT (roomid, ChangeTime)

СУБД: Microsoft SQL Server 2005 - 9.00.3042.00 (Intel X86) Feb 9 2007 22:47:07 Copyright (c) 1988-2005 Microsoft Corporation Express Edition with Advanced Services on Windows NT 5.1 (Build 2600: Service Pack 2)

Выполняю запрос:
  
select * from PROFITREPORT where roomid = 39 
and ChangeTime >= '2009-11-22' and ChangeTime < '2009-11-29'


Те же тормаза. Вот план запроса.

Уверен что что-то должно быть, не создавать ведь дополнительную таблицу, в которой еще дополнительно обновлять агрегированные данные.


1. Все редакции MS SQL ниже Enterprise Edition не используют Indexed View без явного хинта NOEXPAND.

2.
select * from PROFITREPORT WITH (NOEXPAND)  where roomid = 39 
and ChangeTime >= '2009-11-22' and ChangeTime < '2009-11-29'
3 дек 09, 06:38    [8011662]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
aleks2
Guest
ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.en/udb9/html/430593ce-5dec-48d5-86ed-78388091880a.htm
3 дек 09, 06:47    [8011669]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, теоретический вопрос.  [new]
iljy
Member

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

Вы думаете что это увеличит производительность, я имею в виду табличную inline-функцию?
iljy

сделайет не view, а табличную inline-функцию

Филосовский вопрос, но если вы собираетесь использовать в основном как написали - по диапазону дат - это облегчит работу оптимизатору. Номер комнаты из параметров можно убрать в принципе и делать по нему группировку.
3 дек 09, 10:08    [8012058]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить