SQL优化(待完善)
1.笛卡尔积(Cartesian product)
顾名思义, 这个概念得名于笛卡儿. 在数学中,两个集合 X 和 Y 的笛卡儿积(Cartesian product),又称直积,表示为 X × Y,是其第一个对象是 X 的成员而第二个对象是 Y 的一个成员的所有可能的有序对.
假设集合A={a,b},集合B={0,1,2},则两个集合的笛卡尔积为{(a,0),(a,1),(a,2),(b,0),(b,1), (b,2)}。可以扩展到多个集合的情况。类似的例子有,如果A表示某学校学生的集合,B表示该学校所有课程的集合,则A与B的笛卡尔积表示所有可能的选课情况。
2.Join类型
cross join 是笛卡儿乘积就是一张表的行数乘以另一张表的行数.
inner join 只返回两张表连接列的匹配项.
left join 第一张表的连接列在第二张表中没有匹配是,第二张表中的值返回null.
right join 第二张表的连接列在第一张表中没有匹配是,第一张表中的值返回null.
full join 返回两张表中的行 left join+right join.
3.在对两表进行各种类型的join (cross, left, right, full, inner)时, 都需要构造笛卡尔积.
有时想想不可思议, 若两个特大表进行join, 难道sql就直接上笛卡尔积吗? 难道不事前进行on的条件过滤吗? 那数据量得多大?
4.查一下MSDN就清楚了整个SQL的执行顺序.
http://msdn.microsoft.com/en-us/library/ms189499(v=SQL.100).aspx
Processing Order of the SELECT statement
The following steps show the processing order for a SELECT statement.
1.FROM
2.ON
3.JOIN
4.WHERE
5.GROUP BY
6.WITH CUBE or WITH ROLLUP
7.HAVING
8.SELECT
9.DISTINCT
10.ORDER BY
11.TOP
也就是说, 先进行on的过滤, 而后才进行join, 这样就避免了两个大表产生全部数据的笛卡尔积的庞大数据.
更多相关文章
- 找到另一个列至少有两个不同值的id
- 如何在函数中将两个参数从1个类传递给另一个?
- 【android】两个view共用同一个animation对象的问题
- 昨天花了两个小时做了一个天气预报的Demo,希望对新人有所帮助。
- 在不同状态下使用两个图像切换按钮
- 安卓,如何让两个按钮相邻,宽度相同
- 算法 - 给出一个字符串str,输出包含两个字符串str的最短字符串,如
- 是否可以在两个类之间使用RMI双向?
- 怎么用java 实现两个web service之间调用各自的接口 实现数据的