Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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奇怪的执行计划选择_Sql Server_Sql Execution Plan_Sql Tuning - Fatal编程技术网

Sql server Sql Server奇怪的执行计划选择

Sql server Sql Server奇怪的执行计划选择,sql-server,sql-execution-plan,sql-tuning,Sql Server,Sql Execution Plan,Sql Tuning,我有一个关于sql server 2012 sp3的查询,它是通过应用程序动态构建的。我注意到一个案例,它运行缓慢,因为执行计划不足,我正试图找出问题所在 在本例中,正在生成的查询具有以下形式 Select some columns from (SELECT TOP 1 1 AS NEW FROM tr) AS AL JOIN (select some columns from a view join some tables where column = 'a' or column =

我有一个关于sql server 2012 sp3的查询,它是通过应用程序动态构建的。我注意到一个案例,它运行缓慢,因为执行计划不足,我正试图找出问题所在

在本例中,正在生成的查询具有以下形式

Select some columns from 
(SELECT TOP 1 1 AS NEW FROM tr) AS AL 
JOIN 
(select some columns from a view join some tables
 where column = 'a' or column = 'b' column = 'c'...) t5
ON 1=1 WHERE [t5].[ROW_NUMBER] BETWEEN 0+1 AND 0+20 ORDER BY [t5].[ROW_NUMBER]
外部选择正在用于分页。标记为t5的内部select在任何情况下单独执行时都会快速运行。但是,与外部选择分页相结合,它的速度可能非常慢,这取决于where语句中选择的值的数量以及它的选择性(获取的行数较少)

我曾试图更改查询以提高性能,但这样做会破坏由应用程序生成的查询的性能,而这些查询不是选择性的(获取多行)

在我看来,执行计划取决于where语句中选择的值。有没有办法帮助sql server选择正确的执行计划,从而避免无用的行读取


如果您有任何建议,我将不胜感激。

使用
OFFSET
/
FETCH
进行分页。您可以尝试更新统计信息,然后运行查询。SQL Server将选择最佳的执行计划。更改为OFFSET/FETCH对执行计划没有影响,并且查询仍然很慢。如果没有偏移/提取,查询运行速度很快。当查询是选择性的时,每个分页方法都很慢,但当没有where语句时,它们工作得很好。可能我必须更新统计信息,因为在知道我在指望自动更新统计信息之前,请使用
OFFSET
/
FETCH
进行分页。您可以尝试更新统计信息,然后运行查询。SQL Server将选择尽可能最佳的执行计划。更改为OFFSET/FETCH对执行计划没有影响,并且查询是正确的还是慢。如果没有偏移/提取,查询运行速度很快。当查询是选择性的时,每个分页方法都很慢,但当没有where语句时,它们工作得很好。也许我必须更新统计数据,因为直到我知道我一直指望自动更新统计数据