REGEXP_LIKE 的任何替代方案,因为它会导致性能问题

0 sql oracle plsql query-optimization

我们有一个 sql 性能不佳。我已经修复了执行计划,但 REGEXP_LIKE 导致高缓冲区获取,并且还在运行时做出贡献。我可以在 sql 中使用的任何替代方案。问题是 AND REGEXP_LIKE (xx3la. assembly_type, '^I ..*')

/* Formatted on 1/6/2023 2:07:28 PM (QP5 v5.318) */
SELECT 1
  FROM apps.oe_order_lines_all  ola
       JOIN APPS.OE_order_headers_all oh
           ON oh.Header_Id = ola.header_id AND oh.org_id = ola.org_id
       JOIN inv.mtl_parameters org
           ON ola.ship_from_org_id = org.ORGANIZATION_ID
       INNER JOIN ont.oe_transaction_types_tl tt
           ON     tt.transaction_type_id = oh.order_type_id
              AND tt.language = 'US'
              AND LPAD (UPPER (tt.name), 4) NOT IN ('TRIA',
                                                    'WARR',
                                                    'REPA',
                                                    'DUMM',
                                                    'DEMO',
                                                    'GOOD',
                                                    'INTE',
                                                    'CRED',
                                                    'EVAL',
                                                    'INVO')      --- ('STAND')
       JOIN apps.mtl_system_items_b msib
           ON     ola.Ordered_item_Id = msib.inventory_item_id
              AND msib.ORGANIZATION_ID = org.ORGANIZATION_ID
       INNER JOIN xxom.xxom_3lp_sym_ora_order_hdr xx3ha
           ON xx3ha.header_id = oh.header_id
       INNER JOIN xxom.xxom_3lp_sym_ora_order_lines xx3la
           ON xx3la.header_id = ola.header_id AND xx3la.line_id = ola.line_id
       LEFT JOIN
       (SELECT msib.Inventory_item_id,
               mcb.segment1 ProductionLine,
               msib.ORGANIZATION_ID,
               msib.item_type,
               msib.Fixed_LEAD_Time
          FROM apps.mtl_system_items_b  msib
               JOIN inv.mtl_parameters org
                   ON msib.ORGANIZATION_ID = org.ORGANIZATION_ID
               JOIN apps.MTL_ITEM_CATEGORIES ic
                   ON     ic.INVENTORY_ITEM_ID = msib.INVENTORY_ITEM_ID
                      AND msib.organization_id = ic.ORGANIZATION_ID
               JOIN apps.mtl_categories_b mcb
                   ON mcb.CATEGORY_ID = ic.CATEGORY_ID
         WHERE mcb.ENABLED_FLAG = 'Y' AND ic.CATEGORY_SET_ID = 1100009407) im
           ON     ola.Ordered_item_Id = im.inventory_item_id
              AND org.organization_id = im.organization_id
       LEFT JOIN (  SELECT Header_Id,
                           Line_Id,
                           WIP_ORDER_NUMBER,
                           MAX (PRODUCT_LINE) PRODUCT_LINE
                      FROM XXRMT.XXURD_SO_UNIT
                  GROUP BY Header_Id, Line_Id, WIP_ORDER_NUMBER) u
           ON u.Header_Id = oh.Header_Id AND u.Line_Id = ola.Line_Id
       LEFT JOIN wip.wip_discrete_jobs wdj
           ON     wdj.source_line_id = ola.line_id
              AND wdj.status_type IN (1,
                                      2,
                                      3,
                                      4,
                                      5,
                                      12)
       LEFT JOIN wip.wip_entities we ON we.wip_entity_id = wdj.wip_entity_id
       LEFT JOIN xxrmt.xxont_som_scheduler adm
           ON adm.subscriber_id = xx3la.order_admin
       LEFT JOIN apps.oe_order_lines_all ol2
           ON     ol2.ato_line_id = ola.line_id
              AND ol2.item_type_code IN ('CONFIG')
       LEFT JOIN
       (SELECT mso.source_organization_code,
               mso.vendor_name,
               mso.vendor_site,
               msa.sourcing_rule_name,
               DECODE (mso.source_type,
                       1, 'TRANSFER',
                       2, 'MAKE',
                       3, 'BUY')
                   SourceType,
               msa.inventory_item_id,
               msa.organization_id
          FROM apps.mrp_sr_assignments_v  msa
               --join inv.mtl_parameters    org  on msa.organization_id = org.organization_id
               INNER JOIN apps.mrp_sourcing_rules msr
                   ON msr.sourcing_rule_id = msa.sourcing_rule_id
               INNER JOIN apps.mrp_sr_receipt_org_v msro
                   ON msr.sourcing_rule_id = msro.sourcing_rule_id
               INNER JOIN apps.mrp_sr_source_org_v mso
                   ON mso.sr_receipt_id = msro.sr_receipt_id AND mso.RANK = 1
         WHERE     msa.assignment_set_id = 561
               AND (msro.disable_date IS NULL OR disable_date >= SYSDATE))
       srd
           ON     srd.inventory_item_id = ol2.inventory_item_id
              AND srd.organization_id = ola.ship_from_org_id
 WHERE     org.organization_code IN ('DRM')
       AND ola.Flow_Status_Code <> 'CANCELLED'
       AND NVL (oh.Cancelled_flag, 'N') = 'N'
       AND oh.Flow_Status_Code <> 'CANCELLED'
       AND ola.booked_flag = 'Y'
       AND oh.booked_date IS NOT NULL
       AND TRUNC (oh.booked_date) >= TO_DATE ('2022-12-01', 'YYYY-MM-DD')
       AND msib.item_type NOT IN ('P',
                                  'B/R',
                                  'OP',
                                  'SVC',
                                  'OP',
                                  'EMR_PURCH')
       AND (   ola.item_type_code IN ('CONFIG', 'MODEL')
            OR (    ola.item_type_code IN ('CLASS')
                AND REGEXP_LIKE (xx3la.assembly_type, '^I..*'))
            OR (    ola.item_type_code IN ('CLASS')
                AND u.PRODUCT_LINE IS NOT NULL
                AND xx3la.model_string IS NOT NULL
                AND msib.segment1 NOT IN ('R-CAP1199', 'R-38-315'))
            OR (    ola.item_type_code = 'STANDARD'
                AND xx3la.assembly_type IS NULL))
                
Run Code Online (Sandbox Code Playgroud)

以某种方式修复了 BG 问题,但 REGEXP_LIKE 仍然是一个问题

Tim*_*sen 5

您当前的正则表达式断言:

REGEXP_LIKE(xx3la.assembly_type, '^I..*')
Run Code Online (Sandbox Code Playgroud)

可以用普通的写法LIKE

xx3la.assembly_type LIKE 'I_%'
Run Code Online (Sandbox Code Playgroud)

请注意,上述LIKE版本应该能够使用assembly_type. 话虽如此,我怀疑该REGEXP_LIKE调用是否是这种规模和复杂性的查询中存在的唯一主要性能瓶颈。您应该运行EXPLAIN查询来查看执行计划。

  • 什么是“正确的计划”?无论如何,这个答案似乎解决了最初提出的问题。计划选择是另一个问题 (3认同)
  • 实际上,任何人都无法为您的查询性能提供帮助。这需要组织内部有人可以检查等待数据以确定问题所在。不要假设它是 REGEXP。仅仅因为添加它会使事情变得糟糕并不意味着它有错......任何改变都可能导致执行计划发生重大变化。通常性能不佳是由于基数错误估计导致连接方法或连接顺序不理想。恐怕这样的论坛不可能提供有意义的帮助。 (2认同)