如何处理垃圾台?

时间:2017-05-15 09:34:05

标签: sql-server

简介:

数据库和表格规范:

  • Microsoft SQL Server 2008 R2
  • compatibility_level = 80(不要问为什么)

表格规范:

  • 3189706 row。
  • 48列all 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)

由于这个过程非常缓慢,我来找你就这个过程提出一些建议 以及如何使其尽可能高效。

让它成为一个蓝调插入?对插入执行convertion和null检查? 插入前添加索引?

Ps:由于48列,我简化了Sql查询。

1 个答案:

答案 0 :(得分:1)

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

根据评论更新:
如果你想保留两个表,我建议不要使用临时表,使用永久表。支付一次性检查所有费用,然后只支付增量费用。这是我能想到的唯一想法