【发布时间】: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