日期:2014-05-18  浏览次数:20531 次

多表查询效率
比如说A,B,C,。。。
SELECT .. FROM
A,
B,
C,
。。。
WHERE 
A.xx=B.xx AND
B.xx=C.xx AND
...

SELECT ...
FROM
A INNER JOIN B ON A.xx=B.xx.... INNER JOIN C ON B.xx=C.xx ...
这样的查询效率有什么区别,然后就是多表查询(一般6个左右的表)联合查询时如何查询效率更高?比如6个表中有2个表的数据在几百W,其他的几个表数据只有几W行。

------解决方案--------------------
是等价的。但是执行的顺序不是一样的,具体分析看一下资料:

SQL code

SQL Select语句完整的执行顺序: 

1、from子句组装来自不同数据源的数据; 
2、where子句基于指定的条件对记录行进行筛选; 
3、group by子句将数据划分为多个分组; 
4、使用聚集函数进行计算; 
5、使用having子句筛选分组; 
6、计算所有的表达式; 
7、使用order by对结果集进行排序。 


另外:一个查询语句各个部分的执行顺序: 
--8)  SELECT (9) DISTINCT (11) <TOP_specification> <select_list> 
--(1)  FROM <left_table> 
--(3)    <join_type> JOIN <right_table> 
--(2)      ON <join_condition> 
--(4)  WHERE <where_condition> 
--(5)  GROUP BY <group_by_list> 
--(6)  WITH {CUBE | ROLLUP} 
--(7)  HAVING <having_condition> 
--(10) ORDER BY <order_by_list> 

对where,group by,order by 字段加索引,还有就是合理的语句,尽量避免一些复杂的计算

------解决方案--------------------
当然了解SQL执行顺序很有必要,在这个基础上,针对大数据量多表间关联时,
可以考虑SQL CTE的形式,及临时表。
CTE:
SQL code

;with A as(
  select t1.*,t2.xxx,t3.yyyy
  from t1
  inner join t2
   on t1.x=t2.x 
  inner join t3
   on t1.y=t3.y
),B as(
  select t4.yyyy,t4.ZZZZZ
  from t4
)
select A.*,B.ZZZZZ
from A
inner join B
 on A.yyyy=B.yyyy