6

私は2つのテーブルを持っています:

table1 (id, name, connte)
table2 (id, name, connte)

それらはtable1.conntetable2.connteを介して接続されています。そして、それぞれに 100 レコードが含まれています。

id = 20 の table1 からレコードを削除し、table2 内の対応する子を削除する場合は、次のようにすることをお勧めします。

   DELETE d1,d2 FROM table1 d1 INNER JOIN table2 d2 ON d1.connte= d2.connte WHERE d1.id = 20

または以下:

  select connte from table1 where id = 20
  --Store connte in a variable say aabc--
  delete from table2 where connte = aabc   -> execute this first
  delete from table1 where id = 20    -> execute this second

削除したいレコード (ここでは table1.id =20) の親と子が 1 つしかない場合、テーブル全体に対して内部結合を行うのは高くつきませんか?

このクエリを JAVA (つまり JDBC) から実行していますが、上記の条件で複数のクエリまたは内部結合を実行する方が (パフォーマンス的に) コストがかかりますか?

注: テーブルの参照整合性がないことを前提としています。したがって、カスケード削除は使用していません。

4

4 に答える 4

6

2つではなく、1つのクエリで実行する方がおそらく高速です。基本的に、DBMSに最適化を行わせるのではなく、自分で最適化を行おうとしています。一般に、DBMSはこの種の作業に非常に優れています。

また、これほど小さいテーブルの削除パフォーマンスについて心配する必要はおそらくないでしょう。100 x 100行はまだ非常に小さいので、DBMSはこれを問題なく処理できるはずです。

于 2012-06-05T14:04:41.087 に答える
3

これを行うための最良の方法は、DBMSの両方のクエリでExplainプランを実行することです。出力には、I / O見積もりなどが表示されます。一般に、DBMSから何がより効率的になるかについて質問があるときはいつでも視点から見ると、クエリプランとコスト見積もりを確認することが最善の武器です。

SET showplan on

SQLサーバーで動作するはずです。これがMSDNのドキュメントです。DBMSによっては少し異なる構文が必要になる場合があります。I / Oコストの見積もりは、おそらく最も気になるものです。

MySQLの場合、使用できるようです

EXPLAIN SELECT * FROM some_table

Explainを使用してクエリを分析するチュートリアルを次に示します。

一般的に、Oleksiは正しいです。ほとんどのオプティマイザはこの種のことを非常に得意としており、一時テーブルを手動で作成してもそれほど購入することはありません。多くの場合、オプティマイザのクエリプランには、一時テーブルの作成が含まれます。

削除クエリの場合、速度を確保するために重要なことの1つは、削除句がインデックス付きパラメーターを使用しているため、全表スキャンが発生しないことです。Explain / Showplanは、クエリが実行しているスキャンのタイプと、クエリが使用しているインデックスを示します。通常、全表スキャンは避けたいと考えています。

于 2012-06-05T14:09:48.057 に答える
1

Sql Server では、(トリガーまたはカスケード削除なしで) 1 つの削除ステートメントで 2 つのテーブルから削除することはできません。

于 2012-06-05T14:42:52.390 に答える
0

外部キーとカスケード削除の使用を検討してみませんか? テーブルを適切に設定すると、親を削除するだけで、子が自動的に処理されます。このリンクを参照してくださいSQL Serverでカスケードを使用する場合/理由?

于 2012-06-05T15:26:21.087 に答える