Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/82.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中不稳定的索引查询性能_Sql_Performance_Postgresql_Indexing - Fatal编程技术网

PostgreSQL中不稳定的索引查询性能

PostgreSQL中不稳定的索引查询性能,sql,performance,postgresql,indexing,Sql,Performance,Postgresql,Indexing,需要有关PostgreSQL中查询性能的帮助。这似乎与索引有关 此查询: 根据类型进行筛选 按时间戳排序,升序: 从表中选择*,其中type='some\u type'按时间戳限制排序20 索引: CREATE INDEX the_table_timestamp_index ON the_table(timestamp); CREATE INDEX the_table_type_index ON the_table(type); type字段的值仅为11个不同字符串中的一个。 问题在

需要有关PostgreSQL中查询性能的帮助。这似乎与索引有关

此查询:

  • 根据
    类型进行筛选
  • 时间戳
    排序,升序:
从表中选择*,其中type='some\u type'按时间戳限制排序20

索引:

 CREATE INDEX the_table_timestamp_index ON the_table(timestamp);

 CREATE INDEX the_table_type_index ON the_table(type);
type
字段的值仅为11个不同字符串中的一个。
问题在于,查询似乎是在O(logn)时间内执行的,大多数时间只需要几毫秒,除了一些
type
值需要几分钟才能运行

在这些示例查询中,第一个查询只需几毫秒即可运行,而第二个查询则需要30分钟以上:

SELECT * FROM the_table WHERE type = 'goq' ORDER BY timestamp LIMIT 20
SELECT * FROM the_table WHERE type = 'csp' ORDER BY timestamp LIMIT 20
我怀疑,大约有90%的把握,我们拥有的指数不是正确的。在阅读之后,我认为我们最需要的是一个复合索引,在
类型
时间戳

我运行的查询计划如下所示:

  • )

  • 非常感谢你的帮助!任何指点都将非常感激

    索引可用于
    where
    子句或
    order by
    子句。使用索引
    表格(类型、时间戳)
    ,则可以对两者使用相同的索引

    我的猜测是,Postgres正在根据收集的统计数据决定使用哪个索引。当它使用where的索引,然后尝试排序时,会得到非常糟糕的性能


    这只是一个猜测,但是创建上面的索引是值得的,以查看这是否解决了性能问题。

    解释输出都使用时间戳索引。这可能是因为类型列的基数太低,所以对该列上的索引进行扫描与表扫描一样昂贵

    要创建的复合索引应为:

    create index comp_index on the_table ("timestamp", type)
    

    按这个顺序

    索引的大小是多少?数据集的大小呢?太棒了!所以索引中列的顺序不同?@JuanCarlosCoto。事实上,这个顺序确实起到了作用。通过先放置
    时间戳
    ,引擎无法使用
    where
    子句的索引。各种类型将分散在整个索引中。