介绍:
数据库和表规范:

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/

10-12 05:30