【问题标题】:join issue, what are the best alternatives?加入问题,最好的选择是什么?
【发布时间】:2011-05-19 10:26:41
【问题描述】:

问:

我有 5 或 6 个表,我需要这些表中的数据: 我做出以下连接语句来完成我的查询。

SELECT d.batch_no,d.studytype_code,d.camp_code,d.dep_code,d.start_date,d.end_date,a.year,a.term_code,c.studytype_name ,e.dep_name_ar,f.camp_name_ar
FROM llkbatch a , llkbatch_category b , mm19studytype c ,llkbatch_exception d  ,llkdepartment e,llkcamp f
WHERE   a.batch_no = b.batch_no
AND  b.studytype_code = c.studytype_code 
AND  b.batch_no = d.batch_no
AND b.studytype_code = d.studytype_code 
AND d.dep_code = e.dep_code
AND d.camp_code = f.camp_code

但我认为join 有时会降低执行此类操作的性能,在programming waydatabase layer 中是否有任何替代方法,我的意思是一般连接的替代方法以及何时应该我离开了连接。 多谢。

【问题讨论】:

  • 是什么让您认为join 对性能不利?
  • 您真的面临任何性能问题吗?或者这就像“可能会变慢”?
  • 不,但是我的团队负责人告诉我,联接是邪恶的,而且性能较差,并告诉我每次遇到这种情况时我都应该找到替代方案。我使用 informix dbms。
  • 你的组长是个白痴,呃,我的意思是,被误导了!
  • 我相信他的团队领导不相信normalisation

标签: asp.net sql sql-server join informix


【解决方案1】:

有一种更现代的 ANSI 连接语法可以让您的连接更具可读性,但不会影响性能:

SELECT d.batch_no,d.studytype_code,d.camp_code,d.dep_code,d.start_date,d.end_date,
       a.year,a.term_code,c.studytype_name ,e.dep_name_ar,f.camp_name_ar
FROM ra1batch a 
JOIN ra1batch_category b ON a.batch_no = b.batch_no
JOIN ra1studytype c ON b.studytype_code = c.studytype_code
JOIN ra1batch_exception d ON b.batch_no = d.batch_no
                         AND b.studytype_code = d.studytype_code 
JOIN rr1department e ON d.dep_code = e.dep_code
JOIN rr2camp f ON d.camp_code = f.camp_code

【讨论】:

  • 如果我使用存储过程,这将提高性能与否。
  • 你应该试着把它变成存储过程,然后检查性能..至少你会有一个需要改进的基准
  • 对,所以他希望您运行 6 个查询(每个表 1 个),然后在您的代码中进行一些循环和诸如此类的操作,将数据组合(或“连接”)成行。多么棒的一块木板!
  • 当然,您可以在 asp.net(或任何其他语言)中以编程方式执行此操作,但它不会更快,而且可能会慢得多。 RDBMS 旨在准确处理此类事情。最好让他们继续。如果您发现性能下降,请先查看查询计划和索引。
  • 从不 - 如果您想合并来自 2 个或更多表的数据,连接是 的方法!
【解决方案2】:

您在问题中编写的查询遵循 Oracle 的语法。但是您使用联接就像使用 SQL Server 一样。与您当前的查询相比,它将为您提供更好的性能。

与您当前的查询相比,以下查询的解析速度更快。

SELECT d.batch_no, d.studytype_code, d.camp_code, …
FROM ra1batch a
INNER JOIN ra1batch_category b on a.batch_no = b.batch_no

【讨论】:

  • 这不是“Oracle 语法”,它只是 pre-ANSI JOIN 语法。 Oracle 支持 ANSI 联接已有大约 15 年了。
  • 我对Oracle不太熟悉。感谢您的澄清。
  • @Tony Andrews:“Oracle 已经支持 ANSI 连接大约 15 年了”——你有点偏离:IIRC SQL-92 OUTER JOIN 语法直到 2001 年左右的 v9 才在 Oracle 中得到支持.
猜你喜欢
  • 1970-01-01
  • 2010-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多