我一直在进行一些实验,标题中的陈述似乎是真的,我想知道是否有办法解决这个问题。
以下是一个例子:
&(object->function)==NULL
运行这些查询:
CREATE TABLE test ( cond text, v1 integer, v2 integer, v3 integer );
-- Insert millions of rows
CREATE INDEX cond_idx ON test (cond);
CREATE INDEX values_idx ON test (v1, v2, v3);
VACUUM ANALYZE test;
PostgreSQL可以有效地组合索引,但似乎只适用于复合条件,有没有办法让PostgreSQL在使用一个或多个查找所需行后使用投影索引?
自动响应是创建包含所有4列的单个索引。事情是这只是一个简约的例子。在现实世界场景中,不同的列将查询相同的表,这些列需要针对每个所需查询条件的多列索引。
更新:将计数更改为总和,以使示例更易于理解。还添加了更多“值”列。
答案 0 :(得分:1)
count()
聚合不能使用索引数据作为输入,因为它对每个非空值都计为1:http://www.postgresql.org/docs/9.4/static/functions-aggregate.html
count(expression):
number of input rows for which the value of expression is not null
在第二个查询中,在索引过滤之后,我们不知道哪一行有一个空value
列。
您只需将相关数据添加到索引中并使用多列索引。
CREATE INDEX cond_value_idx ON test (cond, value);
一旦您阅读了优秀的http://use-the-index-luke.com/
,这可能会变得清晰这是一个类比,可以更好地了解PostgreSQL的内部结构。 你有1000本普通书和2本“特别”书。 1000本书是你的行,另外两本是你的索引。
其中一个索引书是列出按主题分类的每个书架和编号,另一个是列出每个书架和编号,但按作者分类。
请注意,1000本书存放在一个巨大的架子上,2本索引书放在你的桌子上,随时可以使用。
问题是有些书籍非常独特,没有按主题分类(我们的空值)。
如果您想要计算与主题相关联的图书,您只需选择“主题”索引即可。 但是,如果你想要计算每个格雷戈里史密斯的主题相关的书籍,那么你将查找格雷戈里史密斯书籍的作者索引,然后在书架上挑选它们以确定它们是否有主题。
此处的解决方案是第三本索引书,其中列出了按作者分类的每个书架和编号,然后按主题分类。只有这样,您才能立即回答问题,而无需前往货架。
请注意,多列索引的顺序很重要,因为您无法使用按主题分类的索引书然后按作者轻松回答相同的问题。