让SQL运行得更快的方法有哪些

介绍

本篇内容介绍了“让SQL运行得更快的方法有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

- - - - -,为了更直观地说明问题,所有实例中的SQL运行时间均经过测试,不超过1秒的均表示为(& lt;, 1秒)。

- - - - -,测试环境——
- - - - -,主机:HP  LH  II
- - - - -,主频:330 mhz
- - - - -,内存:128兆
- - - - -,操作系统:Operserver5.0.4
- - - - -数据库:Sybase11.0.3

一,不合理的索引设计
- - - - -例:表记录有620000行,试看在不同的索引下,下面几个,SQL的运行情况:
- - - - - 1。在日期上建有一非个群集索引

select  count(*),得到record  where  date 比;
& # 39; 19991201 & # 39;,以及date  & lt;, & # 39; 19991214 & # 39;以及amount 比;
2000,(25秒)
select 日期、金额(量),得到record  group  by 日期
(55秒)
select  count(*),得到record  where  date 比;
& # 39; 19990901 & # 39;,以及place 拷贝(& # 39;bj # 39; & # 39; sh # 39;),(27秒)

- - - - -,分析:
- - - - -日期上有大量的重复值,在非群集索引下,数据在物理上随机存放在数据页上,在范围查找时,必须执行一次表扫描才能找到这一范围内的全部行。

- - - - -, 2。在日期上的一个群集索引

select  count(*),得到record  where  date 比;
& # 39; 19991201 & # 39;,以及date  & lt;, & # 39; 19991214 & # 39;,以及amount 比;
2000,(14秒)
select 日期、金额(量),得到record  group  by 日期
(28秒)
select  count(*),得到record  where  date 比;
& # 39; 19990901 & # 39;,以及place 拷贝(& # 39;bj # 39; & # 39; sh # 39;)(14秒)

- - - - -,分析:
- - - - -,在群集索引下,数据在物理上按顺序在数据页上,重复值也排列在一起,因而在范围查找时,可以先找到这个范围的起末点,且只在这个范围内扫描数据页,避免了大范围扫描,提高了查询速度。

- - - - -, 3。在地方,日期,数量上的组合索引

select  count(*),得到record  where  date 比;
& # 39; 19991201 & # 39;,以及date  & lt;, & # 39; 19991214 & # 39;,以及amount 比;
2000,(26秒)
select 日期、金额(量),得到record  group  by 日期
(27秒)
select  count(*),得到record  where  date 比;
& # 39; 19990901 & # 39;,以及place 拷贝(& # 39;BJ, & # 39; sh # 39;) (& lt;, 1秒)

- - - - -,分析:
- - - - -,这是一个不很合理的组合索引,因为它的前导列是地方,第一和第二条SQL没有引用的地方,因此也没有利用上索引;第三个SQL使用了的地方,且引用的所有列都包含在组合索引中,形成了索引覆盖,所以它的速度是非常快的。

- - - - -, 4。在日期、地点、数量上的组合索引

select  count(*),得到record  where  date 比;
& # 39; 19991201 & # 39;,以及date  & lt;, & # 39; 19991214 & # 39;,以及amount 比;
2000 (& lt;, 1秒)
select 日期、金额(量),得到record  group  by 日期
(11秒)
select  count(*),得到record  where  date 比;
& # 39; 19990901 & # 39;,以及place 拷贝(& # 39;bj # 39; & # 39; sh # 39;) (& lt;, 1秒)

- - - - -,分析:
- - - - -,这是一个合理的组合索引。它将日期作为前导列,使每个SQL都可以利用索引,并且在第一和第三个SQL中形成了索引覆盖,因而性能达到了最优。

- - - - -, 5。总结:

- - - - -,缺省情况下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要建立在对各种查询的分析和预测上。一般来说:

- - - - -,①。有大量重复值,且经常有范围查询

(之间,祝辞,& lt;,,祝辞=& lt;,=)和order 
, group 通过发生的列,可考虑建立群集索引;

- - - - -,②。经常同时存取多列,且每列都含有重复值可考虑建立组合索引;

- - - - -,③。组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。

二,不充份的连接条件:
- - - - -,例:表卡有7896行,在card_no上有一个非聚集索引,表帐户有191122行,在,account_no上有一个非聚集索引,试看在不同的表连接条件下,两个SQL的执行情况:

select 和(a.amount),得到account ,
card  b  where  a.card_no  b=,。card_no(20秒)

让SQL运行得更快的方法有哪些