在SQL中使用连接索引进行优化

在SQL中使用连接索引进行优化,sql,join,indexing,Sql,Join,Indexing,这似乎很基本,但我花了最后一个小时寻找,找不到直接的答案 我们有两张桌子:tblCustomer和tblStore tblCustomer具有CustomerNumber和Version的主要唯一索引 问题1:如果tblStore没有CustomerNumber作为主键,我是否仍然可以通过以下方法获得更好的优化: From tblStore s Left Join tblCustomer c On s.CustomerNumber = c.CustomerNumber 还

这似乎很基本,但我花了最后一个小时寻找,找不到直接的答案

我们有两张桌子:tblCustomer和tblStore

tblCustomer具有CustomerNumber和Version的主要唯一索引

问题1:如果tblStore没有CustomerNumber作为主键,我是否仍然可以通过以下方法获得更好的优化:

From 
    tblStore s 
Left Join 
    tblCustomer c On s.CustomerNumber = c.CustomerNumber
还是让“on”成为两个表的索引更好

问题2:我只想要客户版本为1的行。我应该说:

From 
    tblStore s 
Left Join 
    tblCustomer c On s.CustomerNumber = c.CustomerNumber 
                  And c.Version = 1
我想这对性能来说比后面在Where子句中做的更好,但是它是否使通过索引连接更好,或者CustomerNumber本身就足够了

我正在处理一个包含很多行的查询,所以任何建议都是有用的

谢谢

优化器可以考虑是否重新排列为右连接,以及是否进行合并、散列或循环连接,其中第一个通常对于大量排序行最好,第二个用于大量未排序行,第三个通常对于少量行最好。 我假设这个查询将选择所有商店,并加入所有客户。通常,您需要合并联接,因此理想情况下,您可以在CustomerNumber上为两个表编制索引。这不必是主键,它可以是辅助的非聚集索引;主键也不必是表的实际顺序的聚类索引,它也可以是辅助索引。 这两种语法之间的区别不是性能(优化器可以解决),而是正确性。如果将过滤器放置在中,您将过滤掉所有没有客户的商店。ON子句中的过滤器通常是正确的。在内部连接中,即使对性能也没有任何影响。 要对此查询进行优化,最好将Version作为索引的第一列,后跟CustomerNumber。另一个选项是过滤索引,但这超出了本文的范围。
我建议你仔细阅读索引。这可能是一个很好的开始,如果您担心联接性能,请使用简单的递增整数主键。将条件放入join或where子句对性能来说并不重要,但它可以给出不同的结果。从我所读到的内容来看,如果我在where子句中放入条件,它将首先拉回所有行,然后在到达where子句时限制它们。这不是真的吗?那根本不是真的。谓词下推意味着SQL Server在加载磁盘行时,甚至可以直接在存储引擎上对其进行筛选。谢谢您提供的信息。我确实有一本书,我正在努力通过它来提高意识。我没有权限更新表的索引。我只是使用这些数据创建报告。考虑到这一点,如果我有表A和表b,我应该试着找到它们共享的索引吗?如果一个字段不存在,那么最好在A的索引或B的索引上联接?在正确的字段上联接。不要编造符合索引的东西