2009-07-24 8 views
1

Давайте:Cross DB производительность хранимых процедур в SQL Server 2008

  • $ DB база данных SQL Server
  • $ DBSP1 база данных SQL Server, содержащий хранимые процедуры, ссылающихся $ DB
  • $ DBSP2 точно как $ DBSP1
  • $ SP хранимая процедура

Запуск $ SP на $ DBSP1 из C# кода занимает около 1,5 сек.

Запуск $ SP на $ DBSP2 от кода C# занимает около 0,5 с.

Код C# очень прост и использует SqlClient с параметрами по умолчанию.

Когда я выполняю $ SP в консоли SQL как для $ DBSP1, так и для $ DBSP2, он принимает 0,4.

Единственная разница между двумя базами данных кода: $ DBSP1 находится в производстве и немного загружена, тогда как $ DBSP2 простаивает. В базе данных кода нет данных, только хранимые процедуры и представления над $ DB.

Может кто-нибудь предложить причины, почему это происходит? Поскольку вся работа выполняется в $ DB, которая одинаково загружена в обоих случаях, я ожидаю, что результаты будут похожи.

+0

Интересно. Работа с консолью SQL на каждой машине была хорошим шагом с точки зрения устранения проблем с производительностью машины или сети. «Выполнение $ SP на $ DBSP1 из кода C# занимает около 1,5 секунд. Запуск $ SP на $ DBSP2 из кода C# занимает около 0,5 с." Вы, кажется, тщательно, так что простите меня, если этот вопрос исправен. Когда вы говорите, что - это общее время выполнения страницы или функции? Или это конкретное время, которое требуется для этого конкретного заявления? –

+0

Время выполнения C# измеряет сумму SqlCommand Open() и ExecuteNonQuery(), выполняющую процедуру хранилища. Я забыл точно, что все базы данных находятся на одной машине. – pmezard

+0

@John Booty: «Запуск $ SP на $ DBSP1 из кода C# занимает около 1,5 секунд. Запуск $ SP на $ DBSP2 из кода C# занимает около 0,5 с». это как раз тот признак неправильного обнюхивания пара и старая статистика. –

ответ

1

Разница в скорости поступала из разных планов запросов. $ SP - сложная хранимая процедура, и ее первоначальный план запроса может сильно варьироваться в зависимости от первого запроса, попавшего в него. И на данный момент мы не контролировали первый запрос, так как сразу после развертывания $ SP он был опубликован на производстве.

Мы попытались предоставить подсказки о параметрах $ SP как на уровнях $ SP, так и на уровнях запросов без успеха. Поэтому вместо этого мы разогреваем $ SP перед развертыванием с хорошо обработанными запросами, известными для создания правильного плана запроса.

0

Думаю, у вас есть свой ответ. $ DBSP1 занят. Он по-прежнему должен переключать задачу и определять приоритетность работы, которая возникает, даже если большая часть работы выполняется в $ DB.

Кроме того, в зависимости от объема передаваемых данных активна сетевая активность. Если $ DBSP1 отправляет/получает достаточное количество данных, это уменьшает доступную пропускную способность для связи с $ DB и приведет к медленному переносу наборов результатов.

+0

Я забыл сказать, что все базы данных находятся на одной машине. Я не мог измерить разницу, когда искусственно обрезал вывод хранимой процедуры (чтобы уменьшить выход SP). Я согласен с вами в том, что, по-видимому, производительность базы данных кодов ухудшается независимо от загружаемой базы данных. Я просто задаюсь вопросом, знает ли кто-нибудь почему. Очевидным, но глупым решением является создание N похожих баз данных кода и балансировка нагрузки над ними. Но для меня это слишком глупо. – pmezard

0

1) Убедитесь, что оба сервера имеют одинаковые индексы, определенные на каждой таблице

2) Перестроить индексы (или, как минимум, обновление статистики)

У вас есть регулярные работы по техническому обслуживанию индекс плановыми? Похоже, что устаревшая статистика или фрагментированные индексы вызывают несоответствие.

+0

Это была моя первая мысль, но не забудьте: «Когда я запускаю $ SP в консоли SQL как для $ DBSP1, так и для $ DBSP2, это занимает 0,4 секунды». Таким образом, несоответствие не относится к соответствующим конфигурациям/средам SQL Server. Это должно быть что-то в среде выполнения приложения (я предполагаю, что ASP.NET, но он не указан) –

+0

Расхождения в производительности происходят между двумя базами данных кода без каких-либо данных. Так что нет, индексы здесь не проблема. – pmezard

+0

@John Booty: «Запуск $ SP на $ DBSP1 из кода C# занимает около 1.5 секунд. Запуск $ SP на $ DBSP2 из кода C# занимает около 0,5 с». это как раз тот признак неправильного обнюхивания пара и старая статистика. - –

0

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

+0

Поскольку оба запроса берут одно и то же время с консоли SQL в обоих случаях, я бы исключал проблемы с установкой/статистикой запросов. Тем не менее, запуск профилировщика может принести массу интересной информации. Не могли бы вы предложить события для просмотра? Возможно, что-то связано с временем входа/ожидания? – pmezard

0

Измерение.

Добавить SET STATISTICS TIME ON и SET STATISTICS IO ON на ваш C# и на вызов консоли sql. В C# подключите SqlConneciton.InfoMessage event, чтобы захватить информационные сообщения и отобразить их. также отделите время, измеренное для вызова SqlConnection.Open(), и вызов SqlCommand.ExecuteNonQuery.

Тогда вы сможете сказать разницу.

  • различная схема Открытое() раз?
  • другой сбор/исполнение раз?
  • различные логические показатели чтения/физического считывания?
  • различные логические числа считаются?
Смежные вопросы