Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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
Sql Postgres WHERE和按优化排序_Sql_Postgresql - Fatal编程技术网

Sql Postgres WHERE和按优化排序

Sql Postgres WHERE和按优化排序,sql,postgresql,Sql,Postgresql,我有一张100多行的大桌子。我试图找出是否有一种更快的方法来执行以下内容 查询: SELECT * FROM "public".example WHERE a = "foo" and b = "bar" order by c /* could be any of fields c to z */ limit 100; 这是我现在设置的表和索引 表: 身份证 a(字符串) b(字符串) c。。。z(所有整数) 索引: "example_multi_idx" btree (a, b) "c_i

我有一张100多行的大桌子。我试图找出是否有一种更快的方法来执行以下内容

查询:

SELECT *
FROM "public".example
WHERE a = "foo" and b = "bar"
order by c /* could be any of fields c to z */
limit 100;
这是我现在设置的表和索引

表:

  • 身份证
  • a(字符串)
  • b(字符串)
  • c。。。z(所有整数)
索引:

"example_multi_idx" btree (a, b)
"c_idx" btree (c)
想法:

  • 如果我只是按
    c
    排序,那么
    的索引“example\u multi\u idx\u with_c”b树(a,b,c)
    执行得非常出色。然而,如果我加入各种排序方式,那么我将需要创建n个多键索引,这似乎是浪费
对于此查询:

SELECT *
FROM "public".example
WHERE a = "foo" and b = "bar"
order by c /* could be any of fields c to z */
limit 100;
最佳索引是
示例(a、b、c)
。Postgres应该能够使用索引进行排序


如果要为排序依据设置多个可能的列,则需要为每个列设置单独的索引。

a
b
筛选后,组有多大?虽然在索引中包含
c
肯定会有助于提高性能,但如果您的组不是特别大,那么在操作结束时进行排序应该不会有很大的成本


您当前的索引是否存在性能问题?

我同意,但是,如果有N个order by选项(如我在上一个要点中指出的)如何?为每种可能性创建多键索引似乎都是浪费。但是,除非有子查询或其他花哨的步法可以完成,否则这可能就是它的方式?@nakkor。如果您希望为每个条件使用索引,那么这是您唯一的选择。对相对少量的数据进行排序不应花费太长时间。因此,如果其他条件是高度选择性的,您可以让Postgre进行排序。结果集小于10k。分析的排序成本似乎在200ms左右,而完整索引的排序成本为1ms。我希望在这两者之间找到一个好的解决方案,它不会因为每个多索引一遍又一遍地重复a和b而导致索引大小的巨大膨胀。