介绍:
数据库和表规范:
Microsoft SQL Server 2008 R2
ibility_level = 80(不要问为什么)
表规格:
3189706行。
全部48列varchar NULL
没有ID,没有索引(只有乐趣!)
挑战:
所有这一切的目的是清理迁移到干净的表。这两个表都将存在,直到旧程序学习使用新表为止。
我将所有这些放入临时表中以检查类型和null。
然后清理所有重复项。由于varchar并且没有索引,实际上是不可能的。
CREATE TABLE #TempTrash
(
ID INT IDENTITY(1,1),
Foo INT,
Bar VARCHAR(50)
)
INSERT INTO #TempTrash
(
Foo,
Bar
)
SELECT
Foo = CONVERT ( u.TrashFoo , expression )
,Bar = u.trs_Something
FROM dbo.BurnMe u
-- 3 Search index for duplicate clean
CREATE CLUSTERED INDEX IDX_C_Trash_IdFoo ON #TempTrash(Foo)
CREATE INDEX IDX_Trash_IdFoo ON #TempTrash(Foo)
由于这将非常缓慢,因此我向您寻求有关此过程的一些建议。
以及如何使其尽可能高效。
使它成为一个大人物?在插入上执行转换和null检查吗?
在插入之前添加索引?
ps:由于48列,我简化了Sql查询。
最佳答案
SELECT
Foo = CONVERT ( u.TrashFoo , expression )
,Bar = u.trs_Something
FROM dbo.BurnMe u
由于这将非常缓慢,因此我向您寻求有关此过程的一些建议。
以及如何使其尽可能高效。
由于您正在从表中选择所有数据,因此效率不高
如果您想检查数据的有效性并且不想更改表,我建议使用
Trigger
,如下所示create trigger trg_test
on table
for insert
as
begin
do your validation here
end
根据评论更新:
如果您要保留两个表,建议不要使用临时表,而要使用永久表。只需一次检查所有成本,然后仅支付增量成本。这是我唯一能想到的想法
关于sql-server - 如何处理垃圾箱?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43975984/