PostgreSQL 禁用全表扫描的实现
  • 作者:admin
  • 发表时间:2021-05-25 08:50
  • 来源:未知

这篇文章主要介绍了PostgreSQL 禁用全表扫描的实现操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧。

PostgreSQL可以通过一些设置来禁用全表扫描(FULL SCAN/Seq Scan)

注意:

设置此功能后不是完全避免全表扫描,而是只要有不通过全表扫描能得出结果的就不走全表扫描。

如果什么路都不通,那肯定得全表扫描,不然怎么获取数据。

而且并不是不走全表扫描性能就一定好。

下面展示下这个功能:

查询表结构:

highgo=# \d test
    Table test
 Column |    Type    | Modifiers
-------------+--------------------------------+-----------
 G   | character varying(50)   |
 A   | character varying(12)   |
 M   | timestamp(0) without time zone |
 W   | character varying(5)   |
Indexes:
 "s__x0" btree ("G", "A", "M", "W")

 

先检查视图:

highgo=# select * from pg_db_role_setting ;
 setdatabase | setrole | setconfig
-------------+---------+-----------
(0 rows)

 

查询执行计划:

highgo=# explain 唐山百度排名select "G","Z" from test where "G"='PG';
         QUERY PLAN        
------------------------------------------------------------------------------
 Seq Scan on test (cost=0.00..3.11 rows=1 width=72)
 Filter: (("G")::text = '7e'::text)
(2 rows)

 

对用户进行限制:

highgo=# alter role xyh set enable_seqscan =off;
ALTER ROLE
 
highgo=# select * from pg_db_role_setting ;
 setdatabase | setrole |  setconfig 
-------------+---------+----------------------
   0 | 26171 | {enable_seqscan=off}

 

再次查询执行计划:

highgo=# explain select "G","Z" from test where "G"='7e';
         QUERY PLAN        
------------------------------------------------------------------------------
 Index Scan using "s__x0" on test (cost=0.14..8.15 rows=1 width=72)
 Index Cond: (("G")::text = '7e'::text)
(2 rows)

 

补充:psql 会引起全表扫描的10种sql语句

1、模糊查询效率很低:

原因:like本身效率就比较低,应该尽量避免查询条件使用like;对于like ‘%...%'(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低;另外,由于匹配算法的关系,模糊查询的字段长度越大,模糊查询效率越低。

解决办法:首先尽量避免模糊查询,如果因为业务需要一定要使用模糊查询,则至少保证不要使用全模糊查询,对于右模糊查询,即like ‘…%',是会使用索引的;左模糊like