2015-11-17
瞿锴
产业园
SQL
定义:高级语言,从数据库中获取数据的子集
连接
嵌套循环连接(Cross Join)
外部输入和内部输入
外部输入在100条以内时,可以选择Cross Join,左边有多少条数据,右边的数据就会扫描多少遍
合并连接(Merge Join)
双方有序,且join的条件为等于号
两边都分别只要扫描一遍
散列连接(Hash Join)
通过在内存中建立散列表实现。
比较占内存,内存不足还会占tempdb,尽量不要用散列连接。
可以手动在SQL语句中指定连接方式,但一般情况下SQL SERVER会自动选择最优的连接方式。
可通过提前筛选连接两端的数据来提升效率。
子查询
子查询可写成完全等价的关联查询
临时表和表变量
临时表可以建索引
表变量不能改结构,临时表可以
作用域不一样,临时表的作用域是会话;表变量的作用域是当前批处理
临时表存在统计信息,而表变量没有统计信息,认为表变量只有一条数据。
建议:如果行数<100,使用表变量,做分页,用临时表
公用表达式(CTE)
减少SQL的逻辑复杂度,对性能的提升并没有帮助
索引
希望参与判断的字段都在索引页(非聚集索引)上
包含性列(减少键查找),不参与排序,但在索引页上的字段
索引键:有前后顺序,方便更好更快地找到需要的数据
聚集索引只存主键,所以一张表只能有一个聚集索引。
逻辑读
物理读
预读(减少物理I/O的次数)