简体   繁体   中英

How optimize longer SQL statement in pl/sql?

I always write very long sql, but for later maintenance. Is one sql statement divide into many statement better? example:

select a.a1, a.a2, b.b3, sum(c.c4), b.b4...b.bn
from A a
inner join B b on a.a1=b.b1
left join C c on a.a2=c.c2
group by a.a1, a.a2, b.b3, b.b4,...,b.bn

I divide into

create temp_table select a.a1, a.a2, sum(c.c4)
from A a
left join C c on a.a2=c.c2
group by a.a1, a.a2

select temp.*, b.b3, b.b4,...b.bn
from temp_table temp
inner join B b on temp.a1=b.b1

But it need to create table in pl/sql.Is there a better way?

Can many sql statement execute faster by Oracle's CHOOSE( soft parse )?

Thanks to experience sharing.

I am a fan of writing SQL as a single statement. I find that approach is better for a variety of reasons:

  • A single statement is easier to maintain.
  • I don't have to name and remember intermediate table names.
  • I might make a mistake and not re-build an intermediate result when the logic changes.
  • The optimizer has a good chance of getting the right execution plan.

That said, the optimizer is not always right. Oracle has a good optimizer and one that makes use of statistics. On occasion, dividing a complex query into pieces can improve performance, under some circumstances:

  • The optimizer is not able to do a good job of estimated the size of the intermediate result. A table "knows" exactly how many rows it has.
  • You add indexes to the intermediate table.
  • You want to re-use results, say for inter-query optimization.

Although these might be beneficial, I myself shy away because of the complexity and maintainability. However, it can sometimes be faster.

It's rarely faster. You're hiding your intent from the optimizer. Generally give it one query with no user functions for optimum performance.

It won't be necessarily faster, as both are run on Oracle server, and your PL/SQL will be compiled anyway.

If you have everything done by one single SQL, you leave the query optimization to Oracle, while if you write your own PL/SQL, you might have more control of how the queries are executed. But sure if your write bad PL/SQL, it will definitely perform worse.

However, I am not sure breaking codes it up really improve maintainability. Unless you are saying you can reuse the broken pieces in other places, which improve code reuse, I would think making it one single statement seems more logical. You can definitely add more comments to explain as much detail as possible to make it clear to whoever read it in the future.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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