①:
情况 | 优化方法 |
子查询返回的值与外部查询的每行相同 | 在查询之前,声明一个变量,然后选择需要的值赋给这个变量。这样查询只执行一次,而不是在外部表的每个记录都执行一次。 |
两个表都相对较小(比如说不超过一万个记录) | 使用子查询。 |
在考虑所有标准以后,匹配只会返回一个值 | 子查询 |
在考虑所有查询后,匹配只返回很少的值,在查询列中没有没有索引 | 子查询。单个的查表或者查表几次的开销通常比连接的开销少 |
查询的表相对很小,但是基表很大 | 大部分情况下选择连接。 如果可能的话使用嵌套查询,其次是连接,最后是互相关联的子查询。 子查询只查表一次,而采用相互关联的子查询时,需要循环查表多次。 |
相互关联的子查询与连接相比 | 选择连接。 相互关联的子查询比指针更快,但是比其他的可选方案都慢 |
派生表和其他可选方案 | 派生表通常需要很大的开销,派生表运行一次,然后驻留内存,打部分开销用于初始创建,且没有索引。可能很快也可能很慢,视情况而定。 |
EXISTS 和其他可选方案 | 选择 EXISTS 。 例外:派生表的速度是比使用 EXISTS 快一倍,但是其初始化的开销很大 |
②:使用派生数据。比如使用计算列,因为读入 WHERE totalPrice > $100 的查询比 WHERE qty*unitPrice>50 的查询快得多,特别是可以索引计算得到 totalPrice 时。
③:在何处以及何时使用何种索引:
1。索引,特别是 非群集索引 ,主要在索引内有合理的选择性的情况下是有益的。某列中唯一值所占的百分比越高,越应该选择此列建立索引,且由此建立的索引的益处越大。
2。索引在读取数据时刻提高性能,但是在修改数据时(插、删、改),其开销很大。
3.群集索引。当使用范围查询比较频繁时,群集索引是最好的方法。比如使用较多的 BETWEEN、OR、GROUP BY、MAX、MIN、COUNT等。当想要数据基于 群集键 使用 “ORDER BY” 时,效率也很高。
PS:另一篇关于数据库访问性能优化的文章:http://blog.csdn.net/yzsind/archive/2010/12/06/6059209.aspx