繁体   English   中英

查询调优 Oracle

[英]Query tuning Oracle

在执行以下查询时,运行时间超过 45 分钟。 我已经尽了最大努力调整我的水平,但我没有减少时间。任何人都可以帮助我减少时间。

SELECT * 
FROM dte_Errors be1
WHERE BE1.source_name = 'TOS_TABIN235_1'
  AND (be1.source_name, be1.PK_VALUE) IN (SELECT be.source_name, be.PK_VALUE
                                          FROM dte_Errors be 
                                          INNER JOIN stg_tabin235 stg235 ON substr(BE.pk_Value, 1, 9) = to_char(stg235.package_id) 
                                                                         AND substr(BE.pk_Value, -9) = stg235.departure_date
                                          INNER JOIN dte_ext_lookup lkp ON lkp.package_id = stg235.package_id
                                          INNER JOIN ATC.EX_PACK_235@TROTROREAD_COMRES atcom235 ON atcom235.ext_package_id  = substr(lkp.ext_pkg_id_with_season, 1, 49)
                                          WHERE BE.source_name = 'TOS_TABIN235_1'
                                            AND stg235.departure_date = atcom235.departure_date
                                            AND SUBSTR(atcom235.EXT_PACKAGE_ID, 2, 4) NOT IN  ('IAIL1','ICLL1','IMAL1','ITUL1')
                                            AND stg235.departure_date  BETWEEN '01-NOV-12' AND '31-OCT-16');

查询检查a是否dte_errors记录自身或另一个具有相同source_namepk_value具有一定的标准中的其他表中的匹配。 我当然不能说这是否是查询应该做的。 我认为是这样,但您可能只想检查记录本身。 在这种情况下,从子查询中删除dte_errors访问。

您访问pk_value子字符串,导致dte_errors只是一个普通的日志表,所以这是可以的。 但是,您处理lkp.ext_pkg_id_with_seasonatcom235.ext_package_id子字符串似乎很奇怪。 如果子字符串包含单独的信息,那么它们为什么不单独的列? 这可能已经是您问题的一部分。

至于连接条件,最好直接访问列,而不是转换。 如前所述, pk_value必须用SUBSTR转换,但stg235.package_id必须用TO_CHAR吗? 如果substr(BE.pk_Value,1,9)可以安全地与TO_NUMBER转换(即保证始终只包含数字),那么您应该更改substr(BE.pk_Value,1,9) = to_char(stg235.package_id) to_number(substr(BE.pk_Value,1,9)) = stg235.package_id 如果这不能安全地完成,您可以使用它: to_number(regexp_substr(BE.pk_Value, '^\\d{9}$')) = stg235.package_id

因此,您将dte_errorsdte_ext_lookup都加入到stg235.package_id而不是一个到stg235.package_id而另一个到to_char(stg235.package_id)

你使用的departure_date似乎有点模糊。 stg235.departure_date between '01-NOV-12' AND '31-OCT-16'使用stg235.departure_date between '01-NOV-12' AND '31-OCT-16'的事实让我假设它是DATE类型的列。 (否则,这将只是一个字符串比较,结果相当意外。)但是, '01-NOV-12''31-OCT-16'字符串。 您的 DBMS 可能能够将它们隐式转换为日期,但您依赖于此处的会话设置。 例如,查询会在我的系统上崩溃,因为OCT在德语中没有意义。 改用日期文字: DATE'2012-11-01'DATE'2016-10-31' 您还应该显式转换to_date(substr(BE.pk_Value,-9), 'DD-MON-YY') = stg235.departure_date而不是substr(BE.pk_Value,-9) = stg235.departure_date完成同样的事情隐式(再次依赖会话设置)。

我建议使用以下索引:

  • dte_errors(source_name, pk_value) 因为这是将一个 dte_errors 记录链接到其他记录的方式(前提是确实需要这样做)。
  • dte_errors(source_name, to_number(substr(pk_value,1,9)), to_date(substr(pk_Value,-9), 'DD-MON-YY'), pk_value) 此功能索引可以加速您与stg_tabin235
  • stg_tabin235(package_id, departure_date) 对于与dte_ext_lookupdte_errors以及atcom235
  • dte_ext_lookup(package_id) 当然。
  • dte_ext_lookup(substr(ext_pkg_id_with_season,1,49)) 但最好有一个单独的列ext_package_id和索引。
  • atcom235(ext_package_id, departure_date, substr(atcom235.ext_package_id,2,4)) 因为这些是您用来访问表记录的字段。

1.检查您是否使用索引列连接表,还检查连接和检查( 如何减少具有大量数据的表的查询执行时间“这可能对您有所帮助)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM