Как ?" Более эффективно, чем LIKE '%' ||? || '%' - PullRequest
4 голосов
/ 29 июня 2010

Недавно один из моих коллег сделал комментарий, что я не должен использовать

LIKE '%' ||? || '%'

скорее использовать

LIKE?

в SQL, а затем заменить LIKE?маркер с LIKE '%' ||? || '%' , прежде чем я выполню SQL.Он отметил, что база данных DB2 с одним маркером параметров будет всегда кэшировать оператор и, таким образом, сокращать время подготовки SQL.

Однако я не уверен, является ли он точным или нет.Для меня это должно быть наоборот, так как мы выполняем больше обработки, заменяя строку в SQL каждый раз, когда выполняется запрос.

Кто-нибудь знает, действительно ли один маркер ускоряет выполнение?Просто к сведению - я использую среду 2.5 JDBC, а версия DB2 - 9.2.

Мой вопрос - DB2 относится к "НРАВИТСЯ?"в отличие от "LIKE '%' ||? || '%'" в отношении кэширования и подготовки.

Ответы [ 3 ]

2 голосов
/ 29 июня 2010

'НРАВИТСЯ?'такое PreparedStatement.Подготовленные операторы являются оптимизацией на уровне драйвера JDBC.Предполагается, что базы данных анализируют запросы, чтобы решить, как наиболее эффективно их обрабатывать.Затем БД может кэшировать результирующий план запроса, используя полный оператор.Повторное использование идентичных операторов повторно использует план запроса.Таким образом, в основном, если вы выполняете один и тот же запрос несколько раз с разными строками сравнения, и если план запроса остается в кэше, тогда да, используя 'LIKE?'будет быстрее.

Некоторая полезная (хотя и несколько устаревшая) информация о PreparedStatements:

1 голос
/ 29 июня 2010

в SQL, а затем заменить, как? маркер с LIKE '%' ||? || '%' перед выполнением SQL. Он отметил, что база данных DB2 с одним маркером параметров всегда будет кэшировать оператор и, таким образом, сократить время подготовки SQL.

Если DB2 не является какой-то странной инопланетной базой данных SQL или если ее драйвер делает какие-то безумные вещи, сервер баз данных никогда не увидит ваш подготовленный оператор, пока вы его не выполните. Таким образом, вы можете менять положения в PreparedStatement и выходить из него в течение всего дня, и это не будет иметь никакого эффекта, пока вы фактически не отправите его на сервер при его выполнении.

1 голос
/ 29 июня 2010

Я не делал слишком много DB2, начиная с 90-х годов, и я не совсем уверен, понимаю ли я, в чем заключается ваш основной вопрос. Еще тогда мне позвонил глава команды DBA. «Чем вы занимаетесь иначе, чем любой другой программист, который у нас есть! ??» Имейте в виду, это было в начале моей карьеры, поэтому я неуверенно ответил: «Ничего ...», представьте это каким-то хриплым голосом. «Ну, тогда почему ваши запросы занимают 50% ресурсов процессора у всех остальных ребят ???». Я быстро опросил всех остальных парней и обнаружил, что я был единственным, кто использовал готовые заявления. Теперь под покровом Spring автоматически делает подготовленные операторы, и они значительно улучшили кеширование операторов в базе данных за эти годы, но если вы используете правильно, вы можете получить ускорение там, И это сделает кэш операторов поменять вещи реже. Это действительно зависит от вашего варианта использования: если вы собираетесь выполнить запрос только один раз, тогда не будет никакой разницы, если его несколько тысяч раз, очевидно, это будет иметь гораздо большее значение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...