1

私は使用してmysqlおり、2 つのテーブル間の重複行を確認したいと考えています。使用joinしましたが、何百万ものレコードがあるため、時間がかかりすぎます (たとえば、ステージング テーブルには 80 万レコードがあり、メイン テーブルには約 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;
4

2 に答える 2

1

のインデックスはありtblspmaster.SPますか? それが最も重要なことでしょう。このようなインデックスがあれば、クエリは問題ないはずです。ただし、最初に、select.

もう 1 つの問題として、一致の重複があります。これにより、所有しているデータが大幅に増加する可能性があります。これをテストするには、次のようにします。

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)。または、インデックス ヒントを使用して、ステージング インデックスの代わりにマスター インデックスを強制的に使用することもできます (簡単な構文については、こちらで説明しています)。

また、上記のカウントを実行して、SP 値の多重度が原因で予想外に多数の行が取得されるリスクを確認することをお勧めします。

于 2013-09-07T12:13:39.667 に答える
-1

INTERSECt SQL を使用する場合もありますが、彼がどれだけの時間を費やすことができるかはわかりません。

于 2013-09-07T12:13:16.813 に答える