SQL 21日自学通(V3.0)(PDF格式)-第46部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
定的操作 系统可以保存删除的索引 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 Card 35 4
U…O…Us Insurance pany 125 5
Joe's Car Palace 350 5
S。C。 Student Loan 200 6
现在 我们试着向表中插入一个已经存在的记录
INPUT
1》 insert BILLS (NAME; AMOUNT; ACCOUNT_ID)
2》 values(〃Power pany〃; 125; 1)
3》 go
分析
你会收到了个错误信息告诉你插入操作是不允许的 这个错误可以为应用程序所捕获
从而告知用户他插入了一个不合法的数据
例 10。3
在 BILLS 表中创建一个索引以对 AMOUNT 字段进行降序排列
INPUT/OUTPUT
SQL》 CREATE INDEX DESC_AMOUNT
ON BILLS(AMOUNT DESC);
Index created。
分析
这是我们第一次使用 DESC 操作 它将告诉 SQL 将索引降序排列 通常情况下是升序
排列 现在来看一下结果
INPUT/OUTPUT
SQL》 SELECT * FROM BILLS;
NAME AMOUNT ACCOUNT_ID
Joe's Car Palace 350 5
Software pany 250 1
217
…………………………………………………………Page 218……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
NAME AMOUNT ACCOUNT_ID
S。C。 Student Loan 200 6
Phone pany 125 1
U…O…Us Insurance pany 125 5
Power pany 75 1
Cable TV pany 35 3
Debtor's Credit Card 35 4
Record Club 25 2
Florida Water pany 20 1
分析
这个例子对 AMOUNT 列使用 DESO 操作创建了一个索引 注意输出的顺序是从大到
小
索引与归并
当在查询中使用了复杂的归并时 你的 SELECT 语句会耗用很长的时间 对于大表来
说 所用的时间可能会达到好几秒钟 与你通常需要等待几毫秒相对比 这样的性能在客
户机/服务器环境中常会令你的用户对使用你的应用程序感到不耐烦 在归并时对字段创建
索引可以显著地提高你的查询反映速度 但是 如果你创建太多的索引 就会使你的系统
的性能下降而不是提高 我们推荐你在几个大表中进行索引试验 对数以千计的数据排序
这样的试验可以让你更深入地理解 SQL 查询的优化
注 大多数的解释器有捕获查询耗用时间的机制 ORACLE 将这种特性称为 timing 请察
看你所使用的解释器的相关信息
下边的例子对 BILS 表与 BANK_ACCOUNT 表根据 ACCOUNT_ID 字段创建了索引
INPUT/OUTPUT
SQL》 CREATE INDEX BILLS_INDEX ON BILLS(ACCOUNT_ID);
Index created。
SQL》 CREATE INDEX BILLS_INDEX2 ON BANK_ACCOUNTS(ACCOUNT_ID);
Index created。
SQL》 SELECT BILLS。NAME NAME; BILLS。AMOUNT AMOUNT;
BANK_ACCOUNTS。BALANCE ACCOUNT_BALANCE
FROM BILLS; BANK_ACCOUNTS
218
…………………………………………………………Page 219……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
WHERE BILLS。ACCOUNT_ID = BANK_ACCOUNTS。ACCOUNT_ID
NAME AMOUNT ACCOUNT_BALANCE
Phone pany 125 500
Power pany 75 500
Software pany 250 500
Florida Water pany 20 500
Record Club 25 1200
Cable TV pany 35 90
Debtor's Cred