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

Откуда:
Сообщений: 10
Приветствую всех!
У меня есть таблица [Operations]. БД - MS SQL 2014
В таблице очень много записей (порядка 15 млн.)
  
CREATE TABLE [Operations]
  (
    [Id]               Int          NOT NULL IDENTITY(1,1),
    [Date]             Date         NOT NULL,
    [User_Id]          Int          NOT NULL, 
    [Value]            Int          NOT NULL,            
    [Type]             Int          NOT NULL,
    PRIMARY KEY CLUSTERED([Id]),
    FOREIGN KEY ([Type])    REFERENCES [Types] ([Id]),
    FOREIGN KEY ([User_Id]) REFERENCES [Users] ([Id])

у таблицы 3 индекса - по [Date], [Types] и [Users]

Запрос из этой таблицы такой:

DECLARE @dBeg Date
DECLARE @dEnd Date
SELECT 
   O.[Date],
   O.[Types],
   O.[User_Id],
   SUM([O.[Value])
FROM [Operations] O
WHERE O.[Date] BETWEEN @dBeg AND @dEnd


Вопрос - как можно сделать этот запрос более быстродейственным?
P.S. можно модифицировать и таблицу, и запрос
27 апр 16, 20:17    [19114572]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
Crimean
Member

Откуда:
Сообщений: 13147
а у вас молоко убежало GROUP BY потерялся. агрегирование больших диапазонов не бывают "дешевыми". индекс по дате кластерным. или дополнить до покрывающего. будет чуть лучше. а дальше индексированные представления и прочие ужимки пойдут
27 апр 16, 20:19    [19114584]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
jaanq
Member

Откуда:
Сообщений: 10
Crimean, действительно, спасибо за внимательность
вот правильный запрос:
DECLARE @dBeg Date
DECLARE @dEnd Date
SELECT 
   O.[Date],
   O.[Types],
   O.[User_Id],
   SUM([O.[Value])
FROM [Operations] O
WHERE O.[Date] BETWEEN @dBeg AND @dEnd
GROUP BY O.[Date], O.[Types], O.[User_Id]
27 апр 16, 20:26    [19114600]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
LoopN
Guest
jaanq
Crimean, действительно, спасибо за внимательность
вот правильный запрос:
DECLARE @dBeg Date
DECLARE @dEnd Date
SELECT 
   O.[Date],
   O.[Types],
   O.[User_Id],
   SUM([O.[Value])
FROM [Operations] O
WHERE O.[Date] BETWEEN @dBeg AND @dEnd
GROUP BY O.[Date], O.[Types], O.[User_Id]

1. Покрывающий индекс по дате с включением Types, User_Id, Value.
2. Сolumstore индекс.
27 апр 16, 22:40    [19114903]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса  [new]
LoopN
Guest
3. индексированное представление тоже подходит
create view ViewName
....
SELECT 
   O.[Date],
   O.[Types],
   O.[User_Id],
   SUM([O.[Value]) Value
FROM [Operations] O
GROUP BY O.[Date], O.[Types], O.[User_Id]
--------------
select [Date],
   [Types],
   [User_Id],
   Value
from ViewName where WHERE O.[Date] BETWEEN @dBeg AND @dEnd
27 апр 16, 22:49    [19114930]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить