Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.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

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
如何利用索引PostgreSQL优化查询_Sql_Postgresql_Indexing_Postgresql 9.3 - Fatal编程技术网

如何利用索引PostgreSQL优化查询

如何利用索引PostgreSQL优化查询,sql,postgresql,indexing,postgresql-9.3,Sql,Postgresql,Indexing,Postgresql 9.3,我想获取具有1个或多个已处理赌注的用户。我通过使用下一个sql来实现这一点: SELECT user_id FROM bets WHERE bets.state in ('guessed', 'losed') GROUP BY user_id HAVING count(*) > 0; 但运行EXPLAIN ANALYZE时,我注意到没有使用索引,并且查询执行时间非常长。我尝试添加部分索引,如: CREATE INDEX processed_bets_index ON bets(st

我想获取具有1个或多个已处理赌注的用户。我通过使用下一个sql来实现这一点:

SELECT user_id FROM bets 
WHERE bets.state in ('guessed', 'losed') 
GROUP BY user_id 
HAVING count(*) > 0;
但运行EXPLAIN ANALYZE时,我注意到没有使用索引,并且查询执行时间非常长。我尝试添加部分索引,如:

CREATE INDEX processed_bets_index ON bets(state) WHERE state in ('guessed', 'losed');
但请解释分析未更改的输出:

 HashAggregate  (cost=34116.36..34233.54 rows=9375 width=4) (actual time=235.195..237.623 rows=13310 loops=1)
   Filter: (count(*) > 0)
   ->  Seq Scan on bets  (cost=0.00..30980.44 rows=627184 width=4) (actual time=0.020..150.346 rows=626674 loops=1)
     Filter: ((state)::text = ANY ('{guessed,losed}'::text[]))
     Rows Removed by Filter: 20951
 Total runtime: 238.115 ms
 (6 rows)
除了(猜测、丢失)一点之外,其他状态的记录

如何创建适当的索引


我使用的是PostgreSQL 9.3.4。

我假设状态主要由“猜测”和“失败”组成,可能还有一些其他状态。因此,优化器很可能没有看到使用索引的必要性,因为它仍然会获取大多数行

您需要的是一个关于用户id的索引,因此可能类似这样的东西可以工作:

CREATE INDEX idx_bets_user_id_in_guessed_losed ON bets(user_id) WHERE state in ('guessed', 'losed');
或者,不使用部分索引:

CREATE INDEX idx_bets_state_user_id ON bets(state, user_id);

如果你想讨论两个不同的问题,请在每篇文章中坚持一个问题-发表一个新的问题。如果您愿意,可以在它们之间链接。“除了(猜测、丢失)一点之外,其他状态的记录。”。嗯?我不明白这是什么意思。不管怎样:第一个想法,你是否
分析赌注?有多大比例的行处于
猜测状态
输掉状态(顺便说一句,它是“输掉的”)状态?对不起,我的英语不好)赌注有三种状态:猜测状态、输掉状态和进行中状态。这个比例大约是45/45/10。没有使用部分索引,我得到了预期的结果!谢谢