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

Откуда:
Сообщений: 384
Добрый день всем!

Помогите с оптимизацией..

Есть таблица дат за период, есть таблица с двумя столбиками - дата и значение..

Необходимо составить запрос, который на каждый день из первой таблицы вернет сумму значений в этот день..

Date_Table
(
DDate smalldatetime
)

Value_Table
(
VDate smalldatetime,
VValue int
)

запрос вида

select DDate, Sum(VValue)
from Date_Table, Value_Table 
where DDate = VDate
group by DDate

работает очень долго.. как я понимаю, из-за того что нет никаких индексов для связи таблиц.. как лучше реализовать этот запрос?
5 авг 09, 11:09    [7499118]     Ответить | Цитировать Сообщить модератору
 Re: помогите оптимизировать запрос  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
про первичные и внешние ключи Ваших таблиц расскажите, пожалуйста
5 авг 09, 11:15    [7499177]     Ответить | Цитировать Сообщить модератору
 Re: помогите оптимизировать запрос  [new]
temp-for-testing
Member

Откуда:
Сообщений: 384
Паганель,

таблица Date_Table временная и формируется перед выполнением запроса.. т.е. никаких ключей в ней нет.. а таблица Value_Table имеет первичный ключ автоинкрементный + плюс внешние ключи на другие таблицы (таблица товаров, клиентов, магазинов и т.д.)
5 авг 09, 11:17    [7499194]     Ответить | Цитировать Сообщить модератору
 Re: помогите оптимизировать запрос  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
а теперь пример данных покажите, пожалуйста
5 авг 09, 11:18    [7499204]     Ответить | Цитировать Сообщить модератору
 Re: помогите оптимизировать запрос  [new]
temp-for-testing
Member

Откуда:
Сообщений: 384
Паганель,

Date_Table заполняется датами от '01.01.2009' до '31.01.2009'

Value_Table
|     VDate     |    VValue    |
--------------------------------
| 01.01.2009 | 6 |
| 02.01.2009 | 10 |
| 02.01.2009 | 11 |
--------------------------------

нужно получить

|  01.01.2009   |     6        |
| 02.01.2009 | 21 |
| 03.01.2009 | 0 |
.......
| 31.01.2009 | 0 |

на самом деле период произвольный и несколько месяцев, на каждый день записей в второй таблице по 100-200, а то и больше..
5 авг 09, 11:24    [7499265]     Ответить | Цитировать Сообщить модератору
 Re: помогите оптимизировать запрос  [new]
temp-for-testing
Member

Откуда:
Сообщений: 384
задача усложняется тем, что нужно еще сделать такой же выбор из другой таблицы Another_Value_Table
5 авг 09, 11:29    [7499304]     Ответить | Цитировать Сообщить модератору
 Re: помогите оптимизировать запрос  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
temp-for-testing
на самом деле период произвольный и несколько месяцев, на каждый день записей в второй таблице по 100-200, а то и больше..
И только даты, без времени?
И в результате получается, что 200*365=73000 записей суммируются долго?
Странно...
Надо бы план глянуть
5 авг 09, 11:31    [7499311]     Ответить | Цитировать Сообщить модератору
 Re: помогите оптимизировать запрос  [new]
так не быстрее?
Guest
select a.DDate, b.SumValue
from Date_Table a
LEFT JOIN
(SELECT VDate, Sum(VValue) As SumValue  
 FROM Value_Table 
 group by VDate) b
ON a.DDate = b.VDate
5 авг 09, 11:31    [7499313]     Ответить | Цитировать Сообщить модератору
 Re: помогите оптимизировать запрос  [new]
aleks2
Guest
temp-for-testing,

Нужен индекс
на Date_Table

primary key clustered (DDate)

и индекс на Value_Table

clustered index (VDate, VValue)
5 авг 09, 11:33    [7499339]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить