Oracle - 最佳句子:IN(),例如REGEXP_LIKE,otherone

时间:2012-03-13 16:28:26

标签: oracle performance substring sql-like

我要回到这里,因为我再次需要你的帮助! 以下哪项是更好的选择?

问题是:
我有myTable['DateYYYYMMDD','field1', 'field2', 'field3', 'MyField'],每天有人插入许多记录。

我必须创建 2(快速)观看次数myView1myView2,用于选择过去30天内创建的记录(来自myTable),并且不同的MYFIELD值。

我找到了一些不同的简单解决方案,我想知道哪个最快:

解决方案1 ​​

--myView1:
select field1, field2, ...., fieldn, MYFIELD
  from myTable
 where DateYYYYMMDD > sysdate -30
   and MYFIELD in ('65643L', '65643L174', '65643L8N',
                   ...
                   '6564L7174', '6564L78N','6564L78N_2O15',
                   ...
                   '6564L78N3226T2_2O15', '6564L78N8N322',
                   '6564L78N6T2', '6564L78N6T2_2O15', 
                   '6564L7-NOTT1-6T2', '6564L76T2',
                   ...
                   '6563XP8N322', '6563XP8N322_2O15',
                   '6563XP8N3226T2', '6563XP8N3226T2_2O15',
                   '6563XP8N6T2', '6563XP-NOTT1-6T2',
                   '6563XP6T2', '9563XPT1',
                   '9563XPT1_2O15',
                   ...
                   '9566UB', '9566UB_2O15',
                   '9566UB174', '9566UB8N',
                   '6566UB8N_2O15', '6566UB8N174',
                   '6566UB8N322',
                   ...)


myView2:
select field1, field2, ...., fieldn, MYFIELD
  from myTable
 where DateYYYYMMDD > sysdate -30
   and MYFIELD in ('9P26_B', '9P26_BN',
                   '9P26_8N',
                   ...
                   '9P26_8NN', '9P26_2O158N9',
                   '556_B', '556_8N',
                   ...
                   '5566NP4P', '696N65T',
                   '696N65T6T2',
                   ...
                   '696W1P_B', '696W1P_8N')

- 解决方案2

--myView1:
select field1, field2, ...., fieldn, MYFIELD
  from myTable
 where DateYYYYMMDD > sysdate -30
   and (MYFIELD like '656%' or MYFIELD like '956%')

--myView2:
select field1, field2, ...., fieldn, MYFIELD
  from myTable
  where DateYYYYMMDD > sysdate -30
    and (MYFIELD like '9P26%' 
         or MYFIELD like '556_%' 
         or MYFIELD like '5566%' 
         or MYFIELD like '696%')

- 解决方案3

--myView1:
select field1, field2, ...., fieldn, MYFIELD
  from myTable
 where DateYYYYMMDD > sysdate -30
   and (REGEXP_LIKE(MYFIELD, '^656') or REGEXP_LIKE(MYFIELD, '^956'))

--myView2:
select field1, field2, ...., fieldn, MYFIELD
  from myTable
 where DateYYYYMMDD > sysdate -30
   and (REGEXP_LIKE(MYFIELD, '^9P26') 
        or REGEXP_LIKE(MYFIELD, '^556_') 
        or REGEXP_LIKE(MYFIELD, '^5566') 
        or REGEXP_LIKE(MYFIELD, '^696'))

我希望这能解释我的需求,如果有更好的解决方案,请提出建议! 非常感谢你!

2 个答案:

答案 0 :(得分:4)

为什么不使用LIKE?

--myView1:
select field1, field2, ...., fieldn, MYFIELD
from myTable
where DateYYYYMMDD > sysdate -30
and
MYFIELD like '656%' or MYFIELD like '956%'

REGEXP功能强大但不快。

答案 1 :(得分:1)

就像@Tony安德鲁斯说的那样,我会避免使用REGEXP_LIKE选项,因为你不需要它提供的任何LIKE没有的功能。

拥有合适的索引比在IN和LIKE之间切换更有帮助。理想情况下,你会在DateYYYYMMDD,MYFIELD上有一个索引。如果你这样做,如果IN / LIKE之间的区别与你如何使用它们有任何明显的区别,我会感到惊讶。