使用数据在现有表上创建主键

时间:2012-11-15 09:20:32

标签: sql sql-server sql-server-2008

作为迁移项目的一部分,我们从JDE iSeries DB2数据库导入数据。创建了一个SSIS包来创建目标表和导入数据。导入成功。

现在出现了问题 - 客户希望在目标数据库(SQL 2008 R2)中创建主键。在这种情况下,问题表将是一个包含104列和750万行数据的表。此表所需的PK是复合的,有7列。

我们正在考虑这个:

BEGIN TRANSACTION
GO
    ALTER TABLE [dbo].[F0911] ADD  CONSTRAINT [F0911_PK] PRIMARY KEY CLUSTERED 
    (
        [GLDCT] ASC,
        [GLDOC] ASC,
        [GLKCO] ASC,
        [GLDGJ] ASC,
        [GLJELN] ASC,
        [GLLT] ASC,
        [GLEXTL] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    GO
COMMIT

或者这个:

-- Rename existing tables
        sp_RENAME '[F0911]' , '[F0911_old]'
        GO

    -- Create new table
        SELECT * INTO F0911 FROM F0911_old WHERE 1=0
        GO

    --Create PK constraints
        ALTER TABLE [dbo].[F0911] ADD  CONSTRAINT [F0911_PK] PRIMARY KEY CLUSTERED 
        (
            [GLDCT] ASC,
            [GLDOC] ASC,
            [GLKCO] ASC,
            [GLDGJ] ASC,
            [GLJELN] ASC,
            [GLLT] ASC,
            [GLEXTL] ASC
        )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
        GO

    --Insert data into new tables
        INSERT INTO F0911
        SELECT * FROM F0911_old
        GO

    -- Drop old tables
        DROP TABLE F0911_old
        GO

哪种方法更有效,性能更明智?我有一种直觉,认为两者都是相同的,甚至第一种方法与第二种方法的含义完全相同。这种理解是否正确?

请注意,表中已存在所有这些列,我们无法修改表定义。

谢谢, 拉吉

2 个答案:

答案 0 :(得分:0)

他们是一样的。创建聚簇索引的效果是安排在两种情况下都会发生的页面。对于非聚集索引,它将有助于禁用索引,然后将其重新打开并重建它。

答案 1 :(得分:0)

我认为第一种方法是正确的,但我不明白BEGIN Transaction和END交易的原因。我不认为Transaction关键字是必要的,因为您没有修改表的数据。在我们必须锁定数据的地方使用事务,我们正在修改实时数据,因此不使用旧数据。