2016-07-13 17 views
0

Say Ich habe zwei Tabellen, employee (mit einer Zeichenspalte id zusammen mit einigen anderen Spalten) und orders, mit einer Säule employeeid und partno, zusammen mit einigen anderen ids.Effizienz in SQL-Abfragen

ist es effizienter,

select * 
from employees, orders 
where id = employeeid 
    and id = '22222' 

oder

select * 
from employees, orders 
where id = '22222' 
    and employeeid = '22222' 

zu sagen oder sie nicht wirklich eine Rolle?

+0

Oracle Query Optimizer ist hochentwickelt genug, um sich um solche Angelegenheiten zu kümmern. Schreibe auf eine Weise, die für dich und andere klar ist. –

+1

Sie sollten den expliziten 'JOIN'-Operator anstelle der alten, veralteten und zerbrechlichen impliziten Joins in der' Where'-Klausel verwenden. –

+0

Suchen Sie nach "Oracle transitive closure" –

Antwort

0

Es sieht so aus, als ob Sie versuchen, einen Join zu machen, und in diesem Fall wird das zweite Formular nicht wie erwartet funktionieren, es wird einen Fehler erzeugen. Die erste würde aussehen wie diese einmal qualifiziert:

select * from employees, orders where orders.id = employees.id and employees.id = '22222' 

Die erste Gleichheit wirklich ist die Bedingung Angabe zu verwenden, wenn Zeilen aus der orders Tabelle Auswahl einer bestimmten Zeile aus der employees Tabelle zu verbinden. Der zweite ist der, der ein konventionelles where Auswahlkriterium ist.

0

Die zweite Prüfung ist nicht notwendig. Oracle ist klug genug zu wissen, dass, wenn A = B und B = C, dann A = C. Du musst es nicht sagen.

Der beste Weg, diese Abfrage zu schreiben, ist

SELECT  * 
FROM  employees e 
INNER JOIN orders o ON o.employeeid = e.id 
WHERE  e.id = '22222' 

Auch wenn die bestmöglichen Plan durch das Lesen alle Zeilen aus orders zu starten ist, wo employeeid ‚22222‘ ist, Oracle es wissen zu tun, auch wenn Sie hat nicht angegeben explizit die Bedingung

AND  o.employeeid = '22222' 

Oracle den Zustand von den anderen folgert, die Sie angegeben haben.