需要优化查询

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;

【讨论】:

以上是关于需要优化查询的主要内容,如果未能解决你的问题,请参考以下文章

需要优化查询

需要优化 MySQL 查询以在 Solr 中使用该查询

SQL查询优化

减少查询响应时间,需要优化查询

SQL 查询优化

优化连接查询,需要“过滤”不同的