2013-08-19 2 views
1

В MS SQL Server 2008 R2 в Windows XP с пакетом обновления 3 (SP3) имеется многомиллионная база данных записей.ODBC DSN замедляет MSSQL до тайм-аутов

Мой сотрудник написал приложение .Net, которое напрямую подключается к этому db и запускает разумное количество запросов. Я не знаю .Net, но я уверен, что это приложение не подключается к БД с использованием ODBC.

С другой стороны, я написал приложение python из командной строки (CPython версии 2.7.5), которое подключается к этой базе данных и запускает простые запросы для отправки данных через Интернет в другое место. Соединение с базой данных выполняется с использованием pyodbc 3.0.7 (установщик от http://www.lfd.uci.edu/~gohlke/pythonlibs/) и DSN, который использует драйвер SQL Server Native Client 10.0. Я попытался отключить и включить пулы подключений для этого драйвера в таблице Connection Pooling вкладки windows Data Sources (ODBC) апплет. Скрипт отправляет 100 записей из db, а затем закрывает соединение и спит в течение 2 минут, а затем снова запускается.

Обе эти программы работают постоянно на той же машине, что и дБ.

Вопрос: приложение .Net прекрасно работает, когда я удаляю определенный DSN (и, конечно, скрипт python не работает). Когда я снова определяю DSN и запускаю скрипт python для запуска бок о бок .Net-приложение, проблем нет примерно на 5 часов. но затем постепенно, в то время как сценарий python в основном прекрасен, приложение .Net начинает получать тайм-ауты из db.

Что может произойти неправильно, если это произойдет?

EDIT:

питон скрипт (который подключается с помощью ODBC) работает нормально, все время. но приложение .Net отстает от обычной производительности через пару часов. Когда я закрываю скрипт python, приложение .Net по-прежнему остается позади. но когда я удаляю ODBC DSN, который я определил для скрипта python, приложение .Net возвращается к нормальной работе. Это очень странно. Как я уже сказал, я ничего не знаю о .Net, так что это может быть результатом нестандартного кода со стороны приложения .Net, возможно, открытых транзакций, блокировок, слишком большого количества подключений и т. Д. Чтобы сделать дело незнакомцем, размер базы данных до половины, удалив записи и перестроить индексы, похоже, решил проблему с .Net-приложением до сих пор.

EDIT 2:

Единственные два запроса, что питон скрипт работает, являются:

SELECT TOP 100 FROM tbl_data WHERE id > ? ORDER BY id 

и

SELECT * FROM tbl_data WHERE id = ? 

Первый запрос, как правило, работает только один раз в каждом цикле питона скрипт. Второй работает не более 100 раз. id является первичным ключом, и поэтому индексируется. Как вы видите, запросы не могут быть проще. Для первого запроса я прочитал весь набор результатов в программе, чтобы не держать курсор открытым на сервере БД. Кроме того, я отключил объединение пулов в апплете ODBC для используемого драйвера, поэтому после каждого запуска скрипта необходимо было установить соединение с БД, и все ресурсы на сервере БД должны были быть освобождены. Сценарий спит в течение 2 минут, а затем повторяет это.

Запросы, выполняемые приложением .Net, намного сложнее, в сочетании с некоторыми триггерами в базе данных. И странно, что он работает в основном отлично, сам по себе. но когда DSN определен, он начинает получать длинные ожидания в одном заявлении insert, что иногда приводит к таймауту.

Также я должен был сказать, что Windows и MSSQL не обновляются с последними исправлениями от Microsoft, поэтому, если это ошибка в драйвере ODBC или сам MSSQL, он мог бы быть уже решен для других.

РЕДАКТИРОВАТЬ 3

Таблица сгруппирована по индексу PK. таблица данных содержит около 1,5 М записей. Размер БД составляет около 160 ГБ. Сервер не имеет высокой спецификации. Intel Core i7 2600, 4 ГБ оперативной памяти, обычный 1ТБ SATA-накопитель.

+0

Большое спасибо за обновление. Является ли первичный ключ кластеризованным или некластеризованным? Также, насколько велик этот сервер (память, процессор и т. Д.)? –

+0

Я отредактировал вопрос – aalizadeh

+1

Основываясь на всем, что вы описываете, похоже, что ваше приложение python (ODBC) блокирует приложение .Net из-за конкуренции ресурсов.Таймауты могут быть вызваны лишь несколькими вещами, конфликтом ресурсов, длительными запросами, а блокировка - обычными подозреваемыми. Когда производительность снижается, вы просматриваете активные подключения, чтобы увидеть, есть ли проблема блокировки. –

ответ

1

Есть ряд вещей, которые могут повлиять на производительность. Могут существовать конфликты ресурсов, субоптимальная конфигурация SQL Server, медленные диски, отсутствующие индексы и т. Д.

Я бы начал с мониторинга системных ресурсов, когда оба процесса запущены. Вы можете использовать perfmon для мониторинга счетчиков ОС и SQL. Я хотел бы начать, глядя на

  • ProcessorInformation /% процессорного времени

    LogicalDisk/Avg Disk сек/чтение

    LogicalDisk/Avg Disk с/написать

    Память/Доступно МБ

    SQLServerBufferManager/BufferCacheHitRatio

    SQLServerBufferManager/PageLifeExpectency

Вот большая статья об использовании Perfmon, http://www.brentozar.com/archive/2006/12/dba-101-using-perfmon-for-sql-performance-tuning/

Следующим шагом является оптимизация запросов и SQL производительности сервера.

производительность запросы, http://technet.microsoft.com/en-us/magazine/2007.11.sqlquery.aspx SQL производительность сервера,

Дела в том, что есть так много возможностей, которые могут быть, влияющих на вашу базу данных, что практически невозможно определить вашу проблему на основе предоставленной информации. Я рекомендую вам пройти через каждый из этих элементов, чтобы определить, почему ваша система работает не оптимально.

+0

Спасибо за полезную информацию, но, как я уже сказал, приложение .Net работает нормально, когда нет ODBC DSN. поэтому я думаю, что проблема должна иметь какое-то отношение к ODBC. между тем я переписываю скрипт, чтобы напрямую подключиться к mssql, используя библиотеку pymssql, которая использует mssql C API под капотом. Если это работает, то ** должно быть что-то подозрительное в ODBC. – aalizadeh

+0

Что заставляет вас думать, что ODBC DSN является вероятным виновником? Вы взяли запрос, который вы используете через ODBC DSN, и запускаете его непосредственно в SQL Server? Если да, выполнялось ли оно значительно быстрее? Я пытаюсь понять, как вы пришли к такому выводу. Ваш вывод может быть правильным, я просто хочу понять, что у вас есть, и не пробовал. –

+0

Я отредактировал вопрос – aalizadeh