【问题标题】:Oracle - Best Sentence: IN(), like, REGEXP_LIKE, otheroneOracle - 最佳句子:IN(), like, REGEXP_LIKE, otherone
【发布时间】:2012-03-30 02:09:21
【问题描述】:

我要回来了,因为我再次需要你的帮助!
以下哪个是更好的选择?

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


    【解决方案1】:

    为什么不直接使用 LIKE?

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

    等等

    REGEXP 函数功能强大但速度不快。

    【讨论】:

    • 是一个简单又不错的选择!!我搜索得越快……“喜欢”比“IN”句子快吗?
    • 我不知道,但我想 IN 与 LIKE 的性能大致相同 - 如果合适,两者都可以使用索引扫描。如果您真的想要所有匹配项,LIKE 会更加健壮,因为您的 IN 列表很容易丢失一个值。
    • 如果这确实是一个时间紧迫的应用程序,您已经遇到了问题,那么您可以考虑使用物化视图,但如果您没有性能问题,我不会这样做。
    【解决方案2】:

    就像@Tony Andrews 所说,我会避免使用 REGEXP_LIKE 选项,因为您不需要它提供的任何 LIKE 所没有的功能。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-08
      • 2021-08-15
      • 2011-07-21
      相关资源
      最近更新 更多