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

问题描述 投票:3回答:2

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

问题是: 我有一张桌子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'))

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

oracle performance substring sql-like
2个回答
4
投票

为什么不使用LIKE?

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

等等

REGEXP功能强大但不快。


1
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.