【发布时间】: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 记录中的字段。我还没有生成执行计划,所以我会挖掘出来,明天提供。
标签: sql sql-server query-performance sqlperformance