Мне было интересно, нужно ли мне использовать оператор FETCH FIRST n ROWS ONLY
в DB2 или оператор LIMIT
в MySQL, если я запрашиваю уникальный идентификатор с индексом из таблицы, чтобы повысить производительность. Или провайдер sql уже заметил, что будет максимум один результат и остановит запрос, когда найдена строка?
Пример запроса:
DB2: SELECT * FROM myTable WHERE id = 1 FETCH FIRST 1 ROWS ONLY
MySQL: SELECT * FROM myTable WHERE id = 1 LIMIT 1
Кто-нибудь уже думал об этом?
Вы можете использовать как FETCH FIRST 1 ROWS ONLY
так и LIMIT
в Db2, проверьте настройки совместимости DB2.
Если возвращается только одна строка, не имеет значения, указан ли этот синтаксис. Однако, если вы или система не уверены, то это дополнительная гарантия. В зависимости от настроек оптимизатора (или настроения, статистики или метаданных), дополнительный синтаксис может помочь с производительностью. Причина в том, что система баз данных знает, что должна быть возвращена только 1 строка, и она может оптимизироваться для этого случая.
Если есть уникальный индекс по id, то это должно быть очевидно, но есть ли индекс...?
В случае, если атрибут объявлен уникальным, я настоятельно рекомендую отказаться от этой практики по двум причинам:
это никак не увеличивает производительность оптимизатора модератора, а только увеличивает работу оптимизатора SQL, который должен обрабатывать другое предложение,
(что наиболее важно) снижает читаемость оператора для сопровождающего кода, поскольку может создавать впечатление, что атрибут не является уникальным, что приводит к путанице в запросе и базовой таблице.
FETCH FIRST 1 ROWS ONLY
?