1

作为迁移项目的一部分,我们从 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

在性能方面,哪种方法更有效?我有一种直觉,两者都是相同的,甚至第一种方法也隐含地与第二种方法做同样的事情。这种理解正确吗?

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

谢谢,拉吉

4

2 回答 2

0

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

于 2012-11-15T09:25:37.150 回答
0

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

于 2012-11-15T09:31:25.823 回答