performance van query met IN in where clause

Status
Niet open voor verdere reacties.

lucienschenk

Nieuwe gebruiker
Lid geworden
9 dec 2007
Berichten
2
hoi,

ik zoek (A) in tabel Activity, alle Activity records van 1 employee,
waar het veld Activity.employee_id = deze employee
en daarbij,
(B) als in een andere tabel (Employee_Activity ) staat dat ie zijdelings iets met een activiteit te maken heeft moeten die er ook staan.

tabel Activity 1.000.000 records,
tabel Employee_Activity leeg
zoek acties gecombineerd uitvoeren duurt minuten.
zoek actie (A) los is flits
zoek actie (B) los is flits

waarschijnlijk is de IN in de where een performance killer.

weet iemand een slimmere where clause?

tnx lucien

************************************************

select * from Activity
WHERE

(Activity.employee_id = '3b63a7f4-10e1-4149-adb2-3dd27a401371')

OR

(Activity.id IN (SELECT Employee_Activity.activity_id FROM Employee_Activity WHERE (Employee_Activity.employee_id = '3b63a7f4-10e1-4149-adb2-3dd27a401371' )))
 
Hoi.

Met de aangeleverde gegevens is het moeilijk om een passende query te maken. Voor het optimaal raadplegen komt er heel wat meer bij kijken. Wat voor de snelheid belangrijk is is dat je voor je zoekopdracht gebruik maakt van indexen. In het meest gunstige geval kun je gebruik maken van een zongenaamde 'covering index' (ofwel een omvattende index) zodat een raadpleging in de index voldoende informatie oplevert.

In jou geval schets ik de twee tabellen
* Activity (id, employee_id, ...)
* Employee_Activity (activity_id, employee_id,...)
waarvoor geld dat er in employee_activity alleen id's voorkomen die ook voorkomen in Activity, maar waarbij er voor de corresponderen id's in Activity een andere emplyee_id staat.


Voor het schrijven gebruik ik de parameter :emplid als `3b63a7f4-10e1-4149-adb2-3dd27a401371`

Code:
select a.* 
  from activity a inner join employee_activity b on (a.id = b.activity_id)
 where a.emplyee_id = :emplid
       or b.empolyee_id = :emplid

je kunt dit ook schrijven als:

Code:
select a.* 
  from activity a, 
         employee_activity b 
 where a.id = b.activity_id
    and (a.employee_id = :emplid
           or b.employee_id = :emplid )


afhankelijk van je platform maar het is dan raadzaam om een losse index te maken op de activity (id, employee_id) en employee_activity (activity_id, employee_id)

disclaimer: het platform is nogal bepalend, de datatypes zijn nogal bepalend, de onderliggende hardware is nogal bepalend en er zijn meerdere wegen naar Rome. Bovengeschreven code is geschreven in het editblok van de helpmij pagina's en is niet gecontroleerd op syntax fouten of uberhaupt uitgeprobeerd.
 
Laatst bewerkt:
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan