作为迁移项目的一部分,我们从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
哪种方法更有效,性能更明智?我有一种直觉,认为两者都是相同的,甚至第一种方法与第二种方法的含义完全相同。这种理解是否正确?
请注意,表中已存在所有这些列,我们无法修改表定义。
谢谢, 拉吉
答案 0 :(得分:0)
他们是一样的。创建聚簇索引的效果是安排在两种情况下都会发生的页面。对于非聚集索引,它将有助于禁用索引,然后将其重新打开并重建它。
答案 1 :(得分:0)
我认为第一种方法是正确的,但我不明白BEGIN Transaction和END交易的原因。我不认为Transaction关键字是必要的,因为您没有修改表的数据。在我们必须锁定数据的地方使用事务,我们正在修改实时数据,因此不使用旧数据。