我希望这不是一个被骗的问题。我找遍了,没有找到任何一个像我这样的问题,但是...
我有一个包含用户数据的表,我们知道其中存在重复项。该表包含超过30k个条目,并且正在不断增长。预计最大容量约为100k。我正在运行一个进程来查找重复条目,但是,这里是“但是...”重复项是“相似”的条目,而不是完全重复的条目。
标准如下:如果它们属于同一个组并且具有相似的名称,则认为是重复的。
相同的组只是与另一个表的连接,正确地索引,等等。这部分工作正常。
相似的名称意味着相同的名称忽略大小写,修剪和忽略内部空格。所以“joHn sMith”(初始空格)等于“JOHN SMITH“(中间和最后空格)和“john smith“(初始,中间和最后空格)。
我的初始策略非常慢:我有一个视图和一个解析视图的stored。stored一个接一个地删除重复的条目,因为删除重复的条目很复杂,会影响到其他几个表。
存储的工作效率或多或少,但视图是可怕的。
该视图将包含人员的表连接到其自身,并且该计划显示,当然,问题在于针对每个比较对人员的表进行的完全扫描:
strcmp(替换(lcase(trim(s
. name
)),“”,“”),替换(lcase(trim(t
. name
)),"“,”"))= 0
请注意,s.和t.指的是同一个人的表。
有什么建议吗?
非常感谢。
2条答案
按热度按时间3ks5zfa01#
从你的问题中,我们并不清楚一个人是一个群体的直系后代,还是多个群体的成员。假设是前者,我只会说:
字符串
由于您的预计最大行数只有100 k行,这应该比您的非sargable self-join快得多。在300 k行的随机(ish)集合上进行0.01%的重复率测试,它在大约70 ms内返回了34行用于合并/替换。
u3r8eeie2#
我会这样做:
1.添加一个新列以保存规范名称;例如,将名称转换为全部大写,并删除了多余的空格和其他字符。
1.填入数据行。
1.为该列添加索引。
1.通过按规范名称的顺序阅读记录并合并/以其他方式处理重复记录来执行重复数据删除。
(It是否应该保留具有非规范形式名称的原始列,这一点值得商榷。)
粗略地说,其复杂性如下:
1.是O(1)。
1.时间复杂度O(N)
1.是O(NlogN)。
1.时间复杂度为O(1),时间复杂度为O(1)。
我想...