Пиковая нагрузка ЦП SQL с помощью команды SqlDataAdapter.Fill

Я заметил какое-то странное поведение при получении данных SQL в приложении С#. Я использовал набор данных xsd, но время истекло. Затем я изменил свой подход, поскольку у меня уже был класс, который генерировал и возвращал данные для других операций, которые я пробовал. Это слишком истекло.

Я открыл Монитор активности в SSMS, чтобы получить представление о том, что происходит в SQL, когда код запускался, и заметил, что каким бы способом я его ни запускал, команда заполнения приводит к тому, что SQL-север достигает пика на 100% ЦП и остается там до тех пор, пока команда отменяется. Это хороший сервер с большим количеством мощных процессоров 240 ГГц и 30 ГБ оперативной памяти. Запрос не совсем быстрый, но возвращает 100 тыс. строк менее чем за 3 секунды в SSMS.

Вот мой код для набора данных:

        public DataTable UKDataRefresh ()
    {
        UKREFRESH.UKNewContactsDataTable dt = 
            new UKREFRESH.UKNewContactsDataTable();
        UKREFRESHTableAdapters.UKNewContactsTableAdapter ta = 
            new UKREFRESHTableAdapters.UKNewContactsTableAdapter();

        ta.Connection.ConnectionString += ";Password = xxxxxx;";

        try
        {
        ta.Fill(dt, global::SilverPopTransfer.Properties.Settings.Default.UKDATELASTACTION);

        }
        catch (SqlException )
        {

            throw;
        }

        return dt;

    }

Вот мой код для его создания на лету:

public DataTableOperations (string strconnection, string strSelect,string tablename)
{
        SqlConnection c = new SqlConnection(strconnection);
        connection = c;
        SqlDataAdapter da = new SqlDataAdapter(strSelect, connection);
        DataSet ds = new DataSet();
        //added this to see what would happen.
        da.SelectCommand.CommandTimeout = 0;
        connection.Open();
        da.Fill(ds, tablename);
        connection.Close();
        Datatable = ds.Tables[tablename];
        _disposed = false;
    }

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

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


person Stephen Connell    schedule 04.09.2012    source источник


Ответы (1)


Проверяйте индекс и set nocount on перед выполнением. Производительность SSMS не является хорошим показателем производительности. Он получает только частичные данные и выполняется асинхронно. Попробуйте вызвать небольшое подмножество данных или выполнить запрос без заполнения таблицы. Это может быть узким местом.

Если вы используете выбор с параметрами, сервер sql выполнит его, используя sp_execute, а затем сервер скомпилирует его, создав пики CPE.

person AA.    schedule 04.09.2012
comment
Спасибо, я просмотрел код и попытался сделать то, что вы предложили: SqlCommand cmnd = new SqlCommand(strSelect, connection); CommandBehavior behave = CommandBehavior.Default; connection.Open(); IAsyncResult result = cmnd.BeginExecuteReader(behave); using (SqlDataReader reader = cmnd.EndExecuteReader(result)) { DisplayResults(reader); } Результат тот же, что и раньше. т. е. массовые скачки нагрузки на ЦП и запуск множества процессов. - person Stephen Connell; 05.09.2012