2016-05-02 5 views
0

Пожалуйста, помогите мне по оптимизации для запроса ниже:Необходимость оптимизации для запроса

select s.ZahialgaID, sum(s.Quantity) total_qty, MAX(s.date_moved) MaxDate 
from 
    tCardMoveForTailan s 
where 
    (
     s.date_moved is null or 
     s.date_moved <= @date_end or 
     convert(varchar(20), s.date_moved, 111) = convert(varchar(20), @date_end, 111) 
    ) and 
    (
     s.TsehID = GoyoMSDB.dbo.GetTsehByCode('nyrav') or 
     s.TsehID = GoyoMSDB.dbo.GetTsehByCode('rejected') or 
     s.TsehID = GoyoMSDB.dbo.GetTsehByCode('orooson') or 
     s.TsehID = GoyoMSDB.dbo.GetTsehByCode('zereg') 
    ) 
group by s.ZahialgaID; 

использовать эти данные для запроса: http://orion.mn/updateapp/data_to_play.rar

Теперь этот запрос выполняется в течение 10 секунд на 200000 строк. Но я думаю, что для такого простого запроса возможно 1 или 2 секунды. Пожалуйста, помогите мне в решении этой задачи!

Таблица tCardMoveForTailan имеет кластерный индекс, как показано ниже:

create clustered index IX_tCardMoveForTailan_2 on tCardMoveForTailan (ZahialgaID, TsehID, date_moved); 

Любое предложение будет оценено! Функция

В соответствии с просьбой комментариями, тело dbo.GetTsehByCode():

CREATE FUNCTION GetTsehByCode (@code nvarchar(50)) 
RETURNS int AS 
BEGIN 
    declare @tsehid int 
    select @tsehid = TsehID from tTseh where [email protected] 
    RETURN @tsehid 
END 

В таблице tTseh имеет только 10 строк.

+2

Я думаю, что узким местом является функция 'GoyoMSDB.dbo.GetTsehByCode()', который вызывается для каждого и каждой строки. Можете ли вы опубликовать его код? Возможно, он может быть переписан как функция с табличной оценкой. – HoneyBadger

+0

, вероятно, UDF (GoyoMSDB.dbo.GetTsehByCode) пытаются прокомментировать их один за другим и проверить производительность, но я не могу получить это условие: 's.date_moved <= @ date_end или convert (varchar (20), s .date_moved, 111) = convert (varchar (20), @ date_end, 111) 'Мне кажется бессмысленным, что вы уже сравниваете значения как даты, почему их конвертировать – Gubr

+1

'GetTsehByCode' похоже, что он должен быть заменен поисковой таблицей, но я действительно не могу быть уверен, если вы не опубликуете эту функцию. –

ответ

0

Может быть, это помогает:

;with cte as (
    select TsehID from tTseh where code In ('nyrav','rejected','orooson','zereg') 
) 
select 
    s.ZahialgaID, 
    sum(s.Quantity) total_qty, 
    MAX(s.date_moved) MaxDate 
from 
    tCardMoveForTailan s 
    inner join cte on (s.TsehID = cte.TsehID) 
where 
    (s.date_moved is null) 
    or (s.date_moved <= @date_end) 
    or (convert(varchar(20), s.date_moved, 111) = convert(varchar(20), @date_end, 111)) 
group by s.ZahialgaID; 
Смежные вопросы