如何在数百万条记录的staging和主表之间找到重复项

时间:2013-09-07 12:07:10

标签: mysql sql

我正在使用mysql,我想检查两个表之间的重复行。我使用了join,但由于有数百万条记录(例如登台表有800k记录,而主表有大约1亿条记录),所以花费了太多时间。

我使用的查询如下:

INSERT INTO 
    tblspduplicate
SELECT 
    T2.SP,T1.FileImportedDate,T2.XYZFileName 
FROM  
    tblspmaster T1
INNER JOIN 
    tblstaging T2 
ON 
    T1.SP=T2.SP;

CREATE TABLE `tblspmaster` (
  `CSN` bigint(20) NOT NULL AUTO_INCREMENT,
  `SP` varchar(50) NOT NULL,
  `FileImportedDate` date NOT NULL,
  `XYZFileName` varchar(50) NOT NULL,
  `XYZBatch` varchar(50) NOT NULL,
  `BatchProcessedDate` date NOT NULL,
  `ExpiryDate` date NOT NULL,
  `Region` varchar(50) NOT NULL,
  `FCCity` varchar(50) NOT NULL,
  `VendorID` int(11) NOT NULL,
  `LocationID` int(11) NOT NULL,
  PRIMARY KEY (`CSN`)
) ENGINE=InnoDB AUTO_INCREMENT=7484570 DEFAULT CHARSET=latin1;


CREATE TABLE `tblstaging` (
  `CSN` bigint(20) NOT NULL AUTO_INCREMENT,
  `SP` varchar(50) NOT NULL,
  `FileImportedDate` date NOT NULL,
  `XYZFileName` varchar(50) NOT NULL,
  `XYZBatch` varchar(50) NOT NULL,
  `BatchProcessedDate` date NOT NULL,
  `ExpiryDate` date NOT NULL,
  `Region` varchar(50) NOT NULL,
  `FCCity` varchar(50) NOT NULL,
  `VendorID` int(11) NOT NULL,
  `LocationID` int(11) NOT NULL,
  PRIMARY KEY (`CSN`),
  KEY `ind_staging` (`SP`)
) ENGINE=InnoDB AUTO_INCREMENT=851956 DEFAULT CHARSET=latin1;

2 个答案:

答案 0 :(得分:1)

你有tblspmaster.SP的索引吗?那将是最重要的事情。有了这样的索引,你的查询应该没问题。不过,首先,仅使用select来测试查询。

您可能遇到的另一个问题是重复匹配。这可能会显着增加您拥有的数据。您可以通过执行以下操作来测试:

select sp, count(*) as cnt
from tblmaster
group by sp
having cnt > 1
order by cnt desc;

select sp, count(*) as cnt
from tblstaging
having cnt > 1
order by cnt desc;

编辑:

根据表结构,我重复建议创建tblMaster(SP)的索引。您可能还需要删除tblStaging(SP)上的索引。或者,您可以使用索引提示强制使用主索引而不是分段索引(简单语法描述为here)。

此外,我建议您运行上述计数,以查看由于SP值的多样性而导致意外大量行的风险。

答案 1 :(得分:-1)

也许你的情况使用INTERSECt SQL,但我不知道他可以花多少时间。