AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 126011
Accepted
Geoff Patterson
Geoff Patterson
Asked: 2016-01-13 08:24:15 +0800 CST2016-01-13 08:24:15 +0800 CST 2016-01-13 08:24:15 +0800 CST

SQL Server 2014 COUNT(DISTINCT x) 忽略列 x 的统计密度向量

  • 772

对于COUNT(DISTINCT)具有约 10 亿个不同值的 a,我得到一个查询计划,其散列聚合估计只有约 300 万行。

为什么会这样?SQL Server 2012 产生了一个很好的估计,那么这是 SQL Server 2014 中的一个错误,我应该在 Connect 上报告吗?

查询及差评

-- Actual rows: 1,011,719,166
-- SQL 2012 estimated rows: 1,079,130,000 (106% of actual)
-- SQL 2014 estimated rows: 2,980,240 (0.29% of actual)
SELECT COUNT(DISTINCT factCol5)
FROM BigFactTable
OPTION (RECOMPILE, QUERYTRACEON 9481) -- Include this line to use SQL 2012 CE

-- Stats for the factCol5 column show that there are ~1 billion distinct values
-- This is a good estimate, and it appears to be what the SQL 2012 CE uses
DBCC SHOW_STATISTICS (BigFactTable, _WA_Sys_00000005_24927208)
--All density   Average Length  Columns
--9.266754E-10  8               factCol5
SELECT 1 / 9.266754E-10
-- 1079126520.46229

查询计划

在此处输入图像描述

完整脚本

这是使用仅统计数据库的情况的完整重现。

到目前为止我试过的

我深入研究了相关列的统计数据,发现密度向量显示了大约 11 亿个不同的值。SQL Server 2012 使用此估计并生成一个好的计划。令人惊讶的是,SQL Server 2014 似乎忽略了统计数据提供的非常准确的估计,而是使用了一个低得多的估计。这会产生一个慢得多的计划,它不会保留几乎足够的内存并溢出到 tempdb。

我尝试了 trace flag 4199,但这并没有解决问题。最后,我尝试通过跟踪标志的组合深入了解优化器信息,如本文(3604, 8606, 8607, 8608, 8612)后半部分所示。但是,在最终输出树中出现之前,我无法看到任何解释错误估计的信息。

连接问题

根据这个问题的答案,我也将此作为问题提交到 Connect

sql-server sql-server-2014
  • 1 1 个回答
  • 644 Views

1 个回答

  • Voted
  1. Best Answer
    Paul White
    2016-01-13T15:53:41+08:002016-01-13T15:53:41+08:00

    推导基数估计的方式对我来说肯定是违反直觉的。非重复计数计算(可通过扩展事件或跟踪标志 2363 和 3604 查看)为:

    统计推导

    注意帽子。这的一般逻辑似乎非常合理(不能有更多不同的值),但上限是从抽样的多列统计数据中应用的:

    DBCC SHOW_STATISTICS 
        (BigFactTable, [PK_BigFactTable])
    WITH
        STAT_HEADER, 
        DENSITY_VECTOR;
    

    PK 数据

    这显示了从 3,439,431,721 行中抽取的 2,980,235 行,其 Col5 级别的密度向量为 3.35544E-07。其倒数给出了 2,980,235 的多个不同值,使用实数四舍五入为 2,980,240。

    现在的问题是,给定抽样统计数据,模型应该对不同值的数量做出什么样的假设。我希望它可以推断,但这并没有完成,也许是故意的。

    更直观地说,我希望它不会使用多列统计信息,而是查看 Col5 上的密度(但它没有):

    DBCC SHOW_STATISTICS 
        (BigFactTable, [_WA_Sys_00000005_24927208])
    WITH
        STAT_HEADER, 
        DENSITY_VECTOR;
    

    Col5 统计数据

    这里的密度是 9.266754E-10,它的倒数是1,079,126,528。

    同时,一个明显的解决方法是使用全扫描更新多列统计信息。另一种是使用原始基数估计器。

    您打开的连接项SQL 2014 sampled multi-column statistics override more accurate single-column statistics for non-leading columns标记为Fixed for SQL Server 2017。

    • 15

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve