删除不相邻的重复项比较所有字段
Removing non-adjacent duplicates comparing all fields
从未排序的标准内部 table(非深层结构,任意大)中删除所有精确重复项的最(时间)有效方法是什么?
我能想到的就是在运行 DELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS
之前简单地按所有字段对整个事物进行排序。是否有更快或更喜欢的替代方案?如果结构将字母数字字段与数字混合,这会导致问题吗?
为了提供上下文,我正在尝试提高遗留程序中一些可怕的 select 逻辑的性能。其中大多数在 5-10 个加入的 table 上运行完整 table 扫描,其中一些是自加入的。我在内存中留下了数十万行,我相当确定其中很大一部分只是重复的。然而,改变实际的 selects 太复杂了,需要 /ex[tp]ensive/ 重新测试。仅删除重复项可能会将运行时间缩短一半,但我想确保重复数据删除本身不会增加太多开销。
我会研究两种方法:
将原始索引存储在辅助字段中,SORT BY
要比较的字段(可能使用STABLE
),DELETE ADJACENT DUPLICATES
,然后重新SORT BY
存储的索引。
对要比较的字段使用 HASHED TABLE
,LOOP
通过数据 table。在散列 table 上使用 READ TABLE .. TRANSPORTING NO FIELDS
来查明该值是否已经存在,如果存在,则将其删除 - 否则将值添加到散列 table.
我不确定性能,但我建议对两种方法的合理数据集使用 SAT
并比较结果。
从未排序的标准内部 table(非深层结构,任意大)中删除所有精确重复项的最(时间)有效方法是什么?
我能想到的就是在运行 DELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS
之前简单地按所有字段对整个事物进行排序。是否有更快或更喜欢的替代方案?如果结构将字母数字字段与数字混合,这会导致问题吗?
为了提供上下文,我正在尝试提高遗留程序中一些可怕的 select 逻辑的性能。其中大多数在 5-10 个加入的 table 上运行完整 table 扫描,其中一些是自加入的。我在内存中留下了数十万行,我相当确定其中很大一部分只是重复的。然而,改变实际的 selects 太复杂了,需要 /ex[tp]ensive/ 重新测试。仅删除重复项可能会将运行时间缩短一半,但我想确保重复数据删除本身不会增加太多开销。
我会研究两种方法:
将原始索引存储在辅助字段中,
SORT BY
要比较的字段(可能使用STABLE
),DELETE ADJACENT DUPLICATES
,然后重新SORT BY
存储的索引。对要比较的字段使用
HASHED TABLE
,LOOP
通过数据 table。在散列 table 上使用READ TABLE .. TRANSPORTING NO FIELDS
来查明该值是否已经存在,如果存在,则将其删除 - 否则将值添加到散列 table.
我不确定性能,但我建议对两种方法的合理数据集使用 SAT
并比较结果。