Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 为复杂查询选择索引_Sql_Postgresql_Indexing - Fatal编程技术网

Sql 为复杂查询选择索引

Sql 为复杂查询选择索引,sql,postgresql,indexing,Sql,Postgresql,Indexing,我是数据库界的新手,因此希望获得一些关于基于以下查询创建Postgres索引的帮助。我有一堆看起来类似于此的查询,所以我将其设置为通用查询,我希望将我在这里学到的知识应用于其他查询 此查询汇总一列值并返回按特定类别分组的前100个值 SELECT sum(col1) as sum_col, t.col10 FROM table1 as s, table2 as up, table3 as g, table4 as t WHERE (s.col1 >= 0) AND (s.col2 = '

我是数据库界的新手,因此希望获得一些关于基于以下查询创建Postgres索引的帮助。我有一堆看起来类似于此的查询,所以我将其设置为通用查询,我希望将我在这里学到的知识应用于其他查询

此查询汇总一列值并返回按特定类别分组的前100个值

SELECT sum(col1) as sum_col, t.col10
FROM table1 as s, table2 as up, table3 as g, table4 as t 
WHERE (s.col1 >= 0) AND (s.col2 = 'f')
AND (g.col3 = 1)
AND (up.col4 = s.col5)
AND (g.id = s.col6 )
AND ((g.col7 = up.col8) OR (g.col9 = up.col8))
AND ((g.col7 = t.id) OR (g.col9 = t.id))
AND (t.id = up.col8) 
GROUP BY t.col10
ORDER BY sum_col DESC LIMIT 100
查看
WHERE
子句,这就是我所确定的表索引。我不确定这是否正确,或者是否需要添加更多多列
id
s是主键,因此我将它们从下面的索引中删除

Table1 Index:
col1 and col2 (2-way index)
col5

Table2 Index:
col4
col8

Table3 Index: 
col3
col7
col9

Table4 Index: 
col10? 

对您的调查结果发表评论:

Table1 Index:
col1 and col2 (2-way index)
col5
将第一个索引更改为
(col2,col1)
:首先是相等谓词的索引(
s.col2='f'
,然后是范围
s.col1>=0
)。请不要相信这个事实

如果没有执行计划,就无法判断是否需要
col5
上的索引(我们不知道使用的联接算法或联接顺序)

通常,在from/join子句中,每个表只需要一个索引。因此,正确的索引可能是
(col5,col2,col1)

出于同样的原因,很难说出关于表2的索引建议(join algo&order?)

类似地,表3除了无条件子句
g.col3=1
告诉您应该首先将该列放入索引之外。添加
col7
col9
可能有效(取决于join-algoℴ)

表4还没有用于排序吗?一大早我就不明白了

我写了一本索引指南,叫做使用索引,卢克。如果你真的想知道什么是最好的,请阅读:

编辑重新连接算法和顺序

原则上,数据库会自动选择最适合您的查询的连接算法。PostgreSQL使用以下三种算法之一:嵌套循环连接、哈希连接或排序/合并连接。除了选择算法外,表的处理顺序也会影响性能,因此数据库会尝试采用最佳算法

但是:索引会影响关于连接算法和顺序的数据库选择,反之亦然。要真正知道要放置哪些索引,您需要知道使用了哪种算法和顺序。不幸的是,这并不能保证最佳性能,因为其他索引可能会使其他连接算法比数据库最初采用的连接算法更快

找出数据库认为最好的方法是使用
explain
。但是,explain计划经常被重新创建,并且可能会在没有通知的情况下更改,例如,因为表已增长,因此另一个联接算法更有意义。这就是为什么您永远不应该优化一个或多或少为空的开发数据库。那只是浪费时间。您将需要真实的数据进行测试


不幸的是,非常复杂的东西

评论您的发现:

Table1 Index:
col1 and col2 (2-way index)
col5
将第一个索引更改为
(col2,col1)
:首先是相等谓词的索引(
s.col2='f'
,然后是范围
s.col1>=0
)。请不要相信这个事实

如果没有执行计划,就无法判断是否需要
col5
上的索引(我们不知道使用的联接算法或联接顺序)

通常,在from/join子句中,每个表只需要一个索引。因此,正确的索引可能是
(col5,col2,col1)

出于同样的原因,很难说出关于表2的索引建议(join algo&order?)

类似地,表3除了无条件子句
g.col3=1
告诉您应该首先将该列放入索引之外。添加
col7
col9
可能有效(取决于join-algoℴ)

表4还没有用于排序吗?一大早我就不明白了

我写了一本索引指南,叫做使用索引,卢克。如果你真的想知道什么是最好的,请阅读:

编辑重新连接算法和顺序

原则上,数据库会自动选择最适合您的查询的连接算法。PostgreSQL使用以下三种算法之一:嵌套循环连接、哈希连接或排序/合并连接。除了选择算法外,表的处理顺序也会影响性能,因此数据库会尝试采用最佳算法

但是:索引会影响关于连接算法和顺序的数据库选择,反之亦然。要真正知道要放置哪些索引,您需要知道使用了哪种算法和顺序。不幸的是,这并不能保证最佳性能,因为其他索引可能会使其他连接算法比数据库最初采用的连接算法更快

找出数据库认为最好的方法是使用
explain
。但是,explain计划经常被重新创建,并且可能会在没有通知的情况下更改,例如,因为表已增长,因此另一个联接算法更有意义。这就是为什么您永远不应该优化一个或多或少为空的开发数据库。那只是浪费时间。您将需要真实的数据进行测试


不幸的是,非常复杂的东西

谢谢你,马库斯!我将回顾链接。一些后续问题:当你说加入Algo&Order时,你的意思是我正在做但没有分享的事情吗?(如果是这样,我将按原样使用查询)。如果你的意思是,我需要指定它以使其更好:你能建议我需要指定哪种类型的算法吗?或者是完全不同的事情:我需要在哪里对查询运行Explain,看看Postgres选择做什么?它会随着时间的推移而改变,我需要监视它还是只进行一次设置。顺便说一句,表4已加入,但只使用主键,因此我没有在索引中列出它。我只是按列添加了组@