"рдбреЗрдВрд╕_рдХреНрд░реИрдВрдХ ()" рдмрдирд╛рдо "рдореИрдХреНрд╕ ()" рдпрд╛ рдПрдХ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдЕрдВрдд рдХреЗ рд╕рд╛рде рдПрдХ рдЬрд╛рдВрдЪ

рдирдорд╕реНрдХрд╛рд░ рд╕рд╛рдерд┐рдпреЛрдВ!

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВ рдЕрдкрдиреЗ рд╢реЛрдз рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛: "рдФрд░ рдХреНрдпрд╛ рдмреЗрд╣рддрд░ рд╣реИ: dense_rank () рдпрд╛ рдЕрдзрд┐рдХрддрдо ()" рдФрд░, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдпрд╣ рд╢реЛрдз рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛, рдХрдо рд╕реЗ рдХрдо рдореЗрд░реЗ рд▓рд┐рдПред



рдкреГрд╖реНрдарднреВрдорд┐:


рдЗрд╕рд▓рд┐рдП рдРрд╕реЗ рд╕рд┐рддрд╛рд░реЗ рдереЗ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдм рдХрд╛рдо рдХрд░рдиреЗ рдХреА рдЬрд░реВрд░рдд рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЙрд╕ рдХрдВрдкрдиреА рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддрд╛ рд╣реВрдВ рдЬрд┐рд╕реЗ рдореБрдЭреЗ рдЖрдордВрддреНрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддрд╛рдХрд┐ рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХрдВрдкрдиреА рдХреНрдпрд╛ рдХрд░ рд░рд╣реА рд╣реИ, рдЕрдЧрд░ рд╡реЗ рдореБрдЭреЗ рдПрдХ рдкреНрд░рд╕реНрддрд╛рд╡ рдмрдирд╛рддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдХреНрдпрд╛ рд╕реАрдЦреВрдВрдЧрд╛ред рдФрд░ рдЗрд╕рд▓рд┐рдП, рдПрдХ рд╣реА рдкрд▓ рдореЗрдВ, рдореБрдЭреЗ рдПрдХ рдЕрджреНрднреБрдд рдХрдВрдкрдиреА рд╕реЗ рдкреАрдПрд▓ / рдПрд╕рдХреНрдпреВрдПрд▓ рдбреЗрд╡рд▓рдкрд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХрд╛ рдирд┐рдордВрддреНрд░рдг рдорд┐рд▓рд╛ред рдЙрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрд╛ рдХрд┐ рдореИрдВ рдкреНрдпрд╛рд░ рдореЗрдВ рд╣реВрдБ рдФрд░ рдореИрдВ рд╡рд╣рд╛рдБ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдБред рдЬрдм рдореИрдВ рд╕реНрд╡рдпрдВ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЖрдпрд╛ рдерд╛ рдФрд░ рдЙрд╕ рдХреНрд╖рдг рдЬрдм рд╕рдм рдХреБрдЫ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рд╕рд┐рд░реНрдл рдЗрд╕рд▓рд┐рдП рд╢реБрд░реВ рдирд╣реАрдВ рд╣реБрдЖ рдХреНрдпреЛрдВрдХрд┐ рд▓реЛрдЧ рдорд┐рд▓реЗ, рдШрдВрдЯрд╛ рдХреЙрдлреА рдХреА рдкреЗрд╢рдХрд╢ рдХреА, рдЖрджрд┐, рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рдордЭ рдЧрдпрд╛ рдерд╛ рдХрд┐ рдореИрдВ рдХреНрдпрд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдпрд╣рд╛рдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдХрд╛рдо рдХрд░рдирд╛ред



рдЯреАрдо рд▓реАрдбрд░ рдХреЗ рд╕рд╛рде рд╕рднреА рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░реЛрдВ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдПрдХ рдмрд╛рд░ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЕрдиреБрд░реЛрдз рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛, рдЕрдиреНрдпрдерд╛ рд╕рдм рдХреБрдЫ рдореЛрдб рдореЗрдВ рдЪрд▓рд╛ рдЧрдпрд╛: рд╕рд╡рд╛рд▓-рдЬрд╡рд╛рдмред



рдХрд╛рд░реНрдп рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдерд╛:

"рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╕рдВрдЪрд╛рд▓рди рдХреА рдПрдХ рддрд╛рд▓рд┐рдХрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ 4 рдХреЙрд▓рдо рд╣реИрдВ: рдСрдкрд░реЗрд╢рди рдЖрдИрдбреА, рдХреНрд▓рд╛рдЗрдВрдЯ рдЖрдИрдбреА, рдСрдкрд░реЗрд╢рди рдХреА рддрд╛рд░реАрдЦ, рд▓реЗрдирджреЗрди рд░рд╛рд╢рд┐ред "рдкреНрд░рддреНрдпреЗрдХ рдЧреНрд░рд╛рд╣рдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЕрд╡рдзрд┐ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХрддрдо рд░рд╛рд╢рд┐ рдХреЗ рд╕рд╛рде рдирд╡реАрдирддрдо рд▓реЗрдирджреЗрди рдХреЛ рд╡рд╛рдкрд╕ рд▓реЗрдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред"



рдФрд░ рдореИрдВ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЗрд╕ рддрд░рд╣ рд╕реЗ рд▓рд┐рдЦрдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдиреЗ рд▓рдЧрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рд╕реБрдВрджрд░ рдФрд░ рдкреНрд░рднрд╛рд╡реА рд╣реИред рдФрд░ рдУрд░реЗрдХрд▓ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореИрдВрдиреЗ рдЯреЗрд░рд╛рдбрд╛рдЯрд╛ рдХреЗ рд╕рд╛рде рднреА рдХрд╛рдо рдХрд┐рдпрд╛ рдФрд░ рдЙрд╕ рд╕рдордп рдореЗрд░реЗ рдорд╕реНрддрд┐рд╖реНрдХ рдиреЗ рдпрд╣ рдЕрдиреБрд░реЛрдз рдЬрд╛рд░реА рдХрд┐рдпрд╛:



рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
/*id  - oper_id, id  - client_id,   - input_date,   - amount*/ select t.* , max(t.amount) over (partition by t.client_id) as m_a from some_table t qualify oper_id = max(t.oper_id) over (partition by t.client_id) where m_a = amount
      
      



рдФрд░ рдЯреЗрд░рд╛рдбрд╛рдЯрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдХрд╛рдо рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдЕрд▓рдВрдХреГрдд рдХреЗ рд╕рд╛рде рдирд╣реАрдВред рдФрд░ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдпрд╛рдж рд░рдЦрдирд╛ рдХрд┐ рдУрд░реЗрдХрд▓ рдореЗрдВ рдХреЛрдИ "рдпреЛрдЧреНрдп" рдирд╣реАрдВ рд╣реИ, рдореИрдВрдиреЗ рдХрд╛рдЧрдЬ рдХреЗ рдПрдХ рдЯреБрдХрдбрд╝реЗ рдкрд░ рд▓рд┐рдЦрд╛ рдЬреИрд╕реЗ рдХреБрдЫ:

рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 select t.* from some_table t where amount = max(t.oper_id) over (partition by t.client_id)
      
      







рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореБрдЭрд╕реЗ рдпрд╣ рд╕рд╡рд╛рд▓ рдкреВрдЫрд╛ рдЧрдпрд╛ рдерд╛: "рдЕрдзрд┐рдХрддрдо (рдХреНрдпреЛрдВ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдШрдиреЗ_рд░реИрдВрдХ ()?", рдореБрдЭреЗ рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдореИрдВрдиреЗ рдХреНрдпрд╛ рдЙрддреНрддрд░ рджрд┐рдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдЗрд╕ рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рдерд╛: "рдореИрдВрдиреЗ рдЕрдзрд┐рдХрддрдо () рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдзрд┐рдХ рдмрд╛рд░ рдХрд┐рдпрд╛ рдФрд░ рдЕрдзрд┐рдХ рдпрд╛ рдХрдо рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдмрд╕ рдХрд▓реНрдкрдирд╛ рдХреАрдЬрд┐рдП рдХрд┐ рд╡рд╣ рдореЗрд░реЗ рдкрд╛рд╕ рдХреНрдпрд╛ рд▓реМрдЯреЗрдЧрд╛, dense_rank () рдХреЗ рд╡рд┐рдкрд░реАрддред " рдореИрдВрдиреЗ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЖрдЧреЗ рдирд╣реАрдВ рдмрддрд╛рдпрд╛, рдореИрдВ рдмрд╕ рдЗрддрдирд╛ рд╣реА рдХрд╣реВрдВрдЧрд╛ рдХрд┐, рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдордирд╛ рдХрд░ рджрд┐рдпрд╛ред рдмрд╛рдж рдореЗрдВ, рдШрд░ рдкрд░, рд╕рдм рдХреБрдЫ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░рдиреЗ рдФрд░ рдЧрд▓рддрд┐рдпреЛрдВ рдХреЛ рд╕рдордЭрдиреЗ рдХреЗ рдкреНрд░рдпрд╛рд╕ рдореЗрдВ, рдореИрдВ рдЗрд╕ рдирд┐рд╖реНрдХрд░реНрд╖ рдкрд░ рдкрд╣реБрдВрдЪрд╛ рдХрд┐ рдореИрдВ рд╡рд╣рд╛рдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХрд╛рдо рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ рдФрд░ рдЪрд┐рдВрддрд┐рдд рдерд╛, рдЕрдиреНрдпрдерд╛ рдореИрдВ рд╕рд╛рдХреНрд╖рд╛рддреНрдХрд╛рд░ рдХреЗ рджреМрд░рд╛рди рдореЗрд░реЗ рд╕рд┐рд░ рдореЗрдВ рд╣реЛ рд░рд╣реА рдЧрдВрджрдЧреА рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдпрд╣ рдХреБрдЫ рд╕рдирд╕рдиреАрдЦреЗрдЬ рдерд╛ рдЬрдм рдПрдХ рдЫрд╛рддреНрд░ рдПрдХ рд▓рдбрд╝рдХреА рдХреЗ рд╕рд╛рде рдмрд╛рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рдмрд╛рд▓рд╡рд╛рдбрд╝реА рд╕реЗ рдЧреБрдкреНрдд рд░реВрдк рд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрди рдкреНрд░рдпрд╛рд╕реЛрдВ рдиреЗ рдЙрд╕реЗ рдПрдХ рдЕрдЬреАрдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдбрд╛рд▓ рджрд┐рдпрд╛ред рдЙрд╕реА рддрд░рд╣, рд╢рд╛рдВрдд рдФрд░ рдкрд░реНрдпрд╛рдкреНрдд рджрд┐рдЦрдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдПрдХ рдмреЗрдХрд╛рд░ рд╡рд┐рд╢реЗрд╖рдЬреНрдЮ рд╕рд╛рдмрд┐рдд рдХрд┐рдпрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреА рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдШрдиреЗ_рдХрд░ () рдпрд╛ рдЕрдзрд┐рдХрддрдо () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред



рдЕрдзреНрдпрдпрди


рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рдЖрдБрдЦреЛрдВ рд╕реЗ рд╕рдм рдХреБрдЫ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдЬреЛ рдореИрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреЗ рд╣рд╛рдереЛрдВ рд╕реЗ рдЫреВ рд╕рдХрддрд╛ рд╣реВрдБ - рдореИрдВрдиреЗ рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рд╕реЗрдЯ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рд╣реИ:



рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 /* */ create table habr_test_table_220414 ( oper_id number, client_id number, input_date date, amount number, constraint habr_test_table_220414_pk primary key (oper_id) ); grant all on habr_test_table_220414 to public; /* ,   oper_id   -  */ create sequence habr_test_sequence_220414 increment by 1; grant all on habr_test_sequence_220414 to public; /* ,     ,    oper_id    */ create trigger habr_test_trigger_220414 before insert on habr_test_table_220414 for each row begin :new.oper_id := habr_test_sequence_220414.nextval; end; /*           */ /*     ,     10- */ /* ,     cost = 3,   20000 ,    */ /*   -          counter */ declare counter number := 10000; i number := 0; begin loop insert into habr_test_table_220414 ( client_id , input_date , amount ) values ( trunc (dbms_random.value (1, 11)) , to_date(trunc(dbms_random.value(to_char(date '2013-01-01','j'),to_char(date '2013-12-31','j'))),'j') , trunc (dbms_random.value (1, 100000)) ); exit when (i = counter); i := i + 1; end loop; commit; /*   ,         */ /*  :*/ insert into habr_test_table_220414 select * from habr_test_table_220414; commit; /*   id   */ end;
      
      







рддреЛ, рдкрд░реАрдХреНрд╖рдг рдбреЗрдЯрд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдпрд╣ рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕реНрд╡рдпрдВ рдкреНрд░рд╢реНрдиред рд╣рдорд╛рд░реА 20,000 рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЛ рди рдХрд╛рдЯрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдЕрдкрдиреЗ рдЪрдпрди рдХреЛ рдХрд┐рд╕реА рд╡рд┐рд╢реЗрд╖ рдЕрд╡рдзрд┐ рддрдХ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдХреМрди рд╕реА рд╡рд┐рдзрд┐ рдмреЗрд╣рддрд░ рдФрд░ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реИ, рдФрд░
 where input_date between to_date('01.01.2013','dd.mm.yyyy') and to_date('01.05.2013','dd.mm.yyyy')
      
      



рд╣рдо рдмрд╛рдж рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред



рдЕрдзрд┐рдХрддрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╡реЗрд░реА ()
 select * from ( select c.* , max(c.oper_id) over (partition by c.client_id) as m_o/*max_operation*/ from ( select t.* , max(t.amount) over (partition by t.client_id) as m_a/*max_amount*/ from habr_test_table_220414 t ) c where c.m_a = c.amount ) where m_o = oper_id;
      
      





Dense_rank () рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╡реЗрд░реА
 select * from ( select c.* , dense_rank() over (partition by c.client_id order by c.oper_id desc) as m_o/*max_operation*/ from ( select t.* , dense_rank() over (partition by t.client_id order by t.amount desc) as m_a/*max_amount*/ from habr_test_table_220414 t ) c where c.m_a = 1 ) where m_o = 1;
      
      







рдЗрди рдкреНрд░рд╢реНрдиреЛрдВ рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдпреЛрдЬрдирд╛рдПрдБ (pl / sql рдбреЗрд╡рд▓рдкрд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд):



рдЕрдзрд┐рдХрддрдо:

рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
рдЫрд╡рд┐






Dense_rank:

рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
рдЫрд╡рд┐








рд▓реЗрдХрд┐рди рдпреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдпреЛрдЬрдирд╛рдПрдВ рд╣реИрдВ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЛрдЧреЛрдВ рдХреЛ SQLTUNE рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛:



рддреИрдпрд╛рд░реА:
 /*   max()*/ DECLARE my_task_name varchar2(30);my_sqltext clob;rep_tuning clob; BEGIN Begin DBMS_SQLTUNE.DROP_TUNING_TASK('my_sql_tuning_task_max'); exception when others then NULL; end; MY_SQLTEXT:= 'select * from ( select c.* , max(c.oper_id) over (partition by c.client_id) as m_o/*max_operation*/ from ( select t.* , max(t.amount) over (partition by t.client_id) as m_a/*max_amount*/ from habr_test_table_220414 t ) c where c.m_a = c.amount ) where m_o = oper_id'; MY_TASK_NAME:=DBMS_SQLTUNE.CREATE_TUNING_TASK(SQL_TEXT => my_sqltext, TIME_LIMIT => 60, --     TASK_NAME =>'my_sql_tuning_task_max', DESCRIPTION=> my_task_name , SCOPE => DBMS_SQLTUNE.scope_comprehensive); begin DBMS_SQLTUNE.EXECUTE_TUNING_TASK('my_sql_tuning_task_max'); exception when others then null; end; END; /*   dense_rank()*/ DECLARE my_task_name varchar2(30);my_sqltext clob;rep_tuning clob; BEGIN Begin DBMS_SQLTUNE.DROP_TUNING_TASK('my_sql_tuning_task_dense'); exception when others then NULL; end; MY_SQLTEXT:= 'select * from ( select c.* , dense_rank() over (partition by c.client_id order by c.oper_id desc) as m_o/*max_operation*/ from ( select t.* , dense_rank() over (partition by t.client_id order by t.amount desc) as m_a/*max_amount*/ from habr_test_table_220414 t ) c where c.m_a = 1 ) where m_o = 1'; MY_TASK_NAME:=DBMS_SQLTUNE.CREATE_TUNING_TASK(SQL_TEXT => my_sqltext, TIME_LIMIT => 60, --     TASK_NAME =>'my_sql_tuning_task_dense', DESCRIPTION=> my_task_name , SCOPE => DBMS_SQLTUNE.scope_comprehensive); begin DBMS_SQLTUNE.EXECUTE_TUNING_TASK('my_sql_tuning_task_dense'); exception when others then null; end; END; /* ,              */ /* ,     */
      
      



рдФрд░ рдпреЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдпреЛрдЬрдирд╛рдПрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддреА рд╣реИрдВ:



рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('my_sql_tuning_task_max') FROM DUAL;
      
      







рдЫрд╡рд┐



 SELECT DBMS_SQLTUNE.REPORT_TUNING_TASK('my_sql_tuning_task_dense') FROM DUAL;
      
      







рдЫрд╡рд┐








рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдпреЛрдЬрдирд╛ рдХреЗ рдЕрд▓рд╛рд╡рд╛, SQLTUNE рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ рднреА рджреЗрддрд╛ рд╣реИ, рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдЖрдВрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреНрд▓реЗрдЯ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреНрд░рд╢реНрди рд╕рдорд╛рди рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рд╣реИрдВред



рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдкрд░рд┐рдгрд╛рдо
рдЗрди рд╕рднреА рдЬреЛрдбрд╝рддреЛрдбрд╝ рдХреЗ рдмрд╛рдж, рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВ рдЖрдкрд╕реЗ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реВрдВ, рдХрд┐ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╕рдордп, dense_rank () рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХрддрдо () 2 рдЧреБрдирд╛ рддреЗрдЬреА рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдзреЗ рдкреНрд░реЛрд╕реЗрд╕рд░ рд╕рдордп рдХреЛ рдЦрд╛рддрд╛ рд╣реИред рдареАрдХ рд╣реИ, рдпрд╣ рдмрд┐рдирд╛ рдпреЛрдЬрдирд╛рдУрдВ рдФрд░ рдЕрдиреНрдп рдЪреАрдЬреЛрдВ рдХреЗ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЕрдзрд┐рдХрддрдо () рдХреЗрд╡рд▓ рд╕рдмрд╕реЗ рдмрдбрд╝реА рдЦреЛрдЬ рд╣реИ, рдЬрдмрдХрд┐ dense_rank (), рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЫрдВрдЯрд╛рдИ, рдФрд░ рдЙрд╕рдХреЗ рдмрд╛рдж рд╣реА рдХреНрд░рдорд╛рдВрдХрди рд╣реЛрддрд╛ рд╣реИред



рд▓реЗрдХрд┐рди рд╡рд╣ рдирд╣реАрдВ рдерд╛ рдЬрд┐рд╕рдиреЗ рдореБрдЭреЗ рдПрдХ рд▓реЗрдЦ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛ред



рдПрдХрд╛рдПрдХ
рдкрд░реАрдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд░реВрдк рд╕реЗ рддрд╛рд▓рд┐рдХрд╛ рднрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдореИрдВрдиреЗ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рд▓рд┐рдкрд┐рдпреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛, рдФрд░ рдкрд╣рд▓реА рдмрд╛рд░ рд╕рдм рдХреБрдЫ рд▓рдЧрднрдЧ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╣реБрдЖ, рдФрд░ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ order by



рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ order by



ред



рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 /*  10   */ insert into habr_test_table_220414...; .... .... insert into habr_test_table_220414...; commit; select * from habr_test_table_220414 t order by t.client_id; /*    :*/ insert into habr_test_table_220414 select * from habr_test_table_220414; commit; select * from habr_test_table_220414 t order by t.client_id; /*       */
      
      



рдЙрд╕рдХреЗ рдмрд╛рдж, рдореИрдВрдиреЗ рдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЛ рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ "рдЕрдзрд┐рдХрддрдо () рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз" order by



рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╕рдВрд╢реЛрдзрд┐рдд order by



ред
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ:
 select * from ( select c.* , max(c.oper_id) over (partition by c.client_id) as m_o/*max_operation*/ from ( select t.* , max(t.amount) over (partition by t.client_id) as m_a/*max_amount*/ from habr_test_table_220414 t order by t.client_id ) c where c.m_a = c.amount ) where m_o = oper_id
      
      







рдмрд╛рдж рдореЗрдВ рдореИрдВрдиреЗ "рдШрдиреЗ_рд░реИрдВрдХ () рдХреЗ рд╕рд╛рде рдПрдХ рдХреНрд╡реЗрд░реА рд▓рд┐рдЦреА" рдФрд░ рдпреЛрдЬрдирд╛рдУрдВ рдХреА рддреБрд▓рдирд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЕрдзрд┐рдХрддрдо () рдХреЗ рд╕рд╛рде рдПрдХ рдкреНрд░рд╢реНрди рдХреЗ order by



рдЗрд╕ рджреБрд░реНрднрд╛рд╡рдирд╛рдкреВрд░реНрдг order by



рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддреЗ рд╣реБрдП, рдореИрдВрдиреЗ order by



рд╣рдЯрд╛ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд▓рд╛рдЧрдд рдХреЛ рджреЗрдЦрд╛ рдФрд░ рдпрд╛рдж рдХрд┐рдпрд╛ред рдФрд░ рдЬрдм рдореИрдВрдиреЗ order by



рдмрд┐рдирд╛ рдЕрдзрд┐рдХрддрдо () рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдореЗрдВ рд▓рд╛рдЧрдд рджреЗрдЦреА order by



рдмрд╣реБрдд рдЖрд╢реНрдЪрд░реНрдп рд╣реБрдЖ, рдХреНрдпреЛрдВрдХрд┐:



рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдпреЛрдЬрдирд╛
рдЫрд╡рд┐




SQLTUNE рд╕реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдпреЛрдЬрдирд╛
рдЫрд╡рд┐








рд╡реИрд╕реЗ рднреА, рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдореИрдВ рдмрд╣реБрдд рд╣реИрд░рд╛рди рдерд╛ - рдХреБрдЫ рднреА рдирд╣реАрдВ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП ... рдпрд╣ рдХреИрд╕реЗ рд╣реБрдЖ? 10 рдмрд╛рд░ рдЕрдиреБрд░реЛрдз order by



рдЧрддрд┐ order by



рдХреНрдпреЛрдВ рджрд┐рдпрд╛? рдореИрдВрдиреЗ рдЯреНрд░реЗрд╕ рдореЗрдВ рдЬрд╡рд╛рдм рдЦреЛрдЬрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдореИрдВ рдареАрдХ рд╕реЗ рдирд╣реАрдВ рд▓рд┐рдЦреВрдВрдЧрд╛ рдХрд┐ рдУрд░реЗрдХрд▓ рдореЗрдВ рдЯреНрд░реИрдХ рдХреЛ рдХреИрд╕реЗ рд╢реВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдП, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╖рдп рд╣реИ, рдФрд░ рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рде рд▓реЗрдЦ рд╡рд░реНрд▓реНрдб рд╡рд╛рдЗрдб рд╡реЗрдм рдкрд░ рдвреВрдВрдврдирд╛ рдЖрд╕рд╛рди рд╣реИред рдореИрдВ рдХреЗрд╡рд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдПрдХ рд╕реЗрдЯ рдкреНрд░рджрд╛рди рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдореИрдВрдиреЗ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рд╣реИ, рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрд╛рдпрд╛, рддрдм рд╕реЗ рдЗрд╕рдиреЗ рдореЗрд░реА рдорджрдж рдХреА:



рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
рдЯреНрд░реЗрд╕рд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдкрд░ рд▓реЗрдЦ рдХрд╛ рд▓рд┐рдВрдХ
 alter system set timed_statistics=true; alter session set tracefile_identifier='test_for_habr_220414'; alter session set events '10046 trace name context forever, level 12'; select * from ( select c.* , max(c.oper_id) over (partition by c.client_id) as m_o/*max_operation*/ from ( select t.* , max(t.amount) over (partition by t.client_id) as m_a/*max_amount*/ from habr_test_table_220414 t order by client_id ) c where c.m_a = c.amount ) where m_o = oper_id; alter session set events '10046 trace name context off'; select value from v$parameter p where name='user_dump_dest'; /*      tkprof*/ /*     'test_for_habr_220414'*/
      
      



рдЯреНрд░реИрдХ рдореЗрдВ, рд╣рдо рдПрдХ рдРрд╕реЗ рдЯреБрдХрдбрд╝реЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреБрд░реЛрдз рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╕рдордп рдУрд░реЗрдХрд▓ рдХреА рдХреНрд░рд┐рдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИ:
рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 select * from ( select c.* , max(c.oper_id) over (partition by c.client_id) as m_o/*max_operation*/ from ( select t.* , max(t.amount) over (partition by t.client_id) as m_a/*max_amount*/ from habr_test_table_220414 t order by client_id ) c where c.m_a = c.amount ) where m_o = oper_id call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.01 0.00 0 1 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 1 0.03 0.02 0 84 0 10 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 3 0.04 0.03 0 85 0 10 Misses in library cache during parse: 1 Optimizer mode: ALL_ROWS Parsing user id: SYS Rows Row Source Operation ----- --------------------------------------------------- 10 VIEW (cr=84 pr=0 pw=0 time=28155 us cost=23 size=1592850 card=21525) 20 WINDOW BUFFER (cr=84 pr=0 pw=0 time=28145 us cost=23 size=1313025 card=21525) 20 VIEW (cr=84 pr=0 pw=0 time=21628 us cost=23 size=1313025 card=21525) 22010 WINDOW SORT(cr=84 pr=0 pw=0 time=24393 us cost=23 size=1033200 card=21525) 22010 TABLE ACCESS FULL HABR_TEST_TABLE_220414(cr=84 pr=0 pw=0 time=5172 us cost=23 size=1033200 card=21525)
      
      







рдкрд░рд┐рдгрд╛рдо


рдЗрд╕рд╕реЗ рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдФрд░ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдпреЛрдЬрдирд╛ рджреЛрдиреЛрдВ рд╣реА рдЧрд▓рдд рдирд╣реАрдВ рд╣реИрдВ, рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ рдкрдХрдбрд╝ рдирд╣реАрдВ рд╣реИ, рдФрд░ рдЖрдк рджрд╕ рдЧреБрдирд╛ рддреНрд╡рд░рдг рдХрд╛ рдЖрдирдВрдж рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдХреНрдпрд╛ рдРрд╕рд╛ рд╣реИ?



рдкреБрдирд╢реНрдЪ рдореИрдВ рдЕрднреА рднреА рдЗрд╕ рд╕рд╡рд╛рд▓ рдХрд╛ рдЬрд╡рд╛рдм рдирд╣реАрдВ рджреЗ рд╕рдХрд╛ рдФрд░ рдЕрднреА рднреА рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдЖрджреЗрд╢ рджреНрд╡рд╛рд░рд╛ рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд╕рд╛рде рдЕрдиреБрд░реЛрдз рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рддреНрд╡рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЗрд╕ рдкрд▓ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдЬрд╛рд░реА рд░рдЦреВрдВрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдореИрдВ рдЖрдкрд╕реЗ рдЖрдЧреНрд░рд╣ рдХрд░рддрд╛ рд╣реВрдВред рдФрд░ рдХреНрдпрд╛ рдУрд░реЗрдХрд▓ рдХреЗ рдЫрд┐рдкреЗ рд╣реБрдП рд░рд╣рд╕реНрдп рд╣рдорд╛рд░реЗ рд╕рд╛рдордиреЗ рдЖ рд╕рдХрддреЗ рд╣реИрдВ!



PPS рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдк рд╕рднреА рдХрд╛ рдзрдиреНрдпрд╡рд╛рдж! рдпрджрд┐ рдЖрдкрдиреЗ рдореЗрд░реЗ рд╕рд╛рде рдПрдХ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рд╣реИ - рддреЛ рдЕрдкрдиреЗ рд▓рд┐рдП рдЖрдзрд╛рд░ рд╕рд╛рдл рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ, рдЦрд╛рд╕рдХрд░ рдЕрдЧрд░ рдпрд╣ рдХрд┐рд╕реА рдмреИрдВрдХ рдХрд╛ рдареЗрд╕ рд╣реИред



рдЫрд┐рдкрд╛ рд╣реБрдЖ рдкрд╛рда
 drop trigger habr_test_trigger_220414; drop sequence habr_test_sequence_220414; drop table habr_test_table_220414;
      
      






All Articles