SQL Server против .Net Client - Лучшая практика возврата огромных данных с сервера - Повышение производительности - PullRequest
0 голосов
/ 12 марта 2012

Я атакую ​​проблемы с производительностью в приложении Enterprise. Один из моих SQL Proc возвращает более 2 МБ данных (простой текст XML). Для выполнения этого SP он занимает около 600 мс только с сервером БД. Но для получения ответа в моем пользовательском интерфейсе требуется около 30 секунд.

SQL Server 2008 / .NET 4.0 (приложение Windows, размещенное на IIS)

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

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

Основываясь на комментариях, полученных ниже, подумайте над тем, чтобы добавить это здесь: -

  1. Но я обнаружил это, когда выполняю тот же вызов Sp из моего локального анализатора запросов SQLserver с подключением локального сервера. 2. Это не интранет, а связь между США и Индией через Интернет. 3. Я тщательно проанализировал, используя инструмент dottrace и источник тоже. 4. Не существует узкого места для связывания этих данных. Ранее в Loop было около 15 дБ вызовов (каждый вызов несет небольшое количество килобайт), но теперь он сводится к одиночному вызову с буферизацией, но переносит большие данные в мегабайтах.

С уважением, Karthikeyan.G

Ответы [ 2 ]

0 голосов
/ 27 апреля 2012

Вы можете использовать асинхронное программирование:

    Dim connectionString As String = "server=.\SQLEXPRESS; database=master; Integrated Security=true; Asynchronous Processing=true"

  Private Sub btnDisplayCustomersCallback_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnDisplayCustomersCallBack.Click
        Dim sqlConnection As New SqlConnection(connectionString)
        Dim sqlCommand As SqlCommand = sqlConnection.CreateCommand()
        Dim asyncResult As IAsyncResult
        'Example of Asynchronous Callback Model

        sqlCommand.CommandText = "SELECT * FROM [customer]"
        sqlCommand.CommandType = CommandType.Text
        sqlConnection.Open()
        btnDisplayCustomersCallBack.Enabled = False


        Dim callback As AsyncCallback = New AsyncCallback(AddressOf DisplayCustomers)
        asyncResult = sqlCommand.BeginExecuteReader(callback, sqlCommand, CommandBehavior.CloseConnection)
    End Sub

  Private Sub DisplayCustomers(ByVal result As IAsyncResult)
        Dim dr As SqlDataReader
        Dim command As SqlCommand
        Dim del As DelFillGrid
        Try
            command = CType(result.AsyncState, SqlCommand)
            dr = command.EndExecuteReader(result)
            del = New DelFillGrid(AddressOf FillGrid)
            Threading.Thread.Sleep(5000)
            Me.Invoke(del, dr)

        Finally
            If (Not dr.IsClosed) Then
                dr.Close()
            End If
        End Try
    End Sub

Private Sub FillGrid(ByVal dr As SqlDataReader)
        Try
            Dim dt As New DataTable()
            dt.Load(dr)
            Me.DataGridView1.DataSource = dt
        Catch ex As Exception
            ' Because you're guaranteed this procedure 
            ' is running from within the form's thread, 
            ' it can directly interact with members of the form. 
        Finally
            btnDisplayCustomersCallBack.Enabled = True

            If dr IsNot Nothing Then
                dr.Close()
            End If

        End Try
    End Sub

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

0 голосов
/ 26 марта 2012

Конечно, выглядит как привязка пользовательского интерфейса. 2 Мб через Интернет вряд ли займет 30 секунд, но может зависеть от скорости вашего соединения.

Учитывая, что выполнение SP занимает всего 600 мс, оно немного длинное, поэтому было бы предпочтительным его кешировать. В любом случае, 2 МБ не так много для кэширования (если его не на пользователя).

Получите 2 МБ данных, кэшируйте их, разделяйте. Например, получить первые 100 записей, затем привязать эти строки к элементу управления пользовательского интерфейса и реализовать разбиение на страницы.

Однако без кода я не вижу, к какому типу и глубине данных вы привязываете тип управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...