私は問題があります。約 8,000 万から 1 億のレコードを含むテーブルがあります。そのテーブルには、3 から 16 までの異なる「組み合わせ」(varchar) を格納したフィールドがあります。組み合わせは、4 桁の数字、コロン、文字 (AE)、. 例:
'0001:A/0002:A/0005:C/9999:E'
. この場合、4 つの異なる組み合わせがあります (最大 16 まで可能)。このフィールドはテーブルのすべての行にあり、null になることはありません。
ここでの問題: テーブルを調べて、すべての行を見つけて、それらが類似しているかどうかを確認する必要があります。行の例:
0001:A/0002:A/0003:C/0005:A/0684:A/0699:A/0701:A/0707:A/0709:A/0710:D/0711:C/0712:A/0713:A
0001:A/0002:A/0003:C
0001:A/0002:A/0003:A/0006:C
0701:A/0709:A/0711:C/0712:A/0713:A
ご覧のとおり、これらの各行は (ある意味で) 他の行と似ています。ここで行う必要があるのは、'0001:A/0002:A/0003:C'
プログラム (または SQL のパラメーター) を介して送信するときに、すべての行をチェックし、同じ「グループ」があるかどうかを確認することです。ここでの問題は、両方の方法で実行する必要があり、「すばやく」実行する必要があり、SQL でそれらを何らかの方法で比較する必要があることです。
したがって、送信'0001:A/0002:A/0003:C/0005:A/0684:A/0699:A/0701:A/0707:A/0709:A/0710:D/0711:C/0712:A/0713:A'
すると、3〜16個の同じ組み合わせがあるすべてのフィールドを見つけて、行を返す必要があります。この 3-16 はパラメーターで指定できますが、最初のパラメーターとして'0002:A:/0711:C/0713:A'
send を送信できるため、考えられるすべての組み合わせを見つける必要があるという問題があります。0002:A
ただし、組み合わせは文字列の任意の場所にある可能性があり、「添付」されていないさまざまな組み合わせを送信できるため、インデックスを作成することはできません (途中に別の組み合わせがある可能性があります)。
したがって、送信'0001:A/0002:A/0003:C/0005:A/0684:A/0699:A/0701:A/0707:A/0709:A/0710:D/0711:C/0712:A/0713:A'
は同じ 3 ~ 16 フィールドを持つすべてのフィールドを返す必要があり、「0001:A/0002:A/0003:C」を送信する場合は、上の行 + 同様の行を見つける必要があります。 (すべてのパラメータを含むすべて)。
私が試したいくつかのこと/オプション:
- すべての送信の組み合わせに対して LIKE を実行するのは現実的ではありません + 遅すぎます
- フィールドのフルインデックス検索を行うことはオプションではありません (正確な理由はわかりません)
- 機能する可能性のある数少ないことの1つは、フィールドの「ハッシュ」タイプのエンコードを作成し、プログラムを介してそれを計算し、すべて同じ「ハッシュ」を検索することです(ハッシュが同様のテキストに対して異なる組み合わせを生成します。おそらく、そのために正確に記述されるハッシュがいくつかあります
- 新しいフィールドを作成し、すべての可能な組み合わせを計算/書き込み(挿入時に実行できます)し、組み合わせの割合が同じかどうかをSQL /プログラムを介してチェックしますが、10080の組み合わせを保存する方法がわかりません(16の場合) )効果的に「varchar」に変換するか、ハッシュコードを介して+それらのどれがよく知られているかを知っています。
別の問題があります。このテーブルはほぼ 24 時間年中無休で使用されています。テーブルが大きすぎるため SQL で同じかどうかを確認するために組み合わせを行うのは遅すぎます。プログラムなどを介して行うことができますが、私はしません。これを新しい行に保存する方法についての手がかりがあり、それらが同じであることを何とか知っています。組み合わせを計算し、行の挿入ごとにハッシュコードまたは何かを介してそれらを保存し、プログラムを介して「ハッシュ」を計算し、次のようなテーブルをチェックする可能性があります。
SELECT * FROM TABLE WHERE ROW = "a346adsad"
パラメータはプログラム経由で送信されます。このスクリプトは、チェックが必要なテーブルへの新しい挿入がある可能性があるため、1 分未満で非常に高速に実行する必要があります。
これの要点は、SQL に類似の組み合わせが既に存在するかどうかを確認し、挿入に「類似」する新しい組み合わせをブロックすることです。
私はその問題に3日間対処してきましたが、解決策はありません。最も近いのは、さまざまなタイプの挿入/ハッシュのようなものですが、どのように機能するかわかりません。
可能性のある助けを事前にありがとう、またはこれが可能である場合でも!