SQL1:
SELECT HOS.HOSPITAL_NAME, DEP.DEPARTMENT_NAME
  FROM RELEASEHOSPITALINFO HOS, RELEASEDEPARTMENTINFO DEP
WHERE HOS.HOSPITAL_ID = DEP.HOSPITAL_ID
  AND HOS.HOSPITAL_ID = '00000000008'
  AND HOS.HOSPITAL_DELETE_FLAG = '0'
  AND DEP.DEPARTMENT_DELETE_FLAG = '0'SQL2:
SELECT HOS.HOSPITAL_NAME, DEP.DEPARTMENT_NAME
  FROM RELEASEHOSPITALINFO HOS inner join RELEASEDEPARTMENTINFO DEP on HOS.HOSPITAL_ID = DEP.HOSPITAL_ID
WHERE HOS.HOSPITAL_ID = '00000000008'
  AND HOS.HOSPITAL_DELETE_FLAG = '0'
  AND DEP.DEPARTMENT_DELETE_FLAG = '0'今天SE给我review代码说是要改成第二种写法这样效率高,占用内存少,因为第一个先求了笛卡尔然后再过滤的,高手请教一下这两个sql性能上差别很大么,我平时就喜欢用第一种写法,性能差不多的话我就不想改了!

解决方案 »

  1.   

    抛砖引玉啊
    今天SE给我review代码说是要改成第二种写法这样效率高,占用内存少,因为第一个先求了笛卡尔然后再过滤的,我感觉应该是没有 WHERE 子句的交叉联接才会产生联接所涉及的表的笛卡尔积。
    效率不敢乱说,个人认为inner join的这种写法更标准一些,至于效率应该正确的选定连接的主表与从表后inner join会高一些吧。
      

  2.   

    RELEASEHOSPITALINFO HOS inner join RELEASEDEPARTMENTINFO DEP on HOS.HOSPITAL_ID = DEP.HOSPITAL_ID会生成临时表,记录数都比SQL1 大大减少了,内存占用当然就相应的小了点,再者因为记录数少,搜索时速度也快了,因此可以得出这个结论,不过实际中影响性能的因素很多,但这个切实能尽到优化的作用
      

  3.   

    使用连接(JOIN)来代替子查询(Sub-Queries)  MySQL从4.1开始支持SQL的子查询。这个技术可以使用 SELECT语句来创建一个单列的查询结果,然后把这个结果作为过滤条件用在另一个查询中。例如,我们要将客户基本信息表中没有任何订单的客户删除掉,就可以利用子查询先从销售信息表中将所有发出订单的客户ID取出来,然后将结果传递给主查询,如下所示:  DELETE FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )  使用子查询可以一次性的完成很多逻辑上需要多个步骤才能完成的SQL操作,同时也可以避免事务或者表锁死,并且写起来也很容易。但是,有些情况下,子查询可以被更有效率的连接(JOIN).. 替代。例如,假设我们要将所有没有订单记录的用户取出来,可以用下面这个查询完成:   SELECT * FROM customerinfo WHERE CustomerID NOT in (SELECT CustomerID FROM salesinfo )  如果使用连接(JOIN).. 来完成这个查询工作,速度将会快很多。尤其是当salesinfo表中对CustomerID建有索引的话,性能将会更好,查询如下:  SELECT * FROM customerinfo LEFT JOIN salesinfoON customerinfo.CustomerID=salesinfo. CustomerID WHERE salesinfo.CustomerID IS NULL  连接(JOIN).. 之所以更有效率一些,是因为 MySQL不需要在内存中创建临时表来完成这个逻辑上的需要两个步骤的查询工作。
      

  4.   

    http://database.csdn.net/page/27f8d23d-d520-44cc-98d7-5dd821e30497