INSTEAD OF INSERT
挿入時に一意の INT キーが自動的に割り当てられる利便性を再現したい場合は、既存の列の MAX +1 を使用して次の値を決定するトリガーを追加できます。
ID 値を持つ列がインデックスの最初のキーである場合、MAX クエリは単純なインデックス シークになり、非常に効率的になります。
トランザクションは一意の値が割り当てられることを保証しますが、このアプローチは標準の ID 列とは異なるロック セマンティクスを持ちます。IIRC、SQL Server は、並行して要求するトランザクションごとに異なる ID 値を割り当てることができ、トランザクションがロールバックされると、それに割り当てられた値は破棄されます。MAX アプローチでは、一度に 1 つのトランザクションのみがテーブルに行を挿入できます。
関連するアプローチとして、テーブル名、テナント ID、および現在の ID 値をキーとする専用のキー値テーブルを用意することもできます。そのキーテーブルを更新してクエリを実行するには、同じINSTEAD OF INSERT
トリガーとより多くのボイラープレートが必要になります。ただし、並列操作は改善されません。ロックは別のテーブルのレコードにあるだけです。
ロックのボトルネックを修正する 1 つの可能性は、現在の SPID をキーの値に含めることです (ID キーは、シーケンシャル int と、単にシーケンシャルではなく、たまたまそれを割り当てた SPID の組み合わせです)、専用の ID 値テーブルを使用して挿入します。必要に応じて SPID ごとにそこに記録します。ID テーブル PK は (テーブル名、テナント、SPID) であり、現在の連続値を持つ非キー列があります。そうすれば、各 SPID に独自の動的に割り当てられた ID プールがあり、独自の SPID 固有のレコードのみがロックされます。
別の欠点は、特別な ID テーブルの列を変更するたびに更新する必要があるトリガーを維持することです。