2016-08-29 5 views
-1

デザインが悪いため、データベースをクリーンアップする必要があります。正しく接続されていないデータがあります(外部キーが設定されていません)。 したがって、参照されていないすべてのデータを削除します。 私は、一時テーブルtemp1に参加し、メインテーブルentityに接続していないEntity_IDをすべて挿入しました。次のステップは、私は、クエリ以下でentityisactiveすべての悪いデータから削除する、次のとおりです。データベースから参照されていないデータを削除する

Delete from db1.entityisactive where db1.entityisactive.Entity_ID IN 
(
Select db1.temp1.Entity_ID from db1.temp1 
) 

問題は、私はSelect db1.temp1.Entity_ID from db1.temp1 where Entity_ID = 42

私が欲しいことを行うとき、私はまた、接続時間を出て、ありますすべてのエントリを削除するentityisactiveentityisactive.Entity_ID = temp1.Entity_ID

どのようにSQLクエリを高速化できますか?または私の推論の誤りはどこですか?

+0

インデックスを作成してNOT INを使用することはできますが、NOT INは大して危険です。 – Drew

+0

内部クエリの結果の数を制限し、何も削除されなくなるまで複数回実行してください。 'Select db1.temp1.Entity_ID db1.temp1からLIMIT 1000' – alfasin

+0

の危険性はありません:http://stackoverflow.com/a/32175659 – Drew

答えて

0

明示的なjoinを使用してインデックスを定義することをお勧めします。コードは次のようになります。

Delete eia 
    from db1.entityisactive eia join 
     db1.temp1 t 
     on eia.Entity_ID = t.Entity_ID ; 

次に、このクエリはtemp1(Entity_Id)またはentityisactive(Entity_Id)のいずれかのインデックスを望んでいます。両方の索引は必要ではなく、2番目の索引はより良いパフォーマンスを持つかもしれません。

+0

私は 'entityisactive'テーブルにインデックスを持っています。答えのタンクは、それは完璧に動作します。 – StefanS

関連する問題