Ik heb één tabel met de volgende structuur.
waardeA waardeB waardeC waardeD waardeE waardeF waardeG
Hierop zit de volgende query.
De join zelf gaat eigenlijk snel, zoals je in bijgevoegde image gaat zien.

Nja in feite is een index scan ook niet verkeerd, maar alles bij elkaar duurt het gewoon enorm lang. Om wat preciezer te zijn: 00:00:02.2049370 (2.2 seconden dus).
Nu heb ik gewoon een probleem dat er door 'bad-data' door de jaren heen het (nog) niet mogelijk is om een unieke index te maken op basis van meerdere kolommen. Mijn doel was om van waarde a-b-c-f en g een unieke index te maken. Die combinatie zou technisch gezien uniek moeten zijn.
Dus ja, vraag 1: is het logisch om dat te gaan doen (als ik de data uiteindelijk op orde heb?). En zou me dat veel tijd schelen, of is het nog te generiek?
Goed, voor nu dan. Stel dat ik een query uitvoer op basis van -alleen- waardeA (en die returned al bijv. 600 records) dan is dat gewoon instant < 1 seconden. Waarom zou specifiek deze bovenstaande query dan zo 'lang' duren?
Indexen:
Clustered index op waarde A-B-C-F-G.
Non-Clustered index op F met included colomns D en E.
Letterlijk 'alles' wat ik opvraag MITS er maar één in de WHERE clause zit duurt < 1 seconden, bijv. SELECT * FROM table1 WHERE waardeG = foo, maar in zo'n query als bovenstaande duurt het opeens weer lang.. Idem als ik dan nog een 'AND waarde A = bar' erbij zet, dan gaat het opeens niet meer.
Nog een detail, als ik de volledige index eraf flikker dan is het weer wat sneller dan met een index.
Wat zouden jullie doen om het tijdelijk wat sneller te maken, oh en vergeet m'n eerste vraag niet. Antwoorden als 'de fik er in' zijn valide, maar daar heb ik nu even niets aan.
ps. table heeft 23377793 records.
waardeA waardeB waardeC waardeD waardeE waardeF waardeG
Hierop zit de volgende query.
SQL:
1
| SELECT tbl1.waardeF, tbl1.waardeG, tbl2.waardeI, tbl2.waardeH FROM tabel1 AS tbl1 LEFT JOIN tabel2 AS tbl2 ON tbl1.waardeG = tbl2.waardeH AND tbl2.waardeF = 'het-specifieke-label-nummer' WHERE tbl1.waardeA = 'een-relatie-nr' AND tbl1.waardeB = 'een-volg-nr' AND tbl1.waardeF = 'het-specifieke-label-nummer' AND tbl1.waardeC = 0 |
De join zelf gaat eigenlijk snel, zoals je in bijgevoegde image gaat zien.

Nja in feite is een index scan ook niet verkeerd, maar alles bij elkaar duurt het gewoon enorm lang. Om wat preciezer te zijn: 00:00:02.2049370 (2.2 seconden dus).
Nu heb ik gewoon een probleem dat er door 'bad-data' door de jaren heen het (nog) niet mogelijk is om een unieke index te maken op basis van meerdere kolommen. Mijn doel was om van waarde a-b-c-f en g een unieke index te maken. Die combinatie zou technisch gezien uniek moeten zijn.
Dus ja, vraag 1: is het logisch om dat te gaan doen (als ik de data uiteindelijk op orde heb?). En zou me dat veel tijd schelen, of is het nog te generiek?
Goed, voor nu dan. Stel dat ik een query uitvoer op basis van -alleen- waardeA (en die returned al bijv. 600 records) dan is dat gewoon instant < 1 seconden. Waarom zou specifiek deze bovenstaande query dan zo 'lang' duren?
Indexen:
Clustered index op waarde A-B-C-F-G.
Non-Clustered index op F met included colomns D en E.
Letterlijk 'alles' wat ik opvraag MITS er maar één in de WHERE clause zit duurt < 1 seconden, bijv. SELECT * FROM table1 WHERE waardeG = foo, maar in zo'n query als bovenstaande duurt het opeens weer lang.. Idem als ik dan nog een 'AND waarde A = bar' erbij zet, dan gaat het opeens niet meer.
Nog een detail, als ik de volledige index eraf flikker dan is het weer wat sneller dan met een index.
Wat zouden jullie doen om het tijdelijk wat sneller te maken, oh en vergeet m'n eerste vraag niet. Antwoorden als 'de fik er in' zijn valide, maar daar heb ik nu even niets aan.

ps. table heeft 23377793 records.