需要优化查询
Posted
技术标签:
【中文标题】需要优化查询【英文标题】:Need optimization for a query 【发布时间】:2016-05-02 07:49:37 【问题描述】:请帮助我优化以下查询:
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
现在此查询在 200000 行上运行 10 秒。 但我想这样一个简单的查询可能需要 1 或 2 秒。请帮我完成这项任务!
表 tCardMoveForTailan 有一个聚集索引如下:
create clustered index IX_tCardMoveForTailan_2 on tCardMoveForTailan (ZahialgaID, TsehID, date_moved);
任何建议将不胜感激!
根据cmets的要求,dbo.GetTsehByCode()函数体:
CREATE FUNCTION GetTsehByCode (@code nvarchar(50))
RETURNS int AS
BEGIN
declare @tsehid int
select @tsehid = TsehID from tTseh where code=@code
RETURN @tsehid
END
tTseh 表只有 10 行。
【问题讨论】:
我认为瓶颈是函数GoyoMSDB.dbo.GetTsehByCode()
,每一行都会调用它。你可以发布它的代码吗?也许它可以重写为表值函数。
这可能是 UDF (GoyoMSDB.dbo.GetTsehByCode) 尝试一一评论它们并检查性能,但我无法得到这个条件:'s.date_moved
GetTsehByCode
似乎应该用查找表替换,但除非您也发布该功能,否则我真的无法确定。
你们太棒了。它是函数 GetTsehByCode()。当我用它的返回值替换它时,查询不到一秒钟。谢谢大家
请考虑回答您自己的问题并接受答案,以便其他人知道问题已解决。
【参考方案1】:
也许这会有所帮助:
;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;
【讨论】:
以上是关于需要优化查询的主要内容,如果未能解决你的问题,请参考以下文章