-1

親切に私は2 つのテーブルを含むデータベースを持っています。選択または更新を実行しようとしていて、ID (主キー) が 30 000 を超えると、クエリの実行に 1 分以上かかります。データを切り捨ててインポートし、ID が 1 から始まる場合、クエリは 1 秒かかります。ID が 30,000 を超える場合にレイテンシが発生する理由と、その他のソリューションを教えてください。実行されるインデックス: PK 用に 1 つ、日付にもう 1 つ、フィールド優先順位にもう 1 つ 単純な選択トップ 10 を実行する場合 * テーブル 1 から 2 分のレイテンシ
PS: 多数のトランザクションが最初に同時に実行されますテーブル (選択、挿入、更新、削除) ありがとうございます。

4

1 に答える 1

0

ロックの競合に苦しんでいる場合は、基本的に2つの選択肢があります。

  1. クエリを実行している間、他のすべてのアクティビティを停止します。これにより、データの一貫したビューが保証されます。(他のテーブルとの整合性を保証するには、技術的に他の手順が必要です)。with (TABLOCKX)これを行うには、クエリヒントを指定します。

    (「シリアル化された」トランザクション分離レベルを使用することもできます。これにより、テーブルを読み取るときにテーブルの端から端まで段階的にロックされます。インデックスを使用して巧妙な処理を行うことで、これを簡単に行うことができますが、これは「高度な」と見なされます)。

  2. 他のアクティビティの続行を許可しますが、取得した回答が、クエリの進行中に行われたアクティビティと矛盾する可能性があることを受け入れます。つまり、クエリ中に追加された行が含まれる場合と含まれない場合があり、クエリ中に削除された行が含まれる場合と含まれない場合があり、更新された行が含まれる場合と含まれない場合があります。 、前または後の値があります。さらに、いくつかの後の値が含まれているのに、いくつかの前の値が含まれていない場合があるため、時間的に一貫性がありません。with (NOLOCK)ヒントでこれを行うことができます。

    (「コミットされていない読み取り」トランザクション分離レベルを使用することもできます。通常、必要なときにNOLOCKを指定する方が簡単です)。

何をしているかに応じて、どちらのオプションも最適な場合があります。大まかな数字、またはレポート/監視の目的で一種のローリング「トップ10」を提供する場合は、オプション2を使用します。会計番号、銀行残高などを提供する必要がある場合は、チェックポイントが必要です。ある瞬間に正確な正しい番号がわかっている場合は、オプション1を使用します。これはまれです。疑わしい場合は、オプション2が必要になる可能性があります。

「中間」オプション、コミット済み読み取り、スナップショット読み取りなどは、デフォルトであるにもかかわらず実際に必要になることはめったになく、状況を十分に理解して必要かどうかを理解している場合にのみ使用する必要があります。

于 2013-01-07T12:11:48.230 に答える