打印本文 打印本文 关闭窗口 关闭窗口
把Oracle数据库移植到Microsoft SQL Server 7.0
作者:武汉SEO闵涛  文章来源:敏韬网  点击数13793  更新时间:2009/4/22 22:06:51  文章录入:mintao  责任编辑:mintao
ransact-SQL的sp_dboption系统存储程序来设置该选项)。用sp_helpdb系统存储过程来检查数据库的状态。如果select into/bulkcopy未设定为true,你仍然可以用SELECT语句拷贝到临时表中,就像下面这样:

SELECT * INTO #student_backup FROM user_db.student_admin.student

当用SELECT.. INTO语句来创建新的表时,其参考的完整性定义不会转换到新的表中。

select into/bulkcopy设定为true的要求可能会使移植的过程变得复杂。如果你必须用SELECT语句拷贝数据到表中,请首先创建表,然后再用INSERT INTO…SELECT语句来载入该表。对于Oracle和SQL Server来说,语法是一样的,也不需要设置任何数据库选项。

 

视图

在Microsoft SQL Server中创建视图的语法同Oracle一样。

Oracle Microsoft SQL  CREATE [OR REPLACE] [FORCE |
NOFORCE] VIEW [schema.]view_name
[(column_name [, column_name]...)]
AS select_statement
[WITH CHECK OPTION [CONSTRAINT
   name]]
[WITH READ ONLY]
CREATE VIEW [owner.]view_name
[(column_name [, column_name]...)]
[WITH ENCRYPTION]
AS select_statement [WITH CHECK OPTION]

 

SQL Server视图要求表必须存在,并且视图的所有者必须有访问在SELECT语句中标明的数据库的权限(同Oracle中的FORCE选项相似)。

缺省情况下,不会检查视图上的数据修改语句来判定受影响的行是否在视图的范围内。要检查所有的修改,请使用WITH CHECK OPTION。对于WITH CHECK OPTION主要的不同之处在于,Oracle将其作为约束来定义,而SQL Server不是。此外,两者的功能是一样的。

在定义视图的时候,Oracle提供了一个WITH READ ONLY选项。SQL Server应用程序可以用仅向视图用户提供SELECT权限的方法来达到同样的结果。

SQL Server和Oracle视图都支持派生列、使用数学表达式、函数以及常量表达式。SQL Server的某些特殊的不同之处是:

  • 如果数据修改只影响一个基本表,则数据修改语句(INSERT或者UPDATE)可以存在于多个视图上。单个语句中的数据修改语句不能用在超过一个表上。
  • READTEXT或者WRITETEXT不能用于视图中的列。
  • 不能使用ORDER BY、COMPUTE、FOR BROWSE、或者COMPUTE BY子句。
  • 在视图中不能使用INTO关键字。

当一个视图是和一个外部连接一起定义的,并且查询限定在外部接合点的内部表上时,SQL Server和Oracle的结果会有所不同。在大多数情况下,Oracle视图很容易转化为SQL Server视图。

Oracle Microsoft SQL  CREATE VIEW STUDENT_ADMIN.STUDENT_GPA
   (SSN, GPA)
AS SELECT SSN,    ROUND(AVG
(DECODE(grade
,''''A'''', 4
,''''A+'''', 4.3
,''''A-'''', 3.7
,''''B'''', 3
,''''B+'''', 3.3
,''''B-'''', 2.7
,''''C'''', 2
,''''C+'''', 2.3
,''''C-'''', 1.7
,''''D'''', 1
,''''D+'''', 1.3
,''''D-'''', 0.7
,0)
),2)
FROM STUDENT_ADMIN.GRADE
GROUP BY SSN
CREATE VIEW STUDENT_ADMIN.STUDENT_GPA
   (SSN, GPA)
AS SELECT SSN, ROUND(AVG
(CASE grade
WHEN ''''A'''' THEN 4
WHEN ''''A+'''' THEN 4.3
WHEN ''''A-'''' THEN 3.7
WHEN ''''B'''' THEN 3
WHEN ''''B+'''' THEN 3.3
WHEN ''''B-'''' THEN 2.7
WHEN ''''C'''' THEN 2
WHEN ''''C+'''' THEN 2.3
WHEN ''''C-'''' THEN 1.7
WHEN ''''D'''' THEN 1
WHEN ''''D+'''' THEN 1.3
WHEN ''''D-'''' THEN 0.7
ELSE 0
END
),2)
FROM STUDENT_ADMIN.GRADE
GROUP BY SSN

 

索引

Microsoft SQL Server提供了分簇和未分簇的索引结构。这些索引是由来自于一个叫做B-tree的树型结构中的页构成的(同Oracle中的B-tree索引结构相似)。起始页(“根”级)说明了表中值的范围。“根”级页中的每一个范围指向其他页(判断节点),该节点包含了表中值的更小的范围。以此类推,该节点又可以指向其他的判断节点,这样就缩小了搜索的范围。树型结构的最后一级叫做“叶”级。

分簇的索引

分簇的索引在Oracle中是以索引组织表的形式实现的。一个分簇的索引是一个物理的包含在一个表中的索引。表和索引分享同一块存储空间。分簇的索引按索引顺序物理的重排数据行,建立起中间判断节点。索引的“叶”页包含了真实的表数据。这个结构允许每个表只有一个分簇的索引。Microsoft SQL Server为表自动的创建一个分簇的索引,无论该表设置了PRIMARY KEY还是UNIQUE约束。分簇的索引对下面这些是有用的:

  • 主键(Primary keys)
  • 不能被更新的列。
  • 返回一个值的范围的查询,使用诸如BETWEEN、>、>=、<、以及<=这样的操作符,例如:

SELECT * FROM STUDENT WHERE GRAD_DATE

BETWEEN ''''1/1/97'''' AND ''''12/31/97''''

  • 返回一个大的结果集合的查询:

SELECT * FROM STUDENT WHERE LNAME = ''''SMITH''''

  • 被用做排序操作的列(ORDER BY、GROUP BY)

例如,在STUDENT表上,在ssn的主键上包含一个未分簇的索引是很有用的,而分簇的索引可以在lname、fname(last name、first name)上创建,因为这是一种常用的区分学生的方法。

  • 分布表上的更新行为可以防止出现“热点”。热点通常是由于多个用户向一个有上升键的表中填充而引起的。这样的情景经常导致行级别的锁定。

删除和重建一个分簇的索引在SQL Server中是一种很普通的重新组织表的技术。这是一种确保数据页在磁盘上是连续的以及重建表中的一些可用空间的简单的方法。这同Oracle中导出、删除以及导入一个表是很相似的。

一个SQL Server分簇的索引与Oracle的簇在根本上是不一样的。一个Oracle的簇。一个Oracle的簇是两个或者更多的表的物理集合,它们分享同一个数据块,使用一个公共的列来作为簇键。SQL Server没有与Oracle簇相似的结构。

作为一个普遍的原则,在表上定义一个分簇的索引将提高SQL Server的性能并且加强空间管理。如果你不知道对于给定表的查询和更新模式,你可以在主键上创建一个分簇的索引。

下表摘录自示例应用程序的源代码。请注意SQL Server“簇”化索引的使用。

Oracle Microsoft SQL  CREATE TABLE STUDENT_ADMIN.GRADE (
SSNCHAR(9) NOT NULL,
CCODEVARCHAR2(4) NOT NULL,
GRADEVARCHAR2(2) NULL,
CONSTRAINT     GRADE_SSN_CCODE_PK
    PRIMARY KEY (SSN, CCODE)
CONSTRAINT GRADE_SSN_FK
FOREIGN KEY (SSN) REFERENCES
STUDENT_ADMIN.STUDENT (SSN),
CONSTRAINT GRADE_CCODE_FK
FOREIGN KEY (CCODE) REFERENCES
DEPT_ADMIN.CLASS (CCODE)
)
CREATE TABLE STUDENT_ADMIN.GRADE (
SSNCHAR(9) NOT NULL,
CCODEVARCHAR(4) NOT NULL,
GRADEVARCHAR(2) NULL,
CONSTRAINT
    GRADE_SSN_CCODE_PK
    PRIMARY KEY CLUSTERED (SSN,     CCODE),
CONSTRAINT GRADE_SSN_FK
    FOREIGN KEY (SSN) REFERENCES
    STUDENT_ADMIN.STUDENT (SSN),
CONSTRAINT GRADE_CCODE_FK
    FOREIGN KEY (CCODE) REFERENCES
    DEPT_ADMIN.CLASS (CCODE)
)

 

未分簇的索引

在未分簇的索引中,索引数据和表数据在物理上是分开的,并且表中的行并不是按顺序存储在索引中的。你可以把Oracle索引定义移植到Microsoft SQL Server未分簇的索引定义上(就像在下表中显示的一样)。可是,考虑到性能的缘故,你可能希望选择表的其中一个索引把它创建为分簇的索引。

Oracle Microsoft SQL  CREATE INDEX
STUDENT_ADMIN.STUDENT_
   MAJOR_IDX
ON STUDENT_ADMIN.STUDENT    (MAJOR)
TABLESPACE USER_DATA
PCTFREE 0
STORAGE (INITIAL 10K NEXT 10K
    MINEXTENTS 1 MAXEXTENTS
    UNLIMITED)
CREATE NONCLUSTERED INDEX
STUDENT_MAJOR_IDX
ON USER_DB.STUDENT_
   ADMIN.STUDENT (MAJOR)

 

索引语法和命名

在Oracle中,一个索引的名字在一个用户账号中是唯一的。在In Microsoft SQL Server,一个索引的名字在一个表名中必须是唯一的,但是不必在用户名和数据库名中唯一。因此,在SQL Server中创建或者删除索引时,你必须说明表名和索引名。另外,SQL Server的DROP INDEX语句可以一次删除多个索引。

Oracle Microsoft SQL CREATE [UNIQUE] INDEX [schema].index_name
    ON [schema.]table_name (
column_name
    [, column_name]...)
[INITRANS n]
[MAXTRANS n]
[TABLESPACE tablespace_name]
[STORAGE storage_parameters]
[PCTFREE n]
[NOSORT]

DROP INDEX ABC;

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]
    INDEX index_name ON table (column     [,…n])
[WITH
        [PAD_INDEX]
        [[,] FILLFACTOR = fillfactor]
        [[,] IGNORE_DUP_KEY]
        [[,] DROP_EXISTING]
        [[,] STATISTICS_NORECOMPUTE]
]
[ON filegroup]

   DROP INDEX    USER_DB.STUDENT.DEMO_IDX,    USER_DB.GRADE.DEMO_IDX

 

索引数据存储参数

Microsoft SQL Server功能选项中的FILLFACTOR选项在很多方面与Oracle中的PCTFREE变量相似。当表的尺寸增加的时候,索引页也相应改变以容纳新的数据。索引必须自己进行重新组合以容纳新的数据。只有在创建索引的时候,才使用填充参数百分比,而且在这之后也不加以维护。

FILLFACTOR选项(0~100)控制着在创建索引时应该留下多少空间。如果没有表明参数,就使用缺省参数,该参数是0,表示将完全填充索引的“叶”页,并且在每个判断节点为至少一个条目留下空间(如果有两个条目,则表示是一个不唯一的“簇”化索引)。

126.gif (3429 bytes)

一个较低的填充因数将会减少索引页的分裂,但是会增加B-tree结构的层数。较高的填充因数能更有效的使用索引页空间,只需要较少的磁盘I/O来访问索引数据,并且将会减少B-tree结构的层数。

PAD_INDEX选项表示,填充因数也将应用到判断节点页上,就象要用在

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ...  下一页 >> 

打印本文 打印本文 关闭窗口 关闭窗口