按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
INPUT/OUTPUT
SQL》 SELECT * FROM BILLS ORDER BY ACCOUNT_ID;
NAME AMOUNT ACCOUNT_ID
Phone pany 125 1
Power pany 75 1
Software pany 250 1
Florida Water pany 20 1
Record Club 25 2
Cable TV pany 35 3
Debtor's Credit Card 35 4
Joe's Car Palace 350 5
U…O…Us Insurance pany 125 5
S。C。 Student Loan 200 6
分析
它与使用 ID_INDEX 语句的结果是一样的 不同之处在于当你使用 ORDER BY 子句
时每次运行它都需要重新进行排序 而当你使用索引的时候 数据库会建立一个物理索引
对象 就是前边提到的树结构 而在你每次运行查询时都访问同一个索引
警告 当表被删除时 所有与表相关的索引也将被删除
213
…………………………………………………………Page 214……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
使用索引的技巧
这里给出了几个在使用索引时需要记住的技巧
l 对于小表来说 使用索引对于性能不会有任何提高
l 当你的索引列中有极多的不同的数据和空值时索引会使性能有极大的提高
l 当查询要返回的数据很少时索引可以优化你的查询 比较好的情况是少于全部数据的
25% 如果你要返回的数据很多时索引会加大系统开销
l 索引可以提高数据的返回速度 但是它使得数据的更新操作变慢 在对记录和索引进
行更新时请不要忘记这一点 如果要进行大量的更新操作 在你执行更新操作时请不
要忘记先删除索引 当执行完更新操作后 只需要简单的恢复索引即可 对于一次特
定的操作 系统可以保存删除的索引 18 个小时 在这个时间内数据更新完后你可以恢
复它
l 索引会占用你的数据库的空间 如果你的数据库管理系统允许你管理数据库的磁盘空
间 那么在设计数据库的可用空间时要考虑索引所占用的空间
l 对字段的索引已经对两个表进行了归并操作 这一技术可以极大地提高归并的速度
l 大多数数据库系统不允许你对视图创建索引 如果你的数据库系统允许这样做 那么
可以使用这种方法来在 SELECT 语句中对视图的数据进行排序 很不巧 一些数据库
系统中也不允许在视图中使用 ORDERY BY 子句
l 不要创建对经常需要更新或修改的字段创建索引 更新索引的开销会降低你所期望获
得的性能
l 不要将索引与表存储在同一个驱动器上 分开存储会去掉访问的冲突从而使结果返回
得更快
对更多的字段进行索引
SQL 也允许你对多个字段进行索引 这种索引被称为复合索引 下边的代码是一个简
单的复合索引的例子 注意虽然是对两个字段进行索引 但索引在物理结构上只有一个
INPUT/OUTPUT
SQL》 CREATE INDEX ID_CMPD_INDEX ON BILLS( ACCOUNT_ID; AMOUNT );
Index created。
214
…………………………………………………………Page 215……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SQL》 SELECT * FROM BILLS;
NAME AMOUNT ACCOUNT_ID
Florida Water pany 20 1
Power pany 75 1
Phone pany 125 1
Software pany 250 1
Record Club 25 2
Cable TV pany 35 3
Debtor's Credit Card 35 4
U…O…Us Insurance pany 125 5
Joe's Car Palace 350 5
S。C。 Student Loan 200 6
SQL》 DROP INDEX ID_CMPD_INDEX
Index dropped。
分析
选择唯一值最多的列建立索引可以达到你所希望的性能 例如 在 BILLS 表中 NAME
字段中的每一个值都是唯一的 当使用复合索引时 要把最可能选择的字段放在前边 也
就是说 把你最经常在查询中使用是字段放在最前边 在 CREATE INDEX 中列的出现次
序不必与表中的次序一致 如果你经常使用下边的语句
SQL》 SELECT * FROM BILLS WHERE NAME = 〃Cable TV pany〃;
为了想达到所期望的性能 你必须在索引中将 NAME 字段放在第一位 这里有两个例
子
SQL》 CREATE INDEX NAME_INDEX ON BILLS NAME; AMOUNT
或
SQL》 CREATE INDEX NAME_INDEX ON BILLS NAME
在这两个例子中 NAME 都在索引字段的最左边 所以这两个索引可以提高对 NAME
的查询的性能
复合索引也可以根据他们自己的选择性来对两个以上的字段进行索引 作为一个选择
性的例子 请看一下下边的这个表
ACCOUNT_ID TYPE BALANCE BANK
1 Checking 500 First Federal
2 Money Market 1200 First Investor's
215
…………………………………………………………Page 216……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
ACCOUNT_ID TYPE BALANCE BANK
3 Checking 90 Credit Union
4 Savings 400 First Federal
5 Checking 2500 Second Mutual
6 Business 4500 Fidelity
请注意输出的六个记录 checking 值在这里出现了三次 所以它的选择性要低于
ACCOUUNT_ID 请注意 每一个 ACCOUNT_ID 的值都是唯一的 要想提高你的索引的
选择性 你可以将 TYPE 字段与 ACCOUNT_ID 字段组合在一起建立一个索引 这将将创
建一个唯一的索引值 当然 这也是你所能得到的最高的选择性
注 一个索引可以包含多个列通常是指复合索引 复合索引的性能与单个字段的索引相比
是无法断定的 以 ORACLE 为例 如果你在查询条件中经常指定某一特定的列那个你
可以创建这个列的索引 而当你的查询需要复合条件时你可以创建复合索引 当创建
多个索引的时候你需要参考你所选定的解释器的帮助信息以从中得到确定的复合索引
的用法
在创建索引时使用 UNIQUE 关键字
复合索引通常使用 UNIQUE 关键字来防止有相同数据的多个记录多次出现 例如 如
果你想要 BILLS 表具有下边的规则 每一个账单的交付公司都必须有不同的银行账号 你
需要创建一个包括 NAME 和 ACCOUNT_ID 的唯一索引 不幸的是 ORACLE7 不支持
UNIQUE 语法 它是用 UNIQUE 完整性约束来达到内容唯一这一特性的 下边的例子中给
出了在 Sybase 的Transact…SQL 语言中 UNIQUE 关键字的用法
INPUT
1》 create unique index unique_id_name
2》 on BILLS(ACCOUNT_ID; NAME)
3》 go
1》 select * from BILLS
2》 go
OUTPUT
NAME AMOUNT ACCOUNT_ID
Florida Water pany 20 1
216
…………………………………………………………Page 217……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
NAME AMOUNT ACCOUNT_ID
Power pany 75 1
Phone pany 125 1
Software pany 250 1
Record Club 25 2
Cable TV pany 35 3
Debtor's Credit