sqlserver 临时表和表变量,也是存在物理文件上的,会产生I/O,如果条件不够,建议把 temdb放到高速I/O的硬盘上
长sql,select * 肯定会影响速度也会占带宽
数据的最小单位是页,sqlserver页的容量是8k,小表一页可以放更多的行,大表一页只能放较少的行,跨页查询会影响性能,所以列数效多的表,查询速度肯定不如列数效少的表。
索引是的原理相当于分叉树,如果完全不重复的列,用索引效率最高,相反,如果重复数据很多的列,用索引可能还不如全表扫描。
如果一个列有99%的数据是男,1%的数据是女,如果这个列是搜女,那么非常快,如果这个列是搜男,就可能比不加索引还慢。
有时候,我们要看业务,如果是搜女的多,那么就加索引,就牺牲搜男的业务。
sql永远是先搜内存,如果内存没有,会去硬盘加载数据到内存,再去内存取。
count(1) 统计第一列,非null的行数
如果有索引在一个列上,最好非null
In语句的用Inner join实现
语句如果union了,可去掉distinct,提高性能 例如:
Select distinct * from A
Union
Select distinct * from B
用ef,linq to sql拼成的sql语句,会因为兼容性,容错性,扩展性这类的原因,生成一堆无用的语句,这些语句很容易不命中索引。
组合索引 重复低的放前面,重复高的放后面
利用set statistics io on 进行调优
on 列 include (列2,列3)
将列2,列3的数据加载到索引列上,查这两列,可以不用读原表
join时 on在关联时查,where在关联后查
利用好文件组
如果所有表都在一个文件里(mdf),那么文件扩容的概率就会很大,这样就会修改头文件,就会造成等持
有时候我们为了拼sql之类的事情,会把一些东西拼到一个临时表,然后再join这个表,在on里面进行条件查询
这有可能会有性能问题
在尝试中,执行计划里,就算你临时表中就一条数据,查描这个表,构建这个表都会有比较大的性能开销。这个问题有待研究。