Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为服务器端分页查询创建适当的索引_Sql Server_Database_Indexing - Fatal编程技术网

Sql server 为服务器端分页查询创建适当的索引

Sql server 为服务器端分页查询创建适当的索引,sql-server,database,indexing,Sql Server,Database,Indexing,我有以下疑问: SELECT TOP (100000) [Filter1].[ID] AS [ID], [Filter1].[FIELD1] AS [FIELD1], [Filter1].[FIELD2] AS [FIELD2], [Filter1].[FIELD3] AS [FIELD3], [Filter1].[FIELD4] AS [FIELD4], ... [Filter1].[FIELD30] AS [FIELD30]

我有以下疑问:

SELECT TOP (100000) 
    [Filter1].[ID] AS [ID], 
    [Filter1].[FIELD1] AS [FIELD1], 
    [Filter1].[FIELD2] AS [FIELD2], 
    [Filter1].[FIELD3] AS [FIELD3], 
    [Filter1].[FIELD4] AS [FIELD4], 
    ...
    [Filter1].[FIELD30] AS [FIELD30], 
    FROM ( SELECT [Extent1].[ID] AS [ID],
         [Extent1].[FIELD1] AS [FIELD1],
         [Extent1].[FIELD2] AS [FIELD2],
         [Extent1].[FIELD3] AS [FIELD3]
         ...
         [Filter1].[FIELD30] AS [FIELD30], 
         row_number() OVER (ORDER BY [Extent1].[ID] ASC) AS [row_number]
         FROM [dbo].[TABLE] AS [Extent1]
         WHERE (N'VALUE1' <> [Extent1].[**FIELD2**]
         AND (N'VALUE2' <> ([Extent1].[**FIELD3**])
         AND ([Extent1].[**FIELD4**] IN (VALUE1, VALUE2, VALUE3, .... VALUE9)))
         AS [Filter1]
    WHERE [Filter1].[row_number] > 0
    ORDER BY [Filter1].[ID] ASC
以及所有可能的排列。查询执行时间是原来的两倍和三倍

为什么会发生这种情况?我可以创建什么样的索引来加速这种情况


顺便说一下,我正在运行SQLServer2005,所以不能使用筛选索引。兼容性级别为7.0。

嘿,我在本地计算机上用虚拟数据做了一些测试。我之所以提出这一建议,是因为考虑到目前该表上没有任何索引。或者,如果您有此建议,请在进行任何测试之前退出

1) [FIELD1]未在任何where筛选器中使用。将该主键设置为非集群

2) 现在在列上建立聚集索引(FIELD2 ASC、FIELD3 ASC、FIELD4 ASC)

3) 在[ID]列上有按排序的行数函数。因此,在外序by子句中使用[Row_Number]代替[ID]

4) 更改查询中的Where过滤器顺序。首先保留[FIELD4]过滤器,然后使用[FIELD2]和[FIELD3]过滤器


5) 如果列[FIELD2]和[FIELD3]的数据类型为INT/NUMERIC/DATE,则可以将“”运算符替换为“(>或的组合,此处的解决方案是忽略where和order by子句上的索引,而将order by子句更改为“order by[Filter1]。[FIELD2]ASC"已存在聚集索引的位置。这样,在3秒内返回了100k行。文件内的顺序已更改,但服务器端分页未受影响。

您可以删除where子句,因为它不起任何作用。
选择TOP
行数
组合是多余的。如果您有聚集索引exp on
FIELD1
,然后
row_number()(按[Extent1].[ID]ASC排序),因为[row_number]
强制SQL对表重新排序。我会删除row_number(),只需使用您的
TOP N
@Andrew,这是有意义的,但是,删除row_number()即使执行计划较短,也会将持续时间延长30秒。看起来查询设计没有得到充分的时间。在创建/更新索引之前,您可以实际描述表结构、当前索引、当前数据量、当前执行时间。按“执行时间”我指的是来自SSMS的查询所花费的执行时间。不是客户端将数据呈现给用户所花费的总时间。顺便说一句,为什么是最长的时间(100000)?这是业务需要,还是您添加了它以提高性能。选择子查询中的所有数据并在外部查询中对其进行筛选是我注意到的第一件事,这是一个不正确的查询。我的感觉是,在这个查询中抛出更多索引对您没有帮助。您在内部查询中使用了
ch倾向于扼杀选择性。你的观察支持了这一点,即复合索引的任何可能排列都没有帮助。@AnupShah是对的,你在内部查询中对整个表重新排序,然后在外部查询中过滤掉。如果可能的话,在ID上而不是在FIELD1上创建聚集索引,这应该会有所帮助。创建一个广泛的c该表上的聚集索引可能会影响性能,因为它每天更新数百次,并且已经有二十多个索引。最终解决方案是执行“按[Filter1].[FIELD2]ASC排序”,聚集索引当前所在的位置。这导致在3秒钟内检索到10万行,我对此非常满意。无论如何,我会投票给你的答案,因为我不知道SQL FIDLE:)是的,这就是为什么我要求的第一件事是解释任何现有索引。同样,如果你有几十个索引,你应该更认真地对待它,因为我猜你可能已经推迟了当前的问题。但很高兴知道,您已经找到了即时的解决方案,只需进行最小的更改。
FIELD2 ASC,
FIELD3 ASC,
FIELD4 ASC,
ID ASC