【发布时间】:2016-02-06 15:15:08
【问题描述】:
我不确定这是否与我正在处理非常大的表(有些表有 900+ 百万行)有关,但我在优化查询时遇到了问题。我还尽可能检查并使用了索引字段,我的查询中使用的大多数字段实际上都被索引了。使用select top 100 语句大约需要 10 分钟,我希望更快地获取所有结果.我将如何优化此查询和未来的类似查询?为了安全起见,我不得不使用下面的替代别名:
SELECT TOP 100
x.ID, j.ID, j.FirstDate, j.ExpiryDate, x.Lock, COUNT (*) as Numbers
FROM
j WITH(NOLOCK)
INNER JOIN
jp WITH(NOLOCK) ON j.ID = jp.ID
INNER JOIN
jd WITH(NOLOCK) ON (jd.ID = jp.ID And jd.path = 3)
INNER JOIN
fa WITH(NOLOCK) ON fa.ID = j.ID
INNER JOIN
l WITH(NOLOCK) ON j.ID = l.ID AND l.CoID = 3
INNER JOIN
c WITH(NOLOCK) ON c.CID = fa.CID
INNER JOIN
x WITH(NOLOCK) ON c.CID = x.CID
WHERE
j.ExpiryDate > GETDATE()
GROUP BY
x.ID, j.ID, j.FirstDate, j.ExpiryDate, x.Lock
HAVING
COUNT(*) <= 10
【问题讨论】:
-
设置Bad Habits to kick - putting NOLOCK everywhere - 不推荐在任何地方使用它 - 恰恰相反!
-
按那个按钮查看解释计划并附在此处
-
如果不是
getdate(),我会说物化视图值得一看。 -
删除 WITH(NOLOCK) 没有任何区别,但链接读起来很有趣。
标签: sql sql-server tsql join optimization