我现在在 cognos 10.1 中工作。
我想找到以“AB”、“CE”、“JA”开头的名字。我担心查询的性能,因为查询主题(表)包含大约 1,000,000 多条记录。我应该使用哪种过滤器?
substring ([Participant],1,2) in ('AB', 'CE', 'JA')
或者
[Participant] like 'AB%' or [Participant] like 'CE%' or [Participant] like 'JA%'
哪个执行得更快?
我现在在 cognos 10.1 中工作。
我想找到以“AB”、“CE”、“JA”开头的名字。我担心查询的性能,因为查询主题(表)包含大约 1,000,000 多条记录。我应该使用哪种过滤器?
substring ([Participant],1,2) in ('AB', 'CE', 'JA')
或者
[Participant] like 'AB%' or [Participant] like 'CE%' or [Participant] like 'JA%'
哪个执行得更快?
您在该列上没有索引。所以优化器的唯一选择是全表扫描。坦率地说,过滤器的精确语法不会对成本产生任何影响。
正如 David 所建议的那样,在 上构建基于函数的索引substr(participant,1,2)可能会给您带来一些好处。但只有当你经常运行这种查询时,它才值得。
我过去的经验表明,如果您对以特定字符集开头的字符串感兴趣,那么 LIKE 将产生比 SUBSTR 方法更好的结果,但好处通常只出现在长度足够让优化器相信的字符串索引扫描是有益的。我记得这通常有两个以上的字符,因此您可能看不到您的情况的好处。
使用 substr() 谓词,在没有基于函数的索引的情况下(见下文),您希望的最佳索引访问类型是快速全索引扫描,这通常不如常规索引访问方法Like 可能允许。
但是,可以在 Substr(participant,1,2) 上定义一个可供 substr() 函数使用的基于函数的索引。仅当 substr 上的 start 和 length 参数(在您的情况下为 1 和 2 )是固定的时才值得。如果表修改模式使其通常适合它们,位图索引可能是一个不错的选择