2

私の主な質問は、どちらのアプローチがより高速かということです。

ブリーフィング

Mozilla を使用してアプリケーションを開発しています。

いくつかのデータをキャプチャしてデータベースに保存するこの 1 つのモジュールがあります。データは断続的に入ってきます。重複は保存されません。議論のために、列が 1 つしかないテーブルを想定して、その列に「キーワード」という名前を付けましょう。したがって、データベースに既に存在するキーワードを取得した場合、それを再度保存することはありません。はい、この列を PRIMARY KEY として設定し、UNIQUE にしました。:)

私が持っているクエリは次のとおりです。

1) この新しいデータをデータベースに挿入する前に、DB 呼び出しを実行して、キーワードが存在するかどうかを確認します。存在しない場合はDBに入れますか?何かのようなもの:

function insert_keyword(keyword)
{
   if(!SQL.exists(keyword))
   {
       SQL.insert(keyword);
   } 
}

また

2)挿入してデータベースに条件を処理させ、効果的に例外をスローさせます。これをキャッチします。

function insert_keyword(keyword)
{
    try {
       SQL.insert(keyword);
    }
    catch (e)
    {
       // keyword exists!
    }
}

例外をキャッチして何もしないのは悪いことだと知っています! だから私は何が良くて何が悪いかを探しているわけではありません :) . 私が理解したいのは、どのアプローチが最も速いかということです。(具体的には Mozilla、JavaScript、SQLite に関連していますが、一般的なコメントは大歓迎です!)

補足: SQL 私が使用した構文は、説明のみを目的としています。SQL ステートメントを作成し、それらを実行して結果をフェッチすると想定するか、すべての汚い作業を行う JavaScript ライブラリ呼び出しであると想定するかもしれません。

この質問は、次の質問に少し似ています。

コード内の DB 制約をチェックする必要がありますか、それとも DB によってスローされた例外をキャッチする必要がありますか

しかし、私が取り組んでいるアプリケーションは可能な限り高速である必要があるため、パフォーマンスに関連する違いを具体的に理解したいと思います (どのアプリケーションがそうでないのですか? ;) )

4

2 に答える 2

6

重複を無視するようにデータベースに指示するだけです(一意の値を強制する列に対してのみ機能します):

INSERT OR IGNORE INTO table(keyword) VALUES("someWord");

または、重複を無視する列を作成します。

CREATE TABLE someTable(keyword PRIMARY KEY ON CONFLICT IGNORE);

無視する代わりに、これらの競合句もあります。

ロールバック
アボート
不合格
無視
交換

詳細については、SQLite の競合句に関するページとINSERT ステートメントのドキュメントを参照してください。


例外を使用するか、値の存在をチェックする方が高速かどうかについては、例外が発生するとコストが高くなり、発生しないとコストがゼロになります。これは、多数の重複が予想される場合はチェックを使用し、少数のキーワードのみが重複している場合は例外を使用することを意味します。結局のところ、例外は例外的であるべきです。

于 2009-04-06T09:02:14.257 に答える
2

この質問の mozilla/javascript 部分の詳細についてはわかりませんが、「挿入または置換」という 3 番目のオプションがあります。重複なしで目的を達成し、行が既に存在する場合にコードをチェックインする必要がなくなります。

于 2009-04-06T08:56:17.920 に答える