質問

してクエリーに行からのテーブルに基づくid野主を尊重できる方が希望です。で非常に簡単でクエリー:

delete all from OUR_TABLE where ID in (123, 345, ...)

問題はます。のidは大きく(例えば.70k)のクエリは長い時間がかかります。が最適なのか。(しsybase-という場合となり

役に立ちましたか?

解決

バッチでこれを実行することを検討してください。一度に1000件のレコードを実行するループがはるかに速く、すべてを行い、加えて、テーブルを保持しないもののクエリよりも限り一気にために他のユーザーにロックアウトされてます。

あなたは、カスケード削除(および影響を受けた外部キー表の多くを)持っているか、関与トリガする場合、

、あなたも小さなバッチで実行する必要があります。使用状況に合った最適な数であるかを確認するためにexperiementする必要があります。私は(私は百万レコードを削除されたとして、その場合には幸運)50000が働いていた100のバッチなどで削除しなければならなかったのテーブルを持っていた。

しかし、いずれにしても、私は一時テーブルに削除して、そこから削除しようとする私のキー値をかけることになります。

他のヒント

るには二つの方法があります述のようなことを行う:

  1. 新しいテーブルをコピーすべての行を削除します。スワップのテーブル、かつその後alter table name ...)からぜひ試してみてください場合でも音か.一部のデータベースより高速でコピーにより削除する.

  2. 仕切ります。作Nのテーブルおよび利用に参加しています。の並べ替えなけれ異なるテーブルでグループ化による削除の評価のポイントになります。その考え方としては、下全体のテーブルを削除するのではなく、個別されています。

その中に70Kの項目でIN句を解析することは問題である場合は、

私は思ったんだけど。あなたの代わりに参加すると、一時テーブルを試したことがありますか?

でSybase取り扱70K引数項?すべてのデータベースっての制限数の引数 IN を提供しています。例えば、オラクルに制限が約1000です。

きsubselectくの項?ることが縮まり、sql.ものであることが明などに大きな数値に提供しています。のようなこと:

  DELETE FROM OUR_TABLE WHERE ID IN 
        (SELECT ID FROM somewhere WHERE some_condition)

削除する多数の記録できる高速化と一部の介入によりデータベースの場合データベースモデルの許可証を発給してきました。ここでは戦略

  1. きく速度が上昇するでしょう落として指数削除する記録を再現す指標です。このリバランスのインデックスツリーを削除する。

    • 落土地の再評価を行い、土地再評価表
    • データの削除
    • 再指数
    • までに多くの関係このテーブル、制約を無効の場合は必ず削除するコマンドは、必ず記入してください任意の完全性に与えます。削除するかに高速なデータベースなチェックです。する制約後に削除します。
    • 無効性制約を無効にするチェックの制約
    • データの削除
    • する制約
    • トリガを無効にするテーブルごとの事業の場合ルールできます。削除しきをトリガーとする。

    • 昨してくださいその他の示唆-コピーを作成し、保持するテーブルの行が削除できません皿などのプレゼンテーションに、名前の変更をコピーや再現性制約のないことがあります。

たったらどう組み合わせの1、2、3.それでも開かない場合は、その4.すべてのものを表明するものではなく、私を見て大きなボックス-メモリーの高速ディスク.

だがパフォーマンスをアップ!

多くの場合に利用する場合もあるでしょう解決策の一つになると考えられます。ありその他(Oracle高精度の位置決め性能を有するものと異なる他のデータベースです。編集:だけ見えてきsybase):

  • いて外部キーがテーブルは?確にしてそのidはインデックス化されて
  • いの指標とテーブルは?このdroping前に削除を再現した後に削除うになります。
  • チェックの実行プランです。での使用は指数テーブル全体のスキャンがれが早い?又はその他の方法で丸いのか?ヒントがいかなる貢献ができるか
  • の代わりに選択入new_table示唆される以上、このように作成されたテーブルとして選択可もなります。

がはっきり言ってくださいだがパフォーマンスをアップします。

ご利用の際に、異いうことができるものとし、その結果にこの取引およびバックアップしております。

あなたは、テーブル、またはインデックスと同じ順序で「に」に渡しているIDが保存されているソートしてください。あなたは、ディスクキャッシュに多くのヒットを得ることができます。

Idsはメインテーブルと同じ順序で並べ替えられた一時テーブルに削除するIDを置く、データベースは、メインテーブル上を走査簡単にやらせることができる。

データベース・サーバー上のすべてのCPUを使用するように

ただし考える、もっとして接続を1つ使用し、接続を介して仕事をspiting試みることができるロックを取り出すことがどうなるかなど最初ます。

私はまた、一時テーブルはおそらく最善の解決策だと思います。

あなたがした場合は、

「..から削除をどこID(...からIDを選択)で、」それはまだかかわらず、大きなクエリと遅くなることがあります。私は、このようにあなたが参加使用して削除することを示唆している - 。多くの人々がその機能を知らない

ですから、この例の表を与えます:

    -- set up tables for this example
    if exists (select id from sysobjects where name = 'OurTable' and type = 'U')
        drop table OurTable
    go

    create table OurTable (ID integer primary key not null)
    go
    insert into OurTable (ID) values (1)
    insert into OurTable (ID) values (2)
    insert into OurTable (ID) values (3)
    insert into OurTable (ID) values (4)
    go

次のように私たちは、その後、私達の削除コードを書くことができます:

    create table #IDsToDelete (ID integer not null)
    go
    insert into #IDsToDelete (ID) values (2)
    insert into #IDsToDelete (ID) values (3)
    go
    -- ... etc ...
    -- Now do the delete - notice that we aren't using 'from'
    -- in the usual place for this delete
    delete OurTable from #IDsToDelete
       where OurTable.ID = #IDsToDelete.ID
    go
    drop table #IDsToDelete
    go
    -- This returns only items 1 and 4
    select * from OurTable order by ID
    go

our_tableがON DELETE CASCADEを参照を持っていますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top