プレッシャーの下で SQL データベースへの一意の行挿入を保証する
SQL 開発者にとっての共通の課題は、重複を作成せずに行を挿入することです。 従来の方法にはサブクエリが含まれることがよくあります:
<code class="language-sql">INSERT INTO TheTable SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT NULL FROM TheTable WHERE PrimaryKey = @primaryKey)</code>
ただし、負荷が高い場合、このアプローチでは主キー違反が発生し、ステートメントの原子性が損なわれる可能性があります。
これを軽減するために、一部の開発者はロック メカニズムを採用しています。
<code class="language-sql">INSERT INTO TheTable WITH (HOLDLOCK, UPDLOCK, ROWLOCK) SELECT @primaryKey, @value1, @value2 WHERE NOT EXISTS (SELECT NULL FROM TheTable WITH (HOLDLOCK, UPDLOCK, ROWLOCK) WHERE PrimaryKey = @primaryKey)</code>
しかし、過剰なロックはパフォーマンスに大きな影響を与えます。
より効率的な戦略は、「JFDI」 (Just F***ing Do It) メソッドと呼ばれることがあり、エラー処理を伴う直接挿入が含まれます。
<code class="language-sql">BEGIN TRY INSERT etc END TRY BEGIN CATCH IF ERROR_NUMBER() <> 2627 RAISERROR etc END CATCH</code>
これにより、ネストされたクエリとロックが回避され、大量の場合の同時実行が促進されます。
重要なことは、適切なインデックス作成が最も重要であるということです。 経験豊富な SQL 開発者が「レッスン 4」で強調したように、重複防止をサブクエリだけに依存するのは信頼できません。 一意のインデックスと適切なエラー処理 (エラー 2627 のキャッチなど) を組み合わせることで、自動重複防止が実現し、プロセスが合理化されます。
以上がSQL Developerは高負荷時に一意の行挿入をどのようにして確保できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。