回答

收藏

在PostgreSQL中索引空值

技术问答 技术问答 274 人阅读 | 0 人回复 | 2023-09-14

我有以下形式的查询:
6 g9 L" H8 x4 X9 h& v+ q" m8 \4 qselect m.id from mytable m
' S' d" d  A" `. hleft outer join othertable o on o.m_id = m.id
4 y. S: c3 I6 v7 q) i    and o.col1 is not null and o.col2 is not null and o.col3 is not null
& V/ r( X) e( Y. Fwhere o.id is null
. p. O7 ~8 c+ b0 a0 l, M该查询返回几百条记录,尽管这些表具有数百万行,并且它要花很长时间才能运行(大约一个小时)。
$ r& x( U3 U3 M$ Z当我使用以下方法检查索引统计信息时:
) ~+ ^$ _' J- A! jselect * from pg_stat_all_indexes
; }; h1 \, ]9 rwhere schemaname  'pg_catalog' and (indexrelname like 'othertable_%' or indexrelname like 'mytable_%')
1 Y" f, F9 C) `  G: J) n我看到只使用了othertable.m_id的索引,而根本没有使用col1..3的索引。为什么是这样?
. N% i& b8 ?2 ?- v5 T) ?我在一些5 L! ]0 N9 t9 ]1 k, a
地方读过,PG传统上无法索引NULL值。但是,我已经阅读了自PG 8.3以来的情况,据说已经改变了吗?我目前在Ubuntu9 T6 d( R; p' E8 I$ l9 H; b1 r
10.04上使用PostgreSQL 8.4。我是否需要专门创建“部分”或“功能”索引以加快IS NOT7 |" X" G$ }# D* t+ V
NULL查询的速度,还是已经为NULL编制索引,而我只是误解了这个问题?
# r$ q: |/ s- ^4 ^/ w. H  n               
+ c( k( ]/ }% p; ^1 e* p解决方案:; a6 b$ S& g2 v5 o# J! m
                3 n1 O+ p' a: J3 t5 W- M
8 R, U! ?5 v" o! W- o4 i8 H
$ c; O$ h; z+ {* _8 z
                您可以尝试部分索引:
2 f( j+ W, P" s, q# n3 aCREATE INDEX idx_partial ON othertable (m_id)
2 J+ o) Y  z8 BWHERE (col1 is not null and col2 is not null and col3 is not null);
' o" c+ K) B7 i/ d从文档中:http : //www.postgresql.org/docs/current/interactive/indexes-) `- x* }& `# L8 f4 E# Q0 o
partial.html
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则