Меня вдохновили хорошие ответы на мой предыдущий вопрос о SQL.
Теперь этот SQL запускается на БД с Interbase 2009. Его размер составляет около 21 ГБ.
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
Есть 840000 строк с AddrDistance
190000 строк с адресом и 4 с DistanceQueryTask.
Вопрос в том, можно ли сделать это быстрее? Я полагаю, один и тот же запрос выполняется много раз , выберите bold_id из DistanceQueryTask . Обратите внимание, что меня не интересуют хранимые процедуры, просто SQL:)
РЕДАКТИРОВАТЬ1 Вот текущий план выполнения:
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)))
И да, у DistanceQueryTask должно быть небольшое число, если строки в базе данных.