更新时间:2026-07-28 GMT+08:00
在使用了字符串处理函数后查询就不使用索引,该如何处理?
答:在索引列上使用函数处理后就不会走标准的索引,可以创建一个表达式索引,以lpad()函数为例。
--建表并插入数据。 gaussdb=# CREATE TABLE tbl_test (c1 varchar); gaussdb=# INSERT INTO tbl_test VALUES (generate_series(1,10000)); --普通索引使用lpad()函数,查询不会使用该索引。 gaussdb=# CREATE INDEX idx_test_c1 ON tbl_test(c1); gaussdb=# SET max_datanode_for_plan = 1; gaussdb=# SET explain_perf_mode = normal; --执行计划部分内容如下。 gaussdb=# EXPLAIN SELECT * FROM tbl_test WHERE lpad(c1,5,'0') = '00324'; QUERY PLAN ----------------------------------------------------------------------------------------------- Data Node Scan on "__REMOTE_FQS_QUERY__" (cost=0.00..0.00 rows=0 width=0) Node/s: All datanodes Remote SQL: SELECT c1 FROM public.tbl_test WHERE lpad(c1::text, 5, '0'::text) = '00324'::text Datanode Name: datanode1 Seq Scan on tbl_test (cost=0.00..96.22 rows=25 width=32) Filter: (lpad((c1)::text, 5, '0'::text) = '00324'::text) (8 rows) --修改为表达式索引后,该查询会使用索引。 gaussdb=# DROP INDEX idx_test_c1; gaussdb=# CREATE INDEX idx_test_c1 ON tbl_test(lpad(c1,5,'0')); gaussdb=# EXPLAIN SELECT * FROM tbl_test WHERE lpad(c1,5,'0') = '00324'; QUERY PLAN ----------------------------------------------------------------------------------------------- Data Node Scan on "__REMOTE_FQS_QUERY__" (cost=0.00..0.00 rows=0 width=0) Node/s: All datanodes Remote SQL: SELECT c1 FROM public.tbl_test WHERE lpad(c1::text, 5, '0'::text) = '00324'::text Datanode Name: datanode1 Bitmap Heap Scan on tbl_test (cost=1.55..18.09 rows=25 width=32) Recheck Cond: (lpad((c1)::text, 5, '0'::text) = '00324'::text) -> Bitmap Index Scan on idx_test_c1 (cost=0.00..1.54 rows=25 width=0) Index Cond: (lpad((c1)::text, 5, '0'::text) = '00324'::text) (10 rows) --删除。 gaussdb=# DROP INDEX idx_test_c1; gaussdb=# DROP TABLE tbl_test;
父主题: 数据库使用入门