Oracle到SQL Server 2014中的索引选项(使用索引)的等效项

时间:2017-07-07 10:56:40

标签: sql sql-server oracle

我需要将数据从Oracle数据库移动到MS SQL Server 2014。 但我遇到了这个问题"使用索引"声明,它帮助我在oracle中添加一些约束。我想知道是否有人可以提供我和#34; USING INDEX"在Sql Server中。

CONSTRAINT "MESSAGE_LOG_RECORD_PK" PRIMARY KEY ("RECORD_NO")  
**USING INDEX** PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1   BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)   TABLESPACE "DATA"  ENABLE,

3 个答案:

答案 0 :(得分:0)

It seems using index creates index in specified table space as per the parameters you specified.

因此您可以在创建表时执行以下操作,以便sql server将根据默认参数配置索引

create table t1
(
id int not null primary key
)

或者您可以使用以下语法在创建表后向表添加约束

CREATE CLUSTERED INDEX [indxname] ON [dbo].[table1]
(
    id
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO

如果您保留filegroup选项,它将在创建表的同一文件组中创建索引

我建议使用第一种方法并保留默认值,否则您可以在此处浏览选项:https://docs.microsoft.com/en-us/sql/t-sql/statements/create-index-transact-sql

答案 1 :(得分:0)

将由BTree索引支持的主键约束添加到堆中,并将其支持索引存储在特定文件组中,如下所示:

CREATE TABLE MESSAGE_LOG
(
  RECORD_NO INT NOT NULL,
  OTHER_COLUMN INT NOT NULL,
  --. . .
  CONSTRAINT MESSAGE_LOG_RECORD_PK PRIMARY KEY NONCLUSTERED (RECORD_NO) ON DATA
)

虽然在SQL Server中我们通常使用Clustered Index表而不是堆,但只留下NONCLUSTERED,因为CLUSTERED是主键约束的默认值。此外,每个数据库都有自己的文件组,因此您不经常将表或索引直接放在非默认文件组上。所以通常在SQL Server中你只需要:

CREATE TABLE MESSAGE_LOG
(
  RECORD_NO INT NOT NULL,
  OTHER_COLUMN INT NOT NULL,
  --. . .
  CONSTRAINT MESSAGE_LOG_RECORD_PK PRIMARY KEY (RECORD_NO)
)

答案 2 :(得分:0)

根据此reference

CONSTRAINT "MESSAGE_LOG_RECORD_PK" PRIMARY KEY ("RECORD_NO")  
**USING INDEX** ...   TABLESPACE "DATA"  ENABLE

似乎暗示此子句(CREATE/ALTER TABLE ... - Oracle语法的一部分)将为主键约束(UNIQUE INDEX)创建MESSAGE_LOG_RECORD_PK

(1)基于磁盘的行存储表(SQL Server数据库中的主表类型)的SQL Server的默认行为如下:

(1.1)当在没有另一个CLUSTERED索引的表上定义PRIMARY KEY约束时,它将创建UNIQUE CLUSTERED INDEX

(1.2)如果表中已定义UNIQUE NONCLUSTERED INDEX约束,如果该表已经具有CLUSTERED索引,则会创建PRIMARY KEY

(1.4)它将尝试根据PRIMARY KEY约束选项在当前表上创建UNIQUE CLUSTERED / NONCLUSTERED索引:clustered / nonclustered so:

CREATE TABLE Groups  (
        GroupId INT IDENTITY(1, 1) NOT NULL
             CONSTRAINT PK_Groups_GroupId PRIMARY KEY CLUSTERED ON [PRIMARY] (GroupId), 
...
)

另外,在这种情况下请注意数据的名称SQL Server文件组(在这种情况下为PRIMARY;〜作为Oracle表空间我相信)用于存储与此主键关联的索引的数据。

(2)我的答案是遵循SQL语句,该语句将添加在RECORD_NO列上定义的PRIMARY KEY约束(它还将创建一个UNIQUE CLUSTERED - default - index),并在DATA文件组上定义:

ALTER TABLE dbo.LOG_RECORD
ADD CONSTRAINT MESSAGE_LOG_RECORD_PK 
PRIMARY KEY CLUSTERED ON [DATA] (RECORD_NO)