有没有替代连接来提高性能?

hri*_*shi 3 sql sql-server join

有没有替代连接来提高性能?

编辑(gbn):与join-or-correlation-subquery-with-exists-clause相关,哪一个更好


为什么没有人提到嵌套循环连接?

mar*_*c_s 13

不是JOIN的"替代"方式,而是提高JOIN性能的提示:在SQL Server中,很多人都不知道你应该总是在外键列上放置非聚集索引.有些人认为SQL Server会自动执行此操作 - 但事实并非如此.

所以,如果你有一个表Customer,它可能有一个类似的主键CustomerID.SQL Server将自动为其添加索引.

但是,如果您有一个Order与其具有外键关系的表,则Customer默认情况下该列上没有索引Order.CustomerID.但是这样的索引对于连接和查找非常有用且有用,因此这是我总是建议的最佳实践:在表中的所有外键列上放置一个索引.

  • 这真是太神奇了,我不知道默认情况下外键没有索引。这将我的查询性能提高了 100 倍,加入了 5 个表,结果是 ~7500 行!!(之前是 5.5 秒,现在是 55 毫秒)+1 (2认同)

gbn*_*gbn 5

从你的另一个问题

select * 
from ContactInformation c 
where exists (select * from Department d where d.Id = c.DepartmentId )

select * 
from ContactInformation c 
inner join Department d on c.DepartmentId = d.Id  
Run Code Online (Sandbox Code Playgroud)

如果您想要两个表的输出,那么您可以选择其他选项而不是 JOIN。这里的第二个查询。

如果它很慢,那么通常:

  • 你有主键/索引吗?
  • 一致的数据类型(DepartmentId/id 列)
  • 不要使用 SELECT *


Bil*_*win 5

降低连接性能的策略:

  • 索引
  • 非规范化
  • 缓存结果
  • 使用 NoSQL 数据库(无 SQL = 无连接,qed)

所有这些策略都针对特定查询进行了优化。您无法制定可以改进所有查询的通用解决方案。


Gus*_*nti 4

如果您想要/可以读取未提交的记录,在连接上使用 (NOLOCK) 可能会提高性能。 什么时候应该使用“with (nolock)”