Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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 ON子句中的列是否需要索引?_Sql_Sql Server_Database Design_Postgresql_Query Optimization - Fatal编程技术网

Sql ON子句中的列是否需要索引?

Sql ON子句中的列是否需要索引?,sql,sql-server,database-design,postgresql,query-optimization,Sql,Sql Server,Database Design,Postgresql,Query Optimization,是否必须为联接中引用的列创建索引? 例如 我应该在左表(foo)、右表(bar)或两者上创建索引吗 当我使用EXPLAIN(Postgresql)和EXPLAIN(Postgresql)时,我注意到了不同的结果,使用EXPLAIN(Postgresql)和EXPLAIN(Postgresql)时有索引和没有索引,并切换比较顺序 (right_table.bar = left_table.foo) 我知道WHERE子句的左侧使用了索引,但我想知道是否需要对ON子句中列出的列使用索引。通常在左侧有

是否必须为联接中引用的列创建索引? 例如

我应该在左表(foo)、右表(bar)或两者上创建索引吗

当我使用EXPLAIN(Postgresql)和EXPLAIN(Postgresql)时,我注意到了不同的结果,使用EXPLAIN(Postgresql)和EXPLAIN(Postgresql)时有索引和没有索引,并切换比较顺序

(right_table.bar = left_table.foo)

我知道WHERE子句的左侧使用了索引,但我想知道是否需要对ON子句中列出的列使用索引。

通常在左侧有一个主键,因此不需要索引。但是在右边你通常会有一个外键,这对索引是有意义的。

这取决于你的
位置,但简单的回答是

通常,左表将此列作为主键,默认情况下,这是一个索引。 第二列将是外键,您的查询可能会受益于为此列添加的索引。您需要分析查询以确定是否需要索引

假设查询是这样的:

SELECT  *
FROM  left_table
   INNER JOIN right_table ON
      left_table.foo = right_table.bar
WHERE left_table.SomeField = 1
右侧的\u表上建立索引。一定会使用条形图

另一方面:

SELECT  *
FROM  left_table
   INNER JOIN right_table ON
      left_table.foo = right_table.bar
WHERE right_table.SomeField = 1

在这种情况下,将不使用
right\u table.bar上的索引,而使用
left\u table.foo上的索引。

谢谢。。不接受你的回答我感到很难过,但上面的回答者写了很多。我对他的努力给予了奖励:)合并-连接算法通常会运行得更快,索引位于条件的两侧。对于大型基数联接,这可能是最快的策略。如果没有第二个索引,优化器甚至可能不会选择合并连接策略。
SELECT  *
FROM  left_table
   INNER JOIN right_table ON
      left_table.foo = right_table.bar
WHERE right_table.SomeField = 1