友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!
SQL 21日自学通(V3.0)(PDF格式)-第41部分
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部! 如果本书没有阅读完,想下次继续接着阅读,可使用上方 "收藏到我的浏览器" 功能 和 "加入书签" 功能!
表的原因 虚体也使用了相同的逻辑
使用索引
使用索引是另外一种让数据提供给用户的形式与它在数据库中不同的方法 此外 索
引可以让存储于磁盘上的数据进行重新排序 这是一些视图不具有的功能
在 SQL 中使用索引是其于以下几个原因
l 在使用 UNIQUE 关键字时强制性地保证数据的完整性
l 可以容易地用索引字段或其它字段进行排序
l 提高查询的执行速度
什么是索引
可以用两种方法从数据库中获得数据 第一种方法常被称为顺序访问方式 它需要 SQL
检查每一个记录以找到与之相匹配的 这种查找的方法效率很低 但它是使记录准确定位
的唯一方法 回想一下以前图书馆的卡片档案系统 假设卡片是按字母的顺序排列的 那
209
…………………………………………………………Page 210……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
么在将它们抽出来后在放回卡片柜时 那么当你来到书柜的旁边以后 那么你只能从头开
始 然后一张卡片一张卡片地看 直到找到你所需要的 当然 也许你碰巧很快就找到了
现在假设图书管理员将书的标题按字母顺序排列 那么通过查看目录中的书的字母顺
序你可以很快地找到你想要的书
进一步设想如果管理员非常勤劳 他不但将书按标题进行了排序 而且还另外制作了
不同的卡片柜 在那个卡片柜中他是按照作者的名字或其他的方式进行排序的 那么这对
于你 一个图书馆的读者来说检索信息就有了相当大的灵活性 而且你只需要很短的时间
就能找到你所需要的内容
在数据库中使用索引可以让 SQL 使用直接访问方式 SQL 采用树形结构来存储和返回
索引数据 用以指示的数据存储在树的最末端 也就是叶子 它们被称为结点 也可以叫
叶子 每一个结点中有一个指向其它结点的指针 结点左边的值只是它的双亲结点 结点
右边的值则是孩子结点或叶子
SQL 将从根结点开始直到找到所需要的数据
注 当查询没有使用索引的表时查询通常是全表搜索后才会得到结果 全表搜索会让数据
库服务程序遍历过表中的所有记录然后返回给定条件的记录 这种方法就好比从图书
馆的第一号书架的第一本书找起 直到找到了你所需要的书一样 你或许会使用卡片
柜以更快地找到所需的书 索引可以让数据库服务程序快速地定位到表中的确定行
幸运的是这个树结构不需要由你来制作 你甚至不必去写从数据库的表中存储和读的
过程 基本的 SQL 索引的语法形式如下
INPUT/OUTPUT
SQL》 CREATE INDEX index_name
2 ON table_name(column_name1; 'column_name2'; 。。。)
像你以前多次看到的那样 索引的语法对于不同的数据库系统差别很大 例如 CREATE
INDEX 语句在 ORACLE7 中的形式如下
SYNTAX
CREATE INDEX 'schema。'index
ON { 'schema。'table (column '!!under!!ASC|DESC'
'; column '!!under!!ASC|DESC'' 。。。)
| CLUSTER 'schema。'cluster }
210
…………………………………………………………Page 211……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
'INITRANS integer' 'MAXTRANS integer'
'TABLESPACE tablespace'
'STORAGE storage_clause'
'PCTFREE integer'
'NOSORT'
而它在 Sybase SQL Server 中的语法形式则如下
SYNTAX
create 'unique' 'clustered | nonclustered'
index index_name
on ''database。'owner。'table_name (column_name
'; column_name'。。。)
'with {fillfactor = x; ignore_dup_key; sorted_data;
'ignore_dup_row | allow_dup_row'}'
'on segment_name'
Informix SQL 解释器的命令形式则如下
SYNTAX
CREATE 'UNIQUE | DISTINCT' 'CLUSTER' INDEX index_name
ON table_name (column_name 'ASC | DESC';
column_name 'ASC | DESC'。。。)
注意到所有这些解释器有几点是相同的 它们的基本开始语句都是
CREATE INDEX index_name ON table_name (column_name; 。。。)
SQL Server 和 ORACLE 允许你创建成簇的索引 这将在稍后讨论 ORACLE 和 Informix
允许你指明列名是按升序排列还是按降序排列 我们不喜欢听到被打断的声音 但是请再
一次 参考你的数据库管理系统以得到明确的关于 CREATE INDEX 的指示
例如 要对 BILLS 表中的 ACCOUNTID 字段创建索引 其 CREATE INDEX 语句如下
INPUT
SQL》 SELECT * FROM BILLS
OUTPUT
211
…………………………………………………………Page 212……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
NAME AMOUNT ACCOUNT_ID
Phone pany 125 1
Power pany 75 1
Record Club 25 2
Software pany 250 1
Cable TV pany 35 3
Joe's Car Palace 350 5
S。C。 Student Loan 200 6
Florida Water pany 20 1
U…O…Us Insurance pany 125 5
Debtor's Credit Card 35 4
INPUT/OUTPUT
SQL》 CREATE INDEX ID_INDEX ON BILLS( ACCOUNT_ID );
SQL》 SELECT * FROM BILLS
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
直至索引被 DROP INDEX 语句删除之前 BILLS 表是按照 ACCOUNT_ID 的顺序进行
排序的 DROP INDEX 语句是非常清楚的
SYNTAX
SQL》 DROP INDEX index_name;
当索引被删除以后的结果是什么样呢
INPUT/OUTPUT
SQL》 DROP INDEX ID_INDEX
Index dropped。
SQL》 SELECT * FROM BILLS
212
…………………………………………………………Page 213……………………………………………………………
SQL 21 日自学通(V1。0) 翻译人 笨猪
NAME AMOUNT ACCOUNT_ID
Phone pany 125 1
Power pany 75 1
Record Club 25 2
Software pany 250 1
Cable TV pany 35 3
Joe's Car Palace 350 5
S。C。 Student Loan 200 6
Florida Water pany 20 1
U…O…Us Insurance pany 125 5
Debtor's Credit Card 35 4
分析
现在的 BILLS 表是它原本的形态 使用索引不会对表中的物理存储造成影响
你也许想知道为什么数据库提供了索引而又允许你使用 ORDER BY 子句吧
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。
快捷操作: 按键盘上方向键 ← 或 → 可快速上下翻页 按键盘上的 Enter 键可回到本书目录页 按键盘上方向键 ↑ 可回到本页顶部!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!