Соединение JDBC с очень занятым SQL 2000: selectMethod=cursor vs selectMethod=direct?
в процессе попытки помочь команде разработчиков приложений с проблемами производительности на сервере SQL 2000 (из группы приложений Java на отдельных серверах приложений) я запустил трассировку SQL и обнаружил, что все вызовы базы данных полны операторов Курсора сервера API (sp_cursorprepexec, sp_cursorfetch, sp_cursorclose).
похоже, они задают некоторые свойства строки подключения, которые заставляют использовать серверные курсоры, получая только 128 строк данных за раз: (От http://msdn.microsoft.com/en-us/library/Aa172588)
когда атрибуты курсора API или свойства значение чем их значения по умолчанию, OLE DB поставщик для SQL Server и SQL Сервер ODBC драйвер использовать API сервер курсоры вместо результата по умолчанию наборы. Каждый вызов функции API выборки строк создает обращение к серверу для получения строки с сервера API указатель.
обновление: строка подключения, о которой идет речь, является параметром строки подключения JDBC,selectMethod=cursor (который включает серверные курсоры, которые мы обсуждали выше) против альтернативной selectMethod=direct. Они использовали selectMethod=cursor как их стандартная строка подключения из всех приложений.
С моей точки зрения DBA, это просто раздражает (он загромождает трассировку бесполезным мусором), и (я бы предположил) приводит ко многим дополнительным раундам приложения к SQL server поездки, снижение общей производительности.
они, по-видимому, тестировали изменение (только одно из 60 различных подключений приложений) на selectMethod=direct но испытал некоторые проблемы (из которых у меня нет подробностей) и обеспокоен нарушением приложения.
Итак, мои вопросы:
- можно использовать
selectMethod=cursorснижение производительности приложения, как я пытался спорить? (за счет увеличения количества рейсов, необходимых на SQL Server, который уже имеет очень высокий запросы / сек) - Is
selectMethod=прозрачная настройка приложения для соединения JDBC? Может ли это сломать их приложение, если мы его изменим? - в более общем плане, когда вы должны использовать
cursorvsdirect?
редактировать: получены фактические технические данные, которые гарантируют значительное редактирование заголовка, вопроса и тегов.
редактировать: добавлено баунти. Также добавить щедрость к вопросу SF (этот вопрос сосредоточен на поведении приложения, вопрос SF сосредоточен на производительности SQL.) Спасибо!!
2 ответов
коротко
-
selectMethod=cursor- теоретически требует дополнительные ресурсы на стороне сервера чем
selectMethod=direct - загружается только самое большее пакета в размере записывает в память клиента сразу, приводящ к в более предсказуемом следе ноги памяти клиента
- теоретически требует дополнительные ресурсы на стороне сервера чем
-
selectMethod=direct- теоретически требуется меньше ресурсов на стороне сервера, чем
selectMethod=cursor - читать весь результат установите в память клиента (если драйвер изначально не поддерживает асинхронное извлечение результирующего набора), прежде чем клиентское приложение сможет перебирать его; это может снизить производительность двумя способами:
- снижение производительности с большими результирующими наборами, если клиентское приложение написано таким образом, чтобы остановить обработку после прохождения только части результирующего набора (с
directон уже оплатил стоимость извлечения данных, которые он по существу выбросит; сcursorотходы ограничены максимум пакета в размере - 1 строк. первые условия расторжения должны, вероятно, быть перекодированы в SQL в любом случае, например,SELECT TOPили оконные функции) - снижение производительности с большими результирующими наборами из-за потенциальной сборки мусора и/или проблем с памятью, связанных с увеличением объема памяти
- снижение производительности с большими результирующими наборами, если клиентское приложение написано таким образом, чтобы остановить обработку после прохождения только части результирующего набора (с
- теоретически требуется меньше ресурсов на стороне сервера, чем
в целом,
-
можете с помощью
selectMethod=cursorснижение производительности приложения? -- любой метод может снизить производительность по разным причинам. Мимо определенного размера resultset,cursorеще может быть предпочтительнее. См. ниже, когда использовать тот или иной -
и
selectMethod=прозрачная настройка приложения для соединения JDBC? -- он прозрачен, но он все равно может сломать их приложение, если использование памяти растет достаточно значительно, чтобы зацепить их клиентскую систему (и, соответственно, ваш сервер) или сбой клиент вообще -
в более общем плане, когда вы должны использовать
cursorvsdirect? -- лично я используюcursorпри работе с потенциально большими или иными неограниченными результирующими наборами. Накладные расходы туда и обратно амортизируются при достаточно большом размере пакета, и объем памяти моего клиента предсказуем. Я используюdirectкогда размер результирующего набора, который я ожидаю, как известно, уступает размеру любой партии, которую я использую сcursor, или связанный каким-то образом, или когда память-это не проблема.
используя selectMethod=cursor запрещает SQL Server использовать Параллельная Обработка Запросов, который может иметь большое влияние на производительность, например, когда:
- у вас много ядер процессора (а у кого нет?)
- вы оптимизировали свою базу данных, разделив таблицы
- вы выполняете множество агрегированных запросов (
sum(),count(), etc.)
И, Наконец, Microsoft государства следующее:
(
selectMethod=direct) обеспечивает наивысшую производительность, когда приложение обрабатывает все строки.
вы должны обязательно попробовать и посмотреть, если установка selectMethod=direct имеет значение для вас.