优化我的 T-SQL 查询以提高性能

Posted

技术标签:

【中文标题】优化我的 T-SQL 查询以提高性能【英文标题】:Refine my T-SQL query to increase performance 【发布时间】:2016-02-16 21:26:06 【问题描述】:

创建了一个 SQL 查询来汇总一些数据。它很慢,所以我想我会寻求帮助。

Table 是一个日志表,具有:

loc, tag, entrytime, exittime, visits, entrywt, exitwt

我的测试日志中有 700,000 条记录。 entrytimeexittime 是纪元值。

我知道我的查询效率很低,因为它会遍历表 4 次。

select 
    loc, edate, tag,
    (select COUNT(*) from mylog as ml 
     where mvlog.loc = ml.loc 
       and mvlog.edate = CONVERT(date, DATEADD(ss, ml.entrytime, '19700101')) 
       and mvlog.tag = ml.tag) as visits,
    (select SUM(entrywt - exitwt) from mylog as ml2 
     where mvlog.loc = ml2.loc 
       and mvlog.edate = CONVERT(date, DATEADD(ss, ml2.entrytime, '19700101')) 
       and mvlog.tag = ml2.tag) as consumed,
    (select SUM(exittime - entrytime) from mylog as ml3 
     where mvlog.loc = ml3.loc 
       and mvlog.edate = CONVERT(date, DATEADD(ss, ml3.entrytime, '19700101')) 
       and mvlog.tag = ml3.tag) as occupancy
from 
    eventlogV as mvlog with (INDEX(pt_index))

索引pt_indextagloc 列组成。

当我运行这个查询时,它大约在 30 秒内完成。由于我的查询效率低下,我相信它会更好。

任何想法表示赞赏。

【问题讨论】:

可以发一下执行计划吗?也许给我们一些表/索引定义? eventlogVmylog 是两个不同的表吗? 我相信任何类型的refine 问题最好发布在codereview.stackexchange.com。 对不起。 eventlogV 是 mylog 表的视图。最后,我有多个记录,例如 loc tag entrytime。 entrytime 是纪元,因此它是自 1970 年 1 月 1 日以来的秒数。当查询运行时,我希望每个 loc 标记日期有 1 条记录,用于汇总所有等效 loc 标记 entrytime 记录中的字段。我还没有生成执行计划,所以我会挖掘出来,明天提供。 【参考方案1】:

似乎您只需 LEFT JOIN mylog 到 eventlogV 一次并获得相同的结果。

SELECT  mvlog.loc,
        mvlog.edate,
        mvlog.tag,
        COUNT(ml.loc) AS visits,
        SUM(entrywt - exitwt) AS consumed,
        SUM(exittime - entrytime) AS occupancy
FROM    eventlogV AS mvlog
        LEFT OUTER JOIN mylog ml ON mvlog.loc = ml.loc
                                    AND mvlog.edate = CONVERT(DATE,DATEADD(ss,ml.entrytime,'19700101'))
                                    AND mvlog.tag = ml.tag
GROUP BY mvlog.loc,
        mvlog.edate,
        mvlog.tag

【讨论】:

运行您的查询版本,它在 25 秒内完成,而原始版本为 30 秒。 这不难相信.. AND mvlog.edate = CONVERT(DATE,DATEADD(ss,ml.entrytime,'19700101')) 部分可能是你的杀手 您能否将计算列添加到mylog 表并将entrytime 值转换为日期值?

以上是关于优化我的 T-SQL 查询以提高性能的主要内容,如果未能解决你的问题,请参考以下文章

如何提高查询性能?

提高 SQL Server 查询性能

优化产品范围查询的性能

如何大幅优化solr的查询性能

为啥我的解决方案这么慢,如何提高查询的性能?

MongoDB如何优化查询性能?