Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.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
Postgresql 博士后';s查询优化器';s统计估计为多表联接的中间产品计算最常见的值列表?_Postgresql_Query Optimization - Fatal编程技术网

Postgresql 博士后';s查询优化器';s统计估计为多表联接的中间产品计算最常见的值列表?

Postgresql 博士后';s查询优化器';s统计估计为多表联接的中间产品计算最常见的值列表?,postgresql,query-optimization,Postgresql,Query Optimization,我正在阅读Postgres的查询优化器的统计估计器代码,以了解它是如何工作的 作为参考,Postgres的查询优化器的统计估计器估计Postgres计划树中操作(例如,连接、选择)的输出大小。这允许Postgres在不同的查询执行方式之间进行选择 Postgres的统计估计器使用缓存的关于每个关系列内容的统计信息来帮助估计输出大小。保存的两个关键数据结构似乎是: 最常见值(MCV)列表:存储在该列中的每个最常见值及其在该列中出现的频率的列表 存储在该列中的数据的柱状图 例如,给定表格: X

我正在阅读Postgres的查询优化器的统计估计器代码,以了解它是如何工作的

作为参考,Postgres的查询优化器的统计估计器估计Postgres计划树中操作(例如,连接、选择)的输出大小。这允许Postgres在不同的查询执行方式之间进行选择

Postgres的统计估计器使用缓存的关于每个关系列内容的统计信息来帮助估计输出大小。保存的两个关键数据结构似乎是:

  • 最常见值(MCV)列表:存储在该列中的每个最常见值及其在该列中出现的频率的列表
  • 存储在该列中的数据的柱状图
例如,给定表格:

X Y
1 A
1 B
1 C
2 A
2 D
3 B
Y的最常见值列表将包含
{1:0.5,2:0.333}

但是,当Postgres在多连接操作中完成第一个连接时,如以下示例所示:

SELECT *
FROM A, B, C, D
WHERE A.ID = B.ID AND B.ID2 = C.ID2 AND C.ID3 = D.ID3
生成的表没有MCV(或直方图)(因为我们刚刚创建了表,还没有对其进行
ANALYZE
d!)这将使估计剩余联接的输出大小/成本变得更加困难

Postgres是否自动生成/估计此表的MCV(和直方图)以帮助进行统计估计?如果是,它如何创建此MCV

作为参考,以下是我到目前为止看到的:

  • 对Postgres statistical planner的工作原理进行了高度概括的文档:

  • 执行大部分POSTGRES统计评估的代码:

  • 生成关系的MCV的代码:

  • 子句选择的通用逻辑:


  • 如果能找到一个指向要查看的正确代码文件的指针,我们将不胜感激!非常感谢您的时间。

    在PostgreSQL术语中,连接的结果称为连接关系,但这并不意味着它是一个“物化”表,在某种程度上可以与常规PostgreSQL表(称为基关系)相比

    特别是,由于连接关系在物理上不存在,因此不能使用
    ANALYZE
    d来收集统计信息。而是根据连接关系的大小和连接条件的选择性来估计行数。此选择性是介于0(条件排除所有行)和1(条件不过滤任何内容)之间的数字

    相关代码位于
    src/backend/optimizer/path/costsize.c
    中,欢迎您学习

    重点是:

    • 特别考虑与外键对应的连接条件:

      如果外键中的所有列都是联接条件,那么我们知道这种联接的结果必须与引用表一样大,因此选择性为
      1/引用表大小

    • 其他连接条件通过猜测该条件将消除的行的百分比来单独估计

      对于左(或右)外部联接,我们知道结果大小必须至少与左(或右)边一样大

    • 最后,笛卡尔连接的大小(关系大小的乘积)乘以上面计算的所有选择性

      请注意,这将所有条件视为独立的,如果条件相互关联,则会导致错误的估计。但由于PostgreSQL没有跨表统计数据,所以它做得再好不过了


    @一匹没有名字的马我对POSTGRES的计划者/优化器的内部结构很感兴趣。我知道可以使用createstatistics来扩充现有的关系/视图-我正在尝试确定POSTGRES是否会自动为查询求值期间生成的中间表生成统计信息。:)(这些表与数据库中的任何表都不对应,因为它们将在查询完成后被销毁。)非常有用,谢谢!(我将努力完成代码,并将
    从句列表的操作等的小结作为后记附加到我的q中)谢谢你的建议和指向代码的指针!