sql最佳化-錯誤強制型別轉換導致索引失效

余为民同志發表於2024-08-26

使用GaussDB資料庫進行測試

建立下面表,僅有一個欄位ainteger型別。宣告其為主鍵,資料庫會預設為其建立索引。

create table t1(
    a int PRIMARY KEY
);

使用\d+檢視錶結構:

gaussdb=# \d+ t1
                          Table "public.t1"
 Column |  Type   | Modifiers | Storage | Stats target | Description
--------+---------+-----------+---------+--------------+-------------
 a      | integer | not null  | plain   |              |
Indexes:
    "t1_pkey" PRIMARY KEY, btree (a) TABLESPACE pg_default
Has OIDs: no
Options: orientation=row, compression=no

檢視select * from t1 where a = 1;執行計劃:

gaussdb=# explain select * from t1 where a = 1;
                              QUERY PLAN
-----------------------------------------------------------------------
 [Bypass]
 Index Only Scan using t1_pkey on t1  (cost=0.00..8.27 rows=1 width=4)
   Index Cond: (a = 1)
(3 rows)

可以看到該語句順利使用B樹索引:Index Only Scan

檢視select * from t1 where a::text = 1;執行計劃:

gaussdb=# explain select * from t1 where a::text = 1;
                     QUERY PLAN
----------------------------------------------------
 Seq Scan on t1  (cost=0.00..52.04 rows=12 width=4)
   Filter: (((a)::text)::bigint = 1)
(2 rows)

可以看到該語句從使用B樹索引,改為順序掃描:Seq Scan。因為::text將a型別強轉為text型別,也就無法使用索引。

::是型別轉換運算子,用於將一個表示式的值轉換為另一種資料型別。

相關文章