Sql server Sql Server奇怪的执行计划选择
我有一个关于sql server 2012 sp3的查询,它是通过应用程序动态构建的。我注意到一个案例,它运行缓慢,因为执行计划不足,我正试图找出问题所在 在本例中,正在生成的查询具有以下形式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 =
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语句时,它们工作得很好。也许我必须更新统计数据,因为直到我知道我一直指望自动更新统计数据