文档首页/ 云数据库 GaussDB/ 开发指南(集中式_V2.0-10.x)/ FAQ-非透明多写/ 数据库使用入门/ 在使用了字符串处理函数后查询就不使用索引,该如何处理?
更新时间: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 explain_perf_mode = normal;
gaussdb=# EXPLAIN ANALYZE SELECT * FROM tbl_test WHERE lpad(c1,5,'0') = '00324';
                                             QUERY PLAN
-----------------------------------------------------------------------------------------------------
 [Parameterized]
 Seq Scan on tbl_test  (cost=0.00..189.00 rows=1 width=4) (actual time=0.435..10.480 rows=1 loops=1)
   Filter: (lpad((c1)::text, 5, '0'::text) = '00324'::text)
   Rows Removed by Filter: 9999
 Total runtime: 10.582 ms
(5 rows)

--修改为表达式索引后,该查询会使用索引。
gaussdb=# DROP INDEX idx_test_c1;
gaussdb=# CREATE INDEX idx_test_c1 ON tbl_test(lpad(c1,5,'0'));
gaussdb=# EXPLAIN ANALYZE SELECT * FROM tbl_test WHERE lpad(c1,5,'0') = '00324';
                                                      QUERY PLAN
----------------------------------------------------------------------------------------------------------------------
 [Parameterized]
 Index Scan using idx_test_c1 on tbl_test  (cost=0.00..2.47 rows=1 width=4) (actual time=0.199..0.210 rows=1 loops=1)
   Index Cond: (lpad((c1)::text, 5, '0'::text) = '00324'::text)
 Total runtime: 0.350 ms
(4 rows)
--删除。
gaussdb=# DROP INDEX idx_test_c1;
gaussdb=# DROP TABLE tbl_test;

相关文档