J'ai été inspiré par les bonnes réponses de mon précédent question sur SQL. Maintenant, ce SQL est exécuté sur une base de données avec Interbase 2009. Il est d'environ 21 Go.Optimiser SQL avec Interbase
SELECT DistanceAsMeters, AddrDistance.Bold_Id, AddrDistance.Created, AddressFrom.CityName_CO as FromCity, AddressTo.CityName_CO as ToCity
FROM AddrDistance
LEFT JOIN Address AddressFrom ON AddrDistance.FromAddress = AddressFrom.Bold_Id
LEFT JOIN Address AddressTo ON AddrDistance.ToAddress = AddressTo.Bold_Id
Where DistanceAsMeters = 0 and PseudoDistanceAsCostKm = 0
and not AddrDistance.bold_id in (select bold_id from DistanceQueryTask)
Order By Created Desc
Il y a 840000 lignes avec AddrDistance 190000 lignes avec adresse et 4 avec DistanceQueryTask. La question est: est-ce que cela peut être fait plus rapidement? Je suppose, la même requête est exécutée plusieurs fois sélectionnez bold_id de DistanceQueryTask. Notez que je ne suis pas intéressé par les procédures stockées, tout simplement SQL :)
EDIT1 Voici le plan d'exécution actuel:
Statement: SELECT DistanceAsMeters, AddrDistance.Bold_Id, AddrDistance.Created, AddressFrom.CityName_CO as FromCity, AddressTo.CityName_CO as ToCity
FROM AddrDistance
LEFT JOIN Address AddressFrom ON AddrDistance.FromAddress = AddressFrom.Bold_Id
LEFT JOIN Address AddressTo ON AddrDistance.ToAddress = AddressTo.Bold_Id
Where DistanceAsMeters = 0 and PseudoDistanceAsCostKm = 0
and not AddrDistance.bold_id in (select bold_id from DistanceQueryTask)
Order By Created Desc
PLAN (DISTANCEQUERYTASK INDEX (RDB$PRIMARY218))
PLAN SORT (JOIN (JOIN (ADDRDISTANCE NATURAL,ADDRESSFROM INDEX (RDB$PRIMARY234)),ADDRESSTO INDEX (RDB$PRIMARY234)))
Et oui, DistanceQueryTask est censé avoir un faible nombre si les lignes dans la base de données. L'utilisation de Left Join et les sous-requêtes ralentiront n'importe quelle requête.
Avez-vous vérifié le plan d'exécution de la requête (ceci peut être fait avec les composants IBX, IBExpert et peut-être même avec IBConsole)? Il montre s'il y a des jointures naturelles au lieu d'indexées. – mjn
Est-ce que DistanceQueryTask va toujours contenir un petit nombre d'enregistrements? – skamradt