优化我的 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 条记录。 entrytime
和 exittime
是纪元值。
我知道我的查询效率很低,因为它会遍历表 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_index
由tag
和loc
列组成。
当我运行这个查询时,它大约在 30 秒内完成。由于我的查询效率低下,我相信它会更好。
任何想法表示赞赏。
【问题讨论】:
可以发一下执行计划吗?也许给我们一些表/索引定义?eventlogV
和 mylog
是两个不同的表吗?
我相信任何类型的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 查询以提高性能的主要内容,如果未能解决你的问题,请参考以下文章