6

我想知道。我有一个复杂的查询,它在 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 BYxinfobase.xstrtitle然后它再次运行大约 2-3 秒。如果我切换到xinfobase.dtedit(带有我刚刚添加的附加索引的日期时间列)它需要我上面提到的时间。

我还试图“作弊”并将我的声明作为一个 SUB SELECT 来强制他首先检索记录并ROW_NUMBER()在另一个 SQL 语句中执行外部操作,同样的性能结果。

4

1 回答 1

1

更新

在我仍然对解决方法感到沮丧之后,我进行了更多调查。我删除了所有现有索引并对表运行了几个 SQL 语句。事实证明,使用新的列排序顺序构建新索引并包含不同的列我解决了我的问题,并且使用 dtedit (datetime) 列的查询也很快。

所以吸取了教训:更加注意您的索引和执行计划,并在您生产的软件的每次更新(新版本)中重新检查它们......

但仍然想知道为什么 CAST(datetime_column AS int) 之前让它变得更快......

于 2013-01-17T11:23:18.283 回答