2010-06-29 8 views
4

Недавно один из моих коллег сделал замечание, что я не должен использовать«НРАВИТСЯ?» Более эффективно, чем LIKE '%' ||? || '%'

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

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

LIKE?

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

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

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

Мой вопрос в том, относится ли DB2 к LIKE? в отличие от «LIKE»% '||? ||'% '", поскольку кэширование и подготовка идут.

+2

Почему бы не запустить несколько тестов? Цифры зависят от многих факторов, и этот конкретный случай (может или) может даже не иметь разницы в целом. – 2010-06-29 16:10:54

+0

Указывает ли шаблон подстановки или предоставляется в заявлении, подготовленном Java? –

+1

Я не уверен, что понимаю разницу. Что вы имеете в виду ", а затем замените маркер LIKE? LIKE '%' ||? || '%' до того, как я запустил SQL"? Разве это не тот же самый запрос? – Kobi

ответ

2

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

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

+0

Разве LIKE '%' ||? || '%' тоже динамический параметр? Или вы так не думаете, потому что% в кавычках? – CoolBeans

+0

Нет, это не динамический параметр в этом случае. Вам не нужно использовать кавычки с параметрами (одна из причин, по которым они помогают предотвратить проблемы с внедрением SQL), и вы определенно не хотите делать конкатенацию с чем-то, предназначенным для замещения. – Jeff

1

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

1

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

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

+0

Я тоже так думаю. Я не очень разбираюсь в самой DB2, поэтому я разместил ее как вопрос, чтобы увидеть, есть ли эксперты DB2, которые могут помочь мне разобраться. – CoolBeans

+0

Знает ли база данных о ней при создании объекта PreparedStmt или знает ли она об этом только тогда, когда вы выполнили запрос на выполнение? – CoolBeans

+0

Я всегда принимал последнее. Вы можете проверить это довольно тривиально, настроив тестовую программу, которая создает PS, ждет 10 секунд до ее выполнения и использует WireShark для проверки трафика между машиной и базой данных. –

Смежные вопросы