八宝书库 > 文学其他电子书 > SQL 21日自学通(V3.0)(PDF格式) >

第46部分

SQL 21日自学通(V3.0)(PDF格式)-第46部分

小说: SQL 21日自学通(V3.0)(PDF格式) 字数: 每页4000字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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

返回目录 上一页 下一页 回到顶部 0 0

你可能喜欢的