我现在正在使用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%'
哪个会执行得更快?
答案 0 :(得分:2)
我过去的经验表明,如果你对以特定字符集开头的字符串感兴趣,那么LIKE将产生比SUBSTR方法更好的结果,但是这些好处通常只出现在足够长的字符串中。优化者认为索引扫描是有益的。我记得,这通常是两个以上的字符,所以你可能看不到你的好处。
使用substr()谓词,在没有基于函数的索引(见下文)的情况下,您可以期望的最佳索引访问类型是快速全索引扫描,这通常不如常规索引索引访问方法,可能允许。
但是,可以在substr(参与者1,2)上定义一个可由substr()函数使用的基于函数的索引。如果substr(在你的情况下是1和2)的start和length参数是固定的,那将是值得的。如果表修改模式使其适合于它们,则位图索引可能是一个不错的选择
答案 1 :(得分:2)
您没有该列的索引。因此,优化器的唯一选择是全表扫描。坦率地说,过滤器的精确语法不会对该成本产生任何影响。
正如David所说,在substr(participant,1,2)
上构建基于函数的索引可以为您带来一些好处。但是,如果这是你经常运行的那种查询,那么这是值得的。