特定の数式に基づいて欠落している最小の要素を特定する
数百万行のテーブルから欠落している要素を見つけることができる必要があり、BINARY(64)列の主キーがあります(これは計算に使用する入力値です)。これらの値はほとんど順番に挿入されますが、削除された以前の値を再利用したい場合があります。削除されたレコードをIsDeleted列で変更することはできません。現在の行の前に何百万もの値がある行が挿入される場合があるためです。つまり、サンプルデータは次のようになります。 KeyCol : BINARY(64) 0x..000000000001 0x..000000000002 0x..FFFFFFFFFFFF したがって、0x000000000002との間にすべての欠損値を挿入すること0xFFFFFFFFFFFFは実行不可能であり、使用される時間とスペースの量は望ましくありません。基本的に、アルゴリズムを実行する0x000000000003と、最初の開始点であるが返されることが期待されます。 私はC#でバイナリ検索アルゴリズムを考え出しました。これは、位置の各値についてデータベースにクエリを実行し、iその値が予期されているかどうかをテストします。コンテキストについては、私のひどいアルゴリズム:https : //codereview.stackexchange.com/questions/174498/binary-search-for-a-missing-or-default-value-by-a-given-formula このアルゴリズムは、たとえば、100,000,000アイテムのテーブルで26-27 SQLクエリを実行します。(それほど多くはないように見えますが、非常に頻繁に発生します。)現在、このテーブルには約50,000,000行あり、パフォーマンスが顕著になりつつあります。 私の最初の代替の考えは、これをストアドプロシージャに変換することですが、それには独自のハードルがあります。(私はBINARY(64) + BINARY(64)アルゴリズムや他の多くのものを書かなければなりません。)これは苦痛ですが、実行不可能ではありません。また、に基づく変換アルゴリズムの実装を検討しましたROW_NUMBERが、これについては非常に悪い直感があります。(A BIGINTはこれらの値に対して十分な大きさではありません。) 私はのためにアップしてる他の Iのように、提案本当にこれは、可能な限り迅速にする必要があります。C#クエリで選択された唯一の列に値するのはであり、他の列KeyColはこの部分には関係ありません。 また、価値のあるものとして、適切なレコードをフェッチする現在のクエリは次の行に沿っています。 SELECT [KeyCol] FROM [Table] ORDER BY [KeyCol] ASC OFFSET <VALUE> ROWS FETCH FIRST 1 ROWS ONLY <VALUE>アルゴリズムによって提供されるインデックスはどこにありますか。私もまだBIGINT問題を抱えていませんが、問題はOFFSETありません。(現在、50,000,000行しかないということは、その値を超えるインデックスを要求しないことを意味しますが、ある時点でBIGINT範囲を超えることになります。) いくつかの追加データ: 削除から、gap:sequential比率は約1:20です。 テーブルの最後の35,000行には、> BIGINTの最大値があります。