Пользователь столкнулся с проблемой медленной работы SQL-запроса в базе данных Interbase 2009, объемом около 21 ГБ. Запрос включает в себя несколько LEFT JOIN и условие, которое отфильтровывает записи, не присутствующие в другой таблице. Оптимизация запроса возможна через создание индексов и изменение логики запроса.
Проблема
Запрос на выборку данных из таблицы AddrDistance с использованием LEFT JOIN для объединения с таблицами Address и фильтрации записей, которые не присутствуют в таблице DistanceQueryTask. Существует предположение, что частое выполнение вложенного запроса может замедлять выполнение основного запроса.
Текущий план выполнения
План выполнения запроса показывает, что для таблицы DistanceQueryTask используется индекс, а для таблиц Address - сортировка.
Возможные решения
Индексирование
Создание индексов для полей Bold_id, DistanceAsMeters и PseudoDistanceAsCostKm может ускорить запросы, так как уменьшит количество обращений к полным таблицам.
CREATE INDEX idx_AddrDistance_Bold_Id ON AddrDistance(Bold_Id);
CREATE INDEX idx_AddrDistance_DistanceAsMeters ON AddrDistance(DistanceAsMeters);
CREATE INDEX idx_AddrDistance_PseudoDistanceAsCostKm ON AddrDistance(PseudoDistanceAsCostKm);
Изменение логики запроса
Замена вложенного запроса на LEFT JOIN с таблицей DistanceQueryTask может помочь оптимизатору лучше обработать запрос.
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
LEFT JOIN DistanceQueryTask ON AddrDistance.Bold_Id = DistanceQueryTask.Bold_Id
WHERE DistanceAsMeters = 0 AND PseudoDistanceAsCostKm = 0
AND DistanceQueryTask.Bold_Id IS NULL
ORDER BY Created DESC;
Опциональные улучшения
Создание индекса для части условия (DistanceAsMeters = 0 AND PseudoDistanceAsCostKm = 0) может ускорить поиск соответствующих записей.
CREATE INDEX idx_AddrDistance_cond ON AddrDistance(DistanceAsMeters, PseudoDistanceAsCostKm);
Если фактически все записи из AddrDistance имеют соответствующие записи в Address, то LEFT JOIN можно заменить на INNER JOIN, что может ускорить выполнение запроса.
Заключение
Оптимизация SQL-запросов в Interbase может включать создание индексов, изменение логики запросов и использование других техник, таких как изменение типов соединений. Важно тщательно анализировать текущий план выполнения запроса и экспериментировать с различными подходами для достижения наилучшего результата.
Пользователь ищет способы ускорить работу SQL-запроса в базе данных Interbase 2009, используя техники оптимизации и индексирования, чтобы улучшить производительность на большом объеме данных.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS