我想知道。我有一个复杂的查询,它在 SQL Server 2005 Express 版本中运行大约 3 秒。
主表有大约 300k 行。
当我添加
ROW_NUMBER() OVER (ORDER BY date_column)
date_column
是一datetime
列需要 123 秒。
如果我做
ROW_NUMBER() OVER (ORDER BY string_title)
它再次运行 3 秒。
datetime
我在列上添加了一个索引。不用找了。还有123秒。
然后我尝试了:
ROW_NUMBER() OVER (ORDER BY CAST(date_column AS int))
查询再次在 3 秒内运行。
既然强制转换需要时间,为什么 SQL Server 会有这样的行为???
更新:似乎 ROW_NUMBER 完全忽略了我的 WHERE 语句并为所有可用条目构建行列列表?任何人都可以确认吗?
在这里,我在 SQL Management Studio 中复制了一个更好的可读性(仍然是大量的逻辑:)):
SELECT ROW_NUMBER() OVER (ORDER BY xinfobase.lid) AS row_num, *
FROM xinfobase
LEFT OUTER JOIN [xinfobasetree] ON [xinfobasetree].[lid] = [xinfobase].[xlngfolder]
LEFT OUTER JOIN [xapptqadr] ON [xapptqadr].[lid] = [xinfobase].[xlngcontact]
LEFT OUTER JOIN [xinfobasepvaluesdyn] ON [xinfobasepvaluesdyn].[lparentid] = [xinfobase].[lid]
WHERE (xinfobase.xlngisdeleted=2
AND xinfobase.xlinvalid=2)
AND (xinfobase.xlngcurrent=1)
AND ( (xinfobase.lownerid = 1
OR (SELECT COUNT(lid)
FROM xinfobaseacl
WHERE xinfobaseacl.lparentid = xinfobase.lid
AND xlactor IN(1,-3,-4,-230,-243,-254,-255,-256,-257,-268,-589,-5,-6,-7,-8,-675,-676,-677,-9,-10,-864,-661,-671,-913))>0
OR xinfobasetree.xlresponsible = 1)
AND (xinfobase.lid IN (SELECT lparentid
FROM xinfobasealt a, xinfobasetree t
WHERE a.xlfolder IN(1369)
AND a.xlfolder = t.lid
AND dbo.sf_MatchRights(1, t.xtxtrights,'|')=1 )) )
AND ((SELECT COUNT(*) FROM dbo.fn_Split(cf_17,',')
WHERE [value] = 39)>0)
此查询需要 2-3 秒处理 300k 条记录。现在我将其更改ORDER BY
为xinfobase.xstrtitle
然后它再次运行大约 2-3 秒。如果我切换到xinfobase.dtedit
(带有我刚刚添加的附加索引的日期时间列)它需要我上面提到的时间。
我还试图“作弊”并将我的声明作为一个 SUB SELECT 来强制他首先检索记录并ROW_NUMBER()
在另一个 SQL 语句中执行外部操作,同样的性能结果。