索引,视图和存储过程的利弊

作者:王奎    我的博客:www.marksaas.com

在网上看到有关视图和存储过程的一道面试题,就整理一下。本文参考到维基百科还有其他网站的的一些解释。

索引:索引是一本书籍的重要组成部分,它把书中的重要名词列罗列出来,并给出它们相应的页码,方便读者快速查找该名词的定义和含义,感觉维基百科上的解释很形象,在数据库中索引是数据库的对象之一,索引是为了加速对表中数据行的检索而创建的一种分散的一种存储结构。索引是针对一个表而建立的,它是由数据页面以外的索引页面组成的 。

索引的分类:

(1)聚集索引

聚集索引指示表中数据行按索引键的排序次序存储,聚集索引对查找行很有效。只有当表包含聚集索引时,表内的数据行才按索引列的值在磁盘上进行物理上排序和存储。每一个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。当查询指定了关键值的范围或者按照关键值的顺序访问数据行时,应考虑在对应的列上创建聚集索引。

聚集索引对于那些经常要搜索范围值的列特别有效。使用聚集索引找到包含第一个值的行后,便可以确保包含后续索引值的行物理相邻。例如,应用程序查询某一日期范围内的记录,如果在日期列上创建了聚集索引,则能够快速找到包含开始日期的行,然后检索表中所有相邻的行,直到到达结束日期。同样,如果对从表中检索的数据进行排序时经常要用到某一列,则创建聚集索引指示表中的行按照该行的键值顺序进行排序,避免每次查询该列时都执行排序,从而节省成本。例如,对于ORDER BY或GROUP BY子句中指定的列进行索引,可以使DB2不必对数据进行排序,因为这些行已经排序。这样可以提高查询性能。

当索引值唯一时,使用聚集索引查找特定的行也很有效率。

注意:聚集索引不适用于频繁更改的行,因为DB2 必须按聚集索引的键值改变行的物理顺序存储,如果聚集索引列中的数据频繁修改,将导致聚集索引频繁修改,数据整行移动,消耗大量的系统资源。

(2)非聚集索引

非聚集索引具有完全独立于数据行的结构,数据行不按索引值的次序存储。在非聚集索引中,每个索引键都有指针指向包含该键值的数据行。

当用户需要使用多种方法查询数据时,非聚集索引非常有用。每张表只能有一个聚集索引,但是用户的查询条件是多样的。例如,员工表的EmployeeID列上已经创建了聚集索引,但是用户经常会使用员工的姓名、所在部门、出生日期等作为查询条件,所以应当考虑在这些列上创建非聚集索引,以提高查询效率。

如果创建索引时没有指定索引类型,默认情况下为非聚集索引。每个表最多可以创建249个非聚集索引。最好在唯一值较多的列上创建非聚集索引。

参看http://book.51cto.com/art/201008/216220.htm

查看表 (View) 是在关系数据库中,将一组查询指令构成的结果集,组合成可查询的数据表的一种数据库对象。与数据表不同的是,数据表是一种实体结构(Physical Structure),但查看表是一种虚拟结构(Virtual Structure),在实体数据表中的改变都可以立刻反应在查看表中,不过部份数据库管理系统也支持具更新能力的查看表(Updatable View)。

查看表具有下列的好处:

  • 可以将实体数据表隐藏起来,让外部程序的设计师无法得知实际的数据结构,降低数据库被攻击的风险。
  • 在多数的情况下,查看表是只读的,外部程序无法直接通过查看表修改数据(具更新能力的查看表除外)。
  • 简化查询,数据库管理员可以将高度复杂的查询,包装在查看表中,外部程序只需要直接访问该查看表即可取出需要的数据。
  • 在查看表中先行运行运算。
  • 查看表可视为数据表,具有 JOIN 的能力。
  • 数据库中只需要存储定义,无须存储数据。
  • 语法如下
    create view myview
        as select * from  mytable;
    查看表语句:
    select * from myview where myId=3;
    储存程序 (Stored Procedure),又可称预储程序或者存储过程,是一种在数据库中存储复杂程序,以便外部程序调用的一种数据库对象,它可以视为数据库中的一种函数或子程序。
  • 预存程序具有下列的好处:

    • 预存程序可封装,并隐藏复杂的商业逻辑。
    • 预存程序可以回传值,并可以接受参数。
    • 预存程序无法使用 SELECT 指令来运行,因为它是子程序,与查看表数据表用户定义函数不同。
    • 预存程序可以用在数据检验,强制实行商业逻辑等。
    • 缺点:
    • 预存程序,往往定制化于特定的数据库上,因为支持的编程语言不同。当切换到其他厂商的数据库系统时,需要重写原有的预存程序。
    • 预存程序的性能调校与撰写,受限于各种数据库系统。
    • 预存程序是数据库对象之一,必须使用数据定义语言来创建,例如:

      以下示例,以Microsoft的SQL Server所以采用的T-SQL语法表示。
      CREATE PROCEDURE usp_AddProduct
      (
         @Barcode VARCHAR(13),
         @Caption nvarchar(50)
      )
      AS
      BEGIN
       
         IF LEN(@Barcode) < 13 
            RAISERROR('Barcode length is too short.')
       
         INSERT INTO MyProducts (Barcode, Caption) VALUES (@Barcode, @Caption)
       
      END
      外部程序需要使用 EXECUTE 或 CALL 来调用预存程序。
      EXEC usp_AddProduct '2293891100011', 'MyProductCaption'




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章