代码之家  ›  专栏  ›  技术社区  ›  Adrian Serafin

Postgresql 8.3,不使用索引的简单查询

  •  1
  • Adrian Serafin  · 技术社区  · 16 年前

    我有两张桌子:

    table1 (about 200000 records)
     number varchar(8) 
    
    table2 (about 2000000 records)
     number varchar(8)
    

    两个表中的字段“number”都有标准索引。 对于表1中的每条记录,表2中分配了大约10条记录。

    我执行查询:

    explain select table1.number from table1, table2 where table1.number = table2.number;
    

    查询计划显示将不使用索引,Seq扫描全部;)

    也许有人能告诉我为什么postgresql会这么做?

    3 回复  |  直到 16 年前
        1
  •  4
  •   filiprem    16 年前

    顺序扫描对于选择性非常低的查询是正常的(也是最佳的),也就是说,对于遍历整个表的查询。

    select * from pg_stats where tablename in ('table1','table2'); 
    

    http://doxygen.postgresql.org/ ->src/backend/optimizer]如果您有兴趣的话。

        2
  •  2
  •   Jonathan Feinberg    16 年前

    是的,那个 PostgreSQL docs 可以告诉你!

    以下是一些亮点:

    当不使用索引时,可以 有一些运行时参数可以 关闭各种平面类型(请参见 第18.6.1节)。例如,转动 关闭顺序扫描(启用序列扫描) (启用嵌套循环),这是 基本计划,将迫使系统 仍然选择顺序扫描或 可能是一个更根本的原因 索引没有被使用;因为 匹配索引。(什么样的疑问 可以使用什么样的索引

    如果强制使用索引确实使用 可能性:要么系统是 对,使用索引确实是 查询计划的 现实。所以你应该为你的问题计时

        3
  •  -1
  •   gonzofish    16 年前

    这可能取决于索引的创建方式。如果“number”实际上是一个数字,那么您应该考虑将列类型更改为bigint。同样,不是百分之百确定,但我认为在字符列上建立索引的工作方式不同于在基于数字的字段上建立索引……不过,我可能是在胡说八道。