db2 使用生成列与触发列进行性能优化

des4xlb0  于 2023-04-30  发布在  DB2
关注(0)|答案(1)|浏览(175)

bounty还有4天到期。回答此问题可获得+50声望奖励。Thomas希望引起更多关注这个问题。

我正在使用的一个表有一个char(19)列,我们称之为P。由于某些情况,我需要检查是否在P中找到一个10个字符的变量(在P中字符串的末尾)。因此我在做:其中P类似于CONCAT(' %',variableName)。
因此,性能很差。现在一个可能的解决方案是引入一个自动更新/计算的列,我们称之为P10 with char(10)。然后我可以使用P10,比如variableName,这样更好。(特别是在索引方面)。
现在的问题是什么是性能方面更好的方法(我没有找到任何信息)?-Alter TABLE MyTable add column P10 char(10)GENERATED ALWAYS AS substr(P,9,10)

bpsygsoo

bpsygsoo1#

如果您确定列P始终是完整的19个字符长,并且搜索值始终是10个字符长,您可以索引搜索表达式并使用它进行搜索(键入与您索引的内容完全相同)。例如:

create table t (p varchar(19));

insert into t (p) values ('1234567890123456789');
insert into t (p) values ('1234567890555555555');

create index ix1 on t (substr(p, 10, 10));

select * from t where substr(p, 10, 10) = '0123456789';

请参见db<>fiddle上的运行示例。
请注意,substr(p, 10, 10)的键入方式与SELECT中的字母完全相同。
或者,如果您想搜索字符串的最后一个字符,一般的解决方案是索引反向值,然后使用反向模式进行搜索。这样,%将位于搜索模式的末尾,引擎将自然地使用索引。

相关问题