【问题标题】:SQL Server 2016 incorrect query plan estimate despite updated statistic尽管更新了统计信息,但 SQL Server 2016 查询计划估计不正确
【发布时间】:2018-12-28 20:36:47
【问题描述】:

我正在优化一个查询,并注意到它变得非常慢,因为它估计行数为 16.6,而实际返回的行数为 565824。我更新了统计数据,删除并重新创建了,但是它仍然给出不正确的估计。这是针对 SQL Server 2016 的,不胜感激。

SQL:

select cd_key 
from dbo.CAMPDIV
where cd_camp = 'a' 
  and CD_CAMPYR = '2018' 
option (recompile)

非聚集索引的直方图 (cd_campyr)

All Density                     Average Length                  Columns                         
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
0.02040816                      4                               CD_CAMPYR                       
7.412665E-08                    8                               CD_CAMPYR, CD_ID                
7.184833E-08                    18                              CD_CAMPYR, CD_ID, CD_CAMP       

Histogram Steps                 
RANGE_HI_KEY                    RANGE_ROWS                      EQ_ROWS                         DISTINCT_RANGE_ROWS             AVG_RANGE_ROWS                  
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
                                0                               792181                          0                               1                               
1979                            0                               230                             0                               1                               
1980                            0                               332                             0                               1                               
1981                            0                               604                             0                               1                               
1982                            0                               622                             0                               1                               
1983                            0                               330                             0                               1                               
1984                            0                               1762                            0                               1                               
1985                            0                               868                             0                               1                               
1986                            0                               551                             0                               1                               
1987                            0                               190                             0                               1                               
1988                            0                               352                             0                               1                               
1989                            0                               519                             0                               1                               
1990                            0                               38829                           0                               1                               
1991                            0                               439486                          0                               1                               
1992                            0                               366357                          0                               1                               
1993                            0                               375469                          0                               1                               
1994                            0                               369176                          0                               1                               
1995                            0                               367691                          0                               1                               
1996                            0                               376979                          0                               1                               
1997                            0                               388239                          0                               1                               
1998                            0                               391408                          0                               1                               
1999                            0                               402551                          0                               1                               
2000                            0                               413392                          0                               1                               
2001                            0                               422470                          0                               1                               
2002                            0                               461895                          0                               1                               
2003                            0                               458726                          0                               1                               
2004                            0                               459876                          0                               1                               
2005                            0                               473357                          0                               1                               
2006                            0                               464213                          0                               1                               
2007                            0                               472373                          0                               1                               
2008                            0                               457623                          0                               1                               
2009                            0                               462268                          0                               1                               
2010                            0                               465633                          0                               1                               
2011                            0                               470338                          0                               1                               
2012                            0                               472091                          0                               1                               
2013                            0                               481586                          0                               1                               
2014                            0                               484236                          0                               1                               
2015                            0                               492460                          0                               1                               
2016                            0                               514569                          0                               1                               
2017                            0                               551739                          0                               1                               
2018                            0                               571969                          0                               1                               
2019                            0                               552550                          0                               1                               
2020                            0                               54                              0                               1                               
2021                            0                               33                              0                               1                               
2022                            0                               21                              0                               1                               
2023                            0                               8                               0                               1                               
2025                            1                               1                               1                               1                               
2099                            0                               1                               0                               1                               

【问题讨论】:

  • 那么实际满足过滤条件的行数是565824?然后,无论估计如何,查询都将花费一些时间。您想从这个大量查询中优化什么?
  • 是的,但问题是为什么估算值相差这么多
  • 计划不好。如果我删除了索引,它使用不同的查询计划并使用索引扫描,整个查询在 3 秒内返回,如果我重新创建索引和与之关联的统计信息,它会执行索引查找,执行时间为 3分钟+ 数据库有off numbers,它可能会影响执行计划,但是当这个数字偏离那么多时,就会出现一个大问题,这就是我想要找到的
  • select cd_key from dbo.CAMPDIV where cd_camp = cast('a' as char(4)) and CD_CAMPYR = cast('2018' as char(10)) option ( recompile) 的估算值是多少?
  • 你可能想在dba.stackexchange.com发帖

标签: sql sql-server tsql


【解决方案1】:

你所说的有点奇怪,但无论如何......覆盖指数可能会帮助甚至产生急剧增加。 请尝试创建索引:

CREATE INDEX IX_CampDiv_CD_Camp_CD_CampYR ON dbo.CAMPDIV (cd_camp, CD_CAMPYR  ) 
INCLUDE (cd_key)

至少会阻止嵌套循环改进计划。

请分享结果。

【讨论】:

    猜你喜欢
    • 2013-04-03
    • 1970-01-01
    • 2021-12-24
    • 2023-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多