按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
引内容 也就是说索引只有在你所要找的数据只在表中所占比率很小的时候才会非常地有
效 通常不会超过表中全部数据量的 10%到 15%
此外 最好在大型表中使用索引 当你设计表和索引的时候你要考虑表的大小 合适
的索引应该是建立在对数据的熟悉上 知道那一列数据是最经常引用的 如果想让索引工
作得好你需要做一些试验
注 当说到 大表 的时候 这里的大是相对而言的 一个表比某个表相比可以说很大
而它与另一个表相比时却又很小 表的大小的概念是与数据库中其它表的大小 可用
的磁盘空间 可用的磁盘的数量以及类似的因素相关的 很明显 2GB 的表很大而 16KB
的表是小的 如果一个数据库中表的平均大小是 100MB 那么一个 500MB 的表就是
大的
310
…………………………………………………………Page 311……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
加入一个新的索引
你经常会发现一些 SQL 语句运行的时间长得不合情理 尽管其它的语句运行的性能看
起来是可以接受的 例如 当数据的检索条件改变或表的结构改变以后
当我们加入一个 WINDOWS 的应用前端时我们也会发现速度的下降 对于这种情况你
首先要检查的是所用的目标表是否存在索引 然后大多数情况下我们会发现表是有索引的
但是在 WHERE 子句中所使用的新条件没有索引 看一下 SQL 语句中的 WHERE 子句 我
们要问的是 是否可以加入其它的索引 如果是在下列条件下 那么答案是肯定的
l 最大的限制条件返回表的数据库小于表总数据量的 10%
l 最大的限制条件在 SQL 语句中是经常使用的
l 条件列的索相将会返回一个唯一的值
l 列经常被 ORDER BY 或 GROUP BY 子句所引用
也可以使用复合索引 复合索引是基于表中两个或更多列的索引 如果在 SQL 语句中
经常将两列一起使用时这种索引会比单列索引更有效 如果在一起的索引列经常是分开使
用的 特别是在其它的查询中 那么单列索引则是更合适的 所以你要经过试验来判断在
你的数据库中使用哪一种索引会是更合适的
在查询中各个元素的布局
在你的查询中最好的元素布局 尤其是在 WHERE 子句中 是根据解释器处理 SQL 语
句的步骤和次序而定的 在条件中安排被索引过的列 这样的条件将会查找最少的记录
你不一定非要在 WHERE 子句中使用已经被索引过的列 但是显然这样做会更有效
试着调整 SQL 语句以使它返回的记录数最少 在一个表中返回记录数最少的条件就是最大
的限制条件 在通常的语句中 你应该把最大的条件限制语句放在 WHERE 子句的最后
ORACLE 查询优化会对 WHERE 子句从后向前读 所以它会最先处理我们放置的条件语
句
当优化器首先读到最大条件限制语句以后 它就将为以后的条件所提供的结果集缩减
至最小了 下一个条件将不再搜索整个表 而是搜索经过最大条件限制过的子集 所以
数据的返回就会更快 在复杂查询中的多个查询 子查询 计算以及使用逻辑条件 AND
OR NOT 中最大限制条件可能并不清晰
311
…………………………………………………………Page 312……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
技巧 请查看你的数据库文档资料 看一看解释器是如何处理你的 SQL 语句的
下边的测试是我们对用两种不同的方法来查询相同的内容所耗用时间的差异 该例子
使用 ORACLE 7 关系数据库系统 切记 在解释器中的优化是从后向前进行的
在创造一个 SELECT 语句之前 对于每一个条件我们都选择了独立的行 下边是不同
的条件给出的数值
Condition Distinct Values
calc_ytd = '…2109490。8' 13;000 +
dt_stmp = '01…SEP…96' 15
output_cd = '001' 13
activity_cd = 'IN' 10
status_cd = 'A' 4
function_cd = '060' 6
注 最大限制条件就是最显著的值
下边的例子中在 WHERE 子句中使用了最大限制条件放在最前
INPUT
SQL》 SET TIMING ON
2 SELECT COUNT(*)
3 FROM FACT_TABLE
4 WHERE CALC_YTD = '…2109490。8'
5 AND DT_STMP = '01…SEP…96'
6 AND OUTPUT_CD = '001'
7 AND ACTIVITY_CD = 'IN'
8 AND STATUS_CD = 'A'
9 AND FUNCTION_CD = '060';
OUTPUT
COUNT(*)
8
1 row selected。
Elapsed: 00:00:15。37
INPUT/OUTPUT
312
…………………………………………………………Page 313……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SQL》 SET TIMING ON
2 SELECT COUNT(*)
3 FROM FACT_TABLE
4 WHERE FUNCTION_CD = '060'
5 AND STATUS_CD = 'A'
6 AND ACTIVITY_CD = 'IN'
7 AND OUTPUT_CD = '001'
8 AND DT_STMP = '01…SEP…96'
9 AND CALC_YTD = '…2109490。8';
OUTPUT
COUNT(*)
8
1 row selected。
Elapsed: 00:00:01。80
分析
注意所使用的时间的不同 只要简单地改变所给出的统计的次序 第二个查询比第一
个查询快了 14 秒 那么可以设想一下当查询的结构设计不好的时候耗用几个小时的情形
过程
如果所使用的查询有规律可循 那么你可以试着使用过程 过程可以调用很大的一组
SQL 的语句 参见第 13 天 高级 SQL 主题
过程是被数据库的引擎编译后运行的 与 SQL 语句不同 数据库引擎在执行过程的时
候不需要进行优化 过程相对于独立的多个 SQL 语句 它对于用户来说更容易使用而对于
数据库来说更为有效
避免使用 OR
如果可能的话应该在查询尽量避免使用逻辑操作符 OR