我有个问题。我有一张表,里面有大约 80-1 亿条记录。在该表中,我有一个字段,该字段存储了 3 到 16 个不同的“组合”(varchar)。组合是一个 4 位数字、一个冒号和一个 char(AE),. 例如:
'0001:A/0002:A/0005:C/9999:E'
。在这种情况下,有 4 种不同的组合(最多可以有 16 种)。该字段在表的每一行中,绝不为空。
现在的问题:我必须遍历表,找到每一行,看看它们是否相似。示例行:
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'
,并且如您所见,您可以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 是不切实际的 + 太慢了
- 不能提供字段全索引搜索(不知道具体原因)
- 少数可行的方法之一是为字段制作一些“散列”类型的编码,通过程序计算它,并搜索所有相同的“散列”(不知道你会怎么做,因为散列会为相似的文本生成不同的组合,也许是一些专门为此编写的哈希
- 创建一个新字段,计算/写入(可以在插入时完成)所有可能的组合并通过 SQL/程序检查它们是否具有相同的组合百分比,但我不知道如何存储 10080 个组合(如果是 16 ) 有效地转换为“varchar”,或者通过一些哈希码 + 知道它们中的哪一个是熟悉的。
还有一个问题,这个表几乎 24/7 都在使用,在 SQL 中进行组合检查它们是否相同太慢了,因为表太大了,可以通过程序或其他东西来完成,但我没有关于如何将其存储在新行中的任何线索,您会以某种方式知道它们是相同的。您可能会计算组合,通过一些哈希码或每行插入的东西存储它们,通过程序计算“哈希”,并检查表,如:
SELECT * FROM TABLE WHERE ROW = "a346adsad"
参数将通过程序发送到哪里。这个脚本需要非常快地执行,不到 1 分钟,因为表中可能有新的插入,您需要检查。
这样做的重点是查看 SQL 中是否已经存在任何类似的组合,并阻止任何对于插入“相似”的新组合。
我已经处理这个问题 3 天了,没有任何可能的解决方案,最接近的是不同类型的插入/哈希,但我不知道它是如何工作的。
预先感谢您提供任何可能的帮助,或者如果这是可能的!