有没有一种方法可以通过避免多次计算某些重复值来提高此查询的性能,例如
regexp_replace(my_source_file, 'TABLE_NAME_|_AM|_PM| TO |.csv|\d+:\d{2}:\d{2}', '')
? 和
to_date(regexp_replace(regexp_replace(my_source_file, 'TABLE_NAME_|_AM|_PM|_TO_|\.csv|\d+:\d{2}:\d{2}', ''), '^(\d{4}- \d+-\d+)_.+$', '\1'), 'YYYY-MM-DD')
这些列计算了 3 次和 2 次,我运行了一些测试,仅通过删除 date_start 列,查询性能提高了大约 20 秒。我在想,如果 oracle 提供了一种更好的方法来保留值并避免多次计算,那就太好了。我也想避免
实际查询:
选择 *
从 (
选择
row_number() over(按 DCRAINTERNALNUMBER、ISSUE_DATE、PERMIT_ID 顺序按 to_date 分区(regexp_replace(regexp_replace(my_source_file, 'TABLE_NAME_|_AM|_PM|_TO_|\.csv|\d+:\d{2}:\d{2}' , ''), '^.+_(\d{4}-\d+-\d+)_$', '\1'), 'YYYY-MM-DD') desc) 作为 row_order,
to_date(regexp_replace(regexp_replace(my_source_file, 'TABLE_NAME_|_AM|_PM|_TO_|\.csv|\d+:\d{2}:\d{2}', ''), '^(\d{4}- \d+-\d+)_.+$', '\1'), 'YYYY-MM-DD') 作为 date_start,
to_date(regexp_replace(regexp_replace(my_source_file, 'TABLE_NAME_|_AM|_PM|_TO_|\.csv|\d+:\d{2}:\d{2}', ''), '^.+_(\d{ 4}-\d+-\d+)_$', '\1'), 'YYYY-MM-DD') 作为 date_end,
温度2.*
来自 schema.TABLE_NAME temp2
) 吨
我还尝试模拟这样的事情以避免多次计算,但由于所有嵌套的选择语句,它并没有改善任何东西......它使查询变慢了大约 25 秒:
选择 *
从 (
选择 row_number() over(按 DCRAINTERNALNUMBER、ISSUE_DATE、PERMIT_ID order by date_end desc 分区)作为 row_order,
温度1.*
从 (
选择 to_date(regexp_replace(date_raw, '^(\d{4}-\d+-\d+)_.+$', '\1'), 'YYYY-MM-DD') 作为 date_start,
to_date(regexp_replace(date_raw, '^.+_(\d{4}-\d+-\d+)_$', '\1'), 'YYYY-MM-DD') 作为 date_end,
温度2.*
从 (
选择 regexp_replace(my_source_file, 'TABLE_NAME_|_AM|_PM|_TO_|\.csv|\d+:\d{2}:\d{2}', '') 作为 date_raw,
温度3.*
来自 schema.TABLE_NAME temp3
) 温度 2
) 温度1
) 吨