我有一个查询如下,在我的表中查找重复项,其中包含超过10,00,000个数据,包含10个字段。当我尝试执行查询时,它会继续加载和加载超过一个小时,但它无法完成执行。 当我尝试使用只有100条记录的类似表格进行相同的查询时,它可以正常工作。
(所有列数据类型都是nchar)
我想知道如何将其用于超过10,00,000的数据。
select * from table1 as L
where (select count(*) from table1
where L.date + L.time + L.color + L.supplier = table1.date +
table1.time + table1.color + table.supplier and table1.variety = 'dark'
and date between '01062012' and '30062012') > 1
答案 0 :(得分:1)
不要 使用L.date + L.time + L.color + L.supplier
= table1.date +
table1.time + table1.color + table.supplier
这样做会使MURDER能够在联接中使用索引。
select * from table1 as L
where (select count(*)
from table1
where table1.date = L.date
and table1.color = L.color
and table1.supplier = L.supplier
and table1.variety = 'dark'
and table1.date between '01062012' and '30062012'
)
> 1
另外,请确保您的表格的索引涵盖所有加入字段(品种,颜色,供应商,日期)。
还有其他选项可用于查找重复项,例如使用ROW_NUMBER()
,但我们需要了解有关您的表结构(唯一ID字段等)的更多信息以及构成重复项的内容(以及不构成重复项)。
答案 1 :(得分:0)
不确定你的表结构。似乎在极端负载下你的桌子被锁定了。尝试下面提到的一些提示。
APART从此尝试删除*并读取执行所需的记录。
select * from table1 as L WITH(NOLOCK)
where (select count(1) from table1 WITH(NOLOCK)
where L.date + L.time + L.color + L.supplier = table1.date +
table1.time + table1.color + table.supplier and table1.variety = 'dark'
and date between '01062012' and '30062012') > 1
希望它能解决你的问题。
干杯
答案 2 :(得分:0)
我是新手,我的建议可能不合适,但如果在你的位置,我会使用SSIS。我会在ssis中使用脚本组件并执行操作