我对表格有一个疑问:

select m.id from mytable m
left outer join othertable o on o.m_id = m.id
    and o.col1 is not null and o.col2 is not null and o.col3 is not null
where o.id is null

该查询返回几百条记录,尽管这些表有数百万行,而且运行起来需要很长时间(大约一个小时).

当我使用以下工具判断索引统计信息时:

select * from pg_stat_all_indexes
where schemaname <> 'pg_catalog' and (indexrelname like 'othertable_%' or indexrelname like 'mytable_%')

我看到只使用了其他table.m_id的索引,而根本没有使用col1..3的索引.这是为什么呢?

我在fewplaces中读到,PG传统上不能索引空值.然而,我读到这应该是从第8.3页开始改变的吧?我目前在Ubuntu10.04上使用PostgreSQL8.4.我是否需要专门创建一个"部分"或"函数"索引来加速IS NOT NULL查询,或者它已经在索引NULL而我只是误解了这个问题?

推荐答案

您可以try 使用部分索引:

CREATE INDEX idx_partial ON othertable (m_id)
WHERE (col1 is not null and col2 is not null and col3 is not null);

来自文档:http://www.postgresql.org/docs/current/interactive/indexes-partial.html

Database相关问答推荐

安装postgresql用于使用和调试Apache-AGE

您是否遇到过 SQL Server 因为引用了太多表而无法执行的查询?

Mongodb聚合$group,限制数组长度

使用 PostgresQL 判断现有列的约束

在不稳定的网络中保持分布式数据库同步

无法使用命令行运行 liquibase

便携式(PHPPass)密码哈希.我应该使用它们吗?

在事务提交之前传递 JMS 消息

SQLite 如果列存在

设计用于存储多人游戏的各种要求和统计数据的表格

MySQL JDBC Driver中cachePrepStmts和useServerPrepStmts有什么区别

显示包含特定表的所有数据库名称

判断Android中的应用程序数据库中是否存在列

SQL - 如何转置?

如何在没有验证提取的情况下将 MSSQLServer 数据库提取为 .dacpac?

如何删除除了postgres中的少数数据库之外的所有数据库

SQLite3 UNIQUE 约束失败错误

标准化人类皮肤 colored颜色 以进行用户交互

在 SQLite 表中使用文本作为主键不好?

Cassandra - 事务支持