优化INNER JOIN查询性能

时间:2014-05-07 15:08:07

标签: sql oracle

我正在使用需要优化查询的数据库,我想知道哪些查询是优化的,我使用了计时器但结果太近了。所以我不必知道使用哪一个。

QUERY 1:

SELECT A.MIG_ID_ACTEUR, A.FL_FACTURE_FSL , B.VAL_NOM, 
       B.VAL_PRENOM, C.VAL_CDPOSTAL, C.VAL_NOM_COMMUNE, D.CCB_ID_ACTEUR
   FROM MIG_FACTURE A 
      INNER JOIN MIG_ACTEUR B
         ON A.MIG_ID_ACTEUR= B.MIG_ID_ACTEUR
      INNER JOIN MIG_ADRESSE C
         ON C.MIG_ID_ADRESSE = B.MIG_ID_ADRESSE
      INNER JOIN MIG_CORR_REF_ACTEUR D
         ON A.MIG_ID_ACTEUR= D.MIG_ID_ACTEUR;

QUERY 2:

SELECT A.MIG_ID_ACTEUR, A.FL_FACTURE_FSL , B.VAL_NOM, B.VAL_PRENOM, 
       C.VAL_CDPOSTAL, C.VAL_NOM_COMMUNE, D.CCB_ID_ACTEUR
  FROM MIG_FACTURE A , MIG_ACTEUR B,  MIG_ADRESSE C, MIG_CORR_REF_ACTEUR D
  WHERE A.MIG_ID_ACTEUR= B.MIG_ID_ACTEUR
       AND C.MIG_ID_ADRESSE = B.MIG_ID_ADRESSE
       AND A.MIG_ID_ACTEUR= D.MIG_ID_ACTEUR;

2 个答案:

答案 0 :(得分:4)

如果您询问使用SQL 99连接语法(a inner join b)是否更有效,或者使用较早的连接语法来更有效地列出WHERE中的连接谓词条款,这不重要。我希望这两个查询的查询计划是相同的。如果查询计划相同,则性能将相同。如果计划不相同,那通常意味着您在数据库的查询解析引擎中遇到了错误。

就个人而言,我使用SQL 99语法(查询1),因为当你想要进行外连接时它更具可移植性,并且因为它通常使查询更具可读性并降低你的概率。 ; ll意外地忽略了连接条件。但这仅仅是一种可读性和可维护性考虑因素,而不是性能考虑因素。

答案 1 :(得分:2)

首先要做的事情:

"我使用了计时器但结果太近了#34; - 这实际上不是测试性能的好方法。数据库有缓存。你得到的结果不会与秒表相媲美。你有系统负载来应对,缓存和其他一百万个让这种特殊比较变得毫无价值的东西。而不是那样,尝试使用EXPLAIN来计算执行计划。使用SHOW PROFILES和SHOW STATUS查看查询在何处以及如何花费时间。检查last_query_cost。但是不要检查你的秒表。那不会告诉你什么。

第二:这个问题无法通过您提供的信息得到解答。事实上,查询是相同的(使用Explain验证)并简单地归结为隐式和显式连接。但是,它们中的任何一个都没有被优化。同样,您需要深入了解连接本身,看看它是否正在使用索引,或者它是否正在进行大量的临时表或文件排序。

优化查询是件好事......但这两者是相同的。秒表不会帮助你。使用说明,显示配置文件,显示状态....而不是秒表: - )