如果sql查询包含大量连接,是否存在任何性能问题?

时间:2009-09-11 05:04:13

标签: sql

如果sql查询包含大量连接,是否存在任何性能问题?

5 个答案:

答案 0 :(得分:4)

可以 - 但查询性能是一个受许多因素影响的敏感因素:

  • 联接数
  • 表格结构
  • 数据库的大小
  • 索引的存在if和数据类型
  • 正在加入的值的数据类型
  • 等等

您可以了解各种细节。但通常最好的方法是编写一个有效的查询,然后对您的应用进行概要分析,看看您是否确实遇到了问题。 然后,开始考虑优化您的查询。

答案 1 :(得分:2)

  

提升JOIN的最佳方法之一   性能是限制多少行   需要加入。

阅读本文的更多内容

Performance Tuning SQL Server Joins

答案 2 :(得分:2)

但最大的问题是:表格如何加入。假设您有一个类似的查询:

select book.title, chapter.page_count
from chapter
join book on book.bookid=chapter.bookid
where chapter.subject='penguins'

查询可能会先阅读章节表,先找'penguins'上的匹配,然后再加入Book。如果Bookid是图书的主键,或者至少被编入索引,那么这将是非常快的。但如果没有,那么我们将不得不对Book进行全文顺序读取。根据引擎和其他因素,我们可能必须重新读取找到的每个章记录的整个Book表。这可能需要很长时间。

如果您加入三个表并且两个联接都需要完整的文件读取,那么您可能会受到伤害。

加入总是花费你某事。但是需要完整文件读取的连接,特别是多个完整文件读取,需要花费很多。一些数据库引擎通过识别它正在发生并通过将表加载到内存并重新使用它来缓解这种成本,通常对它进行某种哈希搜索。这仍然很昂贵,但并不那么糟糕。

学习阅读解释计划。这些可以帮助您分析查询,找出问题所在并清理它们。就个人而言,除非查询显然很简单,例如“从primary_key = what表中选择任何内容”,我会查看解释计划以确定。

答案 3 :(得分:1)

使用大量连接可能会降低检索性能(尽管通过适当的索引编制,惩罚通常比人们想象的要少 - 首先测量)。

然而,人们往往忘记删除连接通常意味着“非规范化”数据,然后在必须修改数据时会产生成本。特别是,强制完全规范化的模式在非规范化的模式中自动强制执行的约束可能很难。因为它很难,所以通常不会这样做。但是当没有强制执行约束时,数据变得不可靠,并且有一件事比返回正确答案的(略微)慢选择操作更糟糕,那就是返回错误或混淆答案的快速选择操作。

如果DBMS是主要读取的 - 也就是说,数据被写入一次而很少被修改,那么您可以考虑非规范化带来的性能优势是否会使数据库中不准确的数据风险可以接受。如果数据是关键任务且经常更新的,那么数据不准确的风险通常太严重而无法接受。

但是,正如他们所说,YMMV。

答案 4 :(得分:0)

是的,如果在SQL中使用大量连接会影响性能。