2016-11-23 2 views
1
CREATE TABLE ak_temp 
(
    misc_1 varchar2(4000), 
    misc_2 varchar2(4000), 
    time_of_insert timestamp 
); 

Abfrage 1 (Original):In Bezug auf Oracle Abfrage funktionales Verhalten

select * 
    from ak_temp 
where misc_1 in('ankush') 
    or misc_2 in('ankush') 

Abfrage 2:

select * 
    from ak_temp 
where 'ankush' in (misc_1,misc_2) 

Hallo, ich habe etwas ähnliches Problem mit den Abfragen, ich will Abfrage vermeiden 1 Da die Kosten in unserer Live-Umgebung etwas höher liegen, habe ich Abfrage 2 mit geringeren Kosten gefunden. Sind diese beiden Funktionen gleichwertig?

Antwort

3

Die beiden sind funktional gleichwertig und sollten den gleichen Abfrageplan erstellen, also sollte man keinen Leistungsvorteil gegenüber dem anderen haben (oder ein solcher Vorteil wäre winzig). Oracle könnte schlau genug sein, zwei Indizes zu nutzen, einen unter ak_temp(misc_1) und einen unter ak_temp(misc_2).

Allerdings könnten Sie auch interessieren:

select t.* 
from ak_temp t 
where misc_1 = 'ankush' 
union 
select t.* 
from ak_temp t 
where misc_2 = 'ankush'; 

Diese Version wird auf jeden Fall nutzen Indizes nehmen, aber die union kann die Dinge verlangsamen, wenn viele Zeilen die beiden Bedingungen entsprechen.

EDIT:

Um die union zu vermeiden, können Sie tun:

select t.* 
from ak_temp t 
where misc_1 = 'ankush' 
union all 
select t.* 
from ak_temp t 
where misc_2 = 'ankush' and (misc_1 <> 'ankush' and misc_1 is not null); -- or use `lnnvl()` 
+1

'Union' vermieden werden kann und mit' UNION ALL' mit Hilfe von [LNNVL] (https repaced werden: //docs.oracle.com/cd/B19306_01/server.102/b14200/functions078.htm) Funktion, die im unteren Zweig der Abfrage verwendet wird - also 'where misc_2 = 'ankush' AND LNNVL (misc_1 = 'ankush') '. Weitere Informationen finden Sie unter diesem Link: [Oracle - OR Expansion] (https://blogs.oracle.com/optimizer/entry/or_expansion_transformation). BTW - "union" funktioniert nur unter der Annahme, dass die Tabelle keine doppelten Zeilen enthält, andernfalls entspricht sie nicht der origine-Abfrage und führt zu falschen Ergebnissen. – krokodilko

Verwandte Themen