我有一个非常简单的查询,基本上是这样的:
Select * from my_table Where my_field != '';
表中有大约 40,000 行,“my_field”列是一个文本字段(varchar 255)
查询运行大约需要 39,000 毫秒。我猜是因为它必须在每条记录中查看不是空字符串的东西。我已经索引了 my_field 列,但它没有改变任何东西。
以防万一,这是查询计划:
"Seq Scan on my_table (cost=0.00..3468.91 rows=39744 width=459)"
" Filter: ((my_field)::text <> ''::text)"
我在这里最好的选择是什么?
解释分析:
"Seq Scan on my_table (cost=0.00..3468.91 rows=39730 width=459) (actual time=0.021..13.763 rows=39714 loops=1)"
" Filter: ((my_field)::text <> ''::text)"
"Total runtime: 14.856 ms"
我添加了这些索引
CREATE INDEX aa_idx ON my_table(my_field);
CREATE INDEX aa_idx ON my_table(my_field) WHERE my_field <> '';
这是 Postgres 9.1
编辑:[2013-02-26 00:04GMT]
在“my_field”上创建分区作为检查约束有什么好处吗?
类似于 CHECK(my_field = '') 和分区 2 CHECK(my_field != '')
我猜那么我将拥有一张有很多行的表格?但这是否意味着即使分区包含大约 80% 的数据, select != '' 查询也会执行得更快?
我还研究了全文搜索,但这似乎是一个 OTT。我还研究了将列设为 0 或 1(布尔值)的整数,但这对性能没有影响(我猜是因为 = 1 仍然会带回很多行?)