Min of meer wat de titel aangeeft; hier wat versimpelde code:
Als ik de subqueries 'table1' en 'table2' afzonderlijk run dan krijg ik in 0.01x seconde resultaat, als ik de query als totaal run dan duurt het enkele seconden. Beide subqueries retourneren ongeveer 200 rows.
Wat ik al geprobeerd heb:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
| SELECT * FROM mastertable LEFT JOIN ( SELECT id , name , created_at FROM table -- hier nog een aantal joins WHERE name = 'a' ORDER BY created_at DESC ) AS table1 ON mastertable.created_at = table1.created_at LEFT JOIN ( SELECT id , some_other_name , created_at FROM table -- hier nog een aantal joins WHERE some_other_name = 'b' ORDER BY created_at DESC ) AS table2 ON mastertable.created_at = table2.created_at |
Als ik de subqueries 'table1' en 'table2' afzonderlijk run dan krijg ik in 0.01x seconde resultaat, als ik de query als totaal run dan duurt het enkele seconden. Beide subqueries retourneren ongeveer 200 rows.
Wat ik al geprobeerd heb:
- Googelen
ik krijg niet heel veel relevante resultaten, één stackoverflow-result had het over "SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED" (de MySQL versie van "WITH NO LOCK"), als ik dit toepas duurt de complete query 2 keer zo lang.
- Ik heb geprobeerd de query om te bouwen maar vanwege de complexiteit van de query (de echte query is natuurlijk vele malen uitgebreider) krijg ik dit niet goed voor elkaar. Omdat ik meerdere subsets uit 1 table wil joinen kan ik eigenljik ook niet om subqueries heen. Ik heb geprobeerd om complete sets te joinen en alle WHERE-statements pas aan het einde toe te passen maar dit levert (te)veel werk op omdat de query vanuit code wordt gegenereerd, afhankelijk van allerlei settings en selecties kunnen er meerdere subsets gejoind worden.
- Indexes toepassen, volgens mij haalt dit niet veel uit omdat ik twee resultaten join die in principe uit een temp-table komen waarop dus geen index van toepassing is (denk ik?)
- Toevoegen van een ORDER BY bij beide subsqueries zodat deze aan het eind van de rit sneller/makkelijker gejoind kunnen worden. Dit lijkt niets te doen.
Hoeder van het Noord-Meierijse dialect