友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第31部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 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 Credit Card 35 400
Joe's Car Palace 350 2500
U…O…Us Insurance pany 125 2500
S。C。 Student Loan 200 4500
分析
这个例子中首次在相关的表中为 ACCOUNT_ID 字段创建了索引 在每一个表中均对
ACCOUNT_ID 字段创建了索引以后 归并就可以更快地访问特定行的数据 作为一个规
则 你应该对表中的唯一属性的字段或你用以归并操作的字段来创建索引
群集 簇 的使用
尽管在开始的时候我们曾经说过索引只是提供给用户的一种与数据的物理存在不同的
查看方式 但是这话并不是绝对的 在许多数据管理系统中都支持一种特殊的 可以允许
数据库管理员或开发人员对数据进行群集的索引 当使用群集索引时 数据在表中的物理
排列方式将会被修改 使用群集索引通常比传统的不使用群集的索引速度要快 但是 许
多数据库管理系统 如 Sybase 的SQL Server 只允许一个表有一个群集索引 用于创建群
集索引的字段常常是主关键字 用 Sybase 的 Transact…SQL 你可以对 BANK_ACCOUNT 的
ACCOUNT_ID 字段创建一个群集的 不重复的索引 语法如下
SYNTAX
create unique clustered index id_index on BANK_ACCOUNTS(ACCOUNT_ID)
go
ORACLE 中群集的概念与此不同 当使用 ORACLE 关系数据库系统时 群集就是一
个像数据或表一样的对象 群集一般是存储了表的共有字段以提高对表的访问速度
这是一个 ORACLE7 中创建群集的例子
219
…………………………………………………………Page 220……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
SYNTAX
CREATE CLUSTER 'schema。'cluster (column datatype ';column datatype' 。。。 )
'PCTUSED integer' 'PCTFREE integer' 'SIZE integer 'K|M' '
'INITRANS integer' 'MAXTRANS integer' 'TABLESPACE tablespace'
'STORAGE storage_clause' '!!under!!INDEX | 'HASH IS column' HASHKEYS integer'
你随后创建的其于该表的群集的索引会被加入到群集中 然后把表也加入群集中 你
应该只将经常需要归并的表加入到群集 不要向群集中加入只需要用简单的 SELECT 语句
进行个别访问的表
很明显 群集是 SQL 的第三方特性 所以我们不准备详细地讨论创建和使用它的语法
的细节问题 但是 你要查看你的数据库系统的文档看它是否支持这一有用的特性
总结
视图是一种虚表 视图是提供给用户的数据与其在数据库的真实面貌不相同的一种方
法 CREATE VIEW 语法的语法使用了标准的 SELECT 语法来创建了一个视图 除了一些
小差别 你可以将视图视为一个常规的表来执行插入 删除 更新和选择操作 我们也简
要地提到了视图是实现数据库安全的一种重要方法 有关数据的安全性将在第 12 天作更详
细的讨论
基本的创建视图的语法如下
CREATE VIEW view_name AS SELECT field_name(s) FROM table_name(s)
视图主要用于以下方面
l 提高用户数据的安全性
l 进行单位换算
l 创建一个新格式的虚表
l 使复杂查询的构筑简单化
索引也是一种数据库设计和 SQL 编程的工具 索引是一种存储在你的数据库管理系统
中的物理对象 它可以让你的查询更快地从数据库中返回数据 此外 索引是可以定制的
正确地在查询中使用索引可以使性能显著地提高
创建索引的基本语法如下
CREATE INDEX index_name ON table_name field_name s
220
…………………………………………………………Page 221……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
在一些数据库系统中提供了一些非常有用的如 UNIQUE 和 CLUSTER 关键字附加选
项
问与答
问 如果数据已经在我的数据库中进行了排序 我是否还有必须在表中使用索引
答 索引通过在树结构中查找关键值而提高你的数据库查询性能 它比对数据库的顺序访
问方式快得多 记住 SQL 不需要知道你的数据库是否已经进行了排序
问 我可以创建一个包括多个表中字段的索引吗
答 你不能 但是 以 ORACLE 为例 它允许你创建一个群集 你可以将表放入群集中以
根据表的共有字段创建一个群集索引 这是它的一个例外 所有你应该查看你所使用
的解释器的文档以找到这方法的详细解答
校练场
1 当在一个不唯一的字段中创建一个唯一值索引会有什么结果
2 下边的话是对是错
视图和索引都会占用数据库的空间 所以在设计数据库空间时要考虑到这一点
如果一个从更新了一个已经创建视图的表 那么视图必须进行同样的更新才会看到相同
的数据
如果你的磁盘空间够而你想加快你的查询的速度 那么索引越多越好
3 下边的 CREATE 语句是否正确
SQL》 create view credit_debts as (select all from debts where account_id = 4)
4 下边的 CREATE 语句是否正确
SQL》 create unique view debts as select * from debts_tbl
5 下边的 CREATE 语句是否正确
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!