Оптимизация кода и SQL-запросов для повышения производительности - PullRequest
0 голосов
/ 11 марта 2019

В веб-приложении с высоким трафиком SQL Server Express использует около 715-720 МБ памяти сервера.Насколько мне известно, в Express по умолчанию используется 1 ГБ используемой памяти.

Вопрос: считается ли использование 715-720 МБ (70% от лимита используемой памяти SQL Server Express) высоким использованием памяти?

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

Следующая функция - это веб-служба WCF.который возвращает JSON:

Public Function HomeNews() As List(Of HomeSectionsList) Implements IService.HomeNews
    Dim daQuery As SqlDataAdapter
    Dim dtSections = New DataTable
    Try
        Using myconnection As New SqlConnection(ConnectionStrings("ConnectionString").ToString)
            myconnection.Open()                
            MyCommand = New SqlCommand("SELECT TOP(8) * FROM containers", myconnection)
            daQuery = New SqlDataAdapter(MyCommand)
            daQuery.Fill(dtSections)                
        End Using

       Dim lstHomeSections As New List(Of HomeSectionsList)()

        If dtSections.Rows.Count > 0 Then
            For Each mySectionRow As DataRow In dtSections.Rows
                Dim lstArticles As New List(Of ArticleList)() 
                Using myconnection As New SqlConnection(ConnectionStrings("ConnectionString").ToString)
                    MyCommand = New SqlCommand("SELECT TOP (10) a.*, (SELECT image FROM TABLE_X WHERE id=1) AS ads_image, (SELECT link FROM TABLE_X WHERE id=1) AS ads_link FROM articles a WHERE a.containerid=" & mySectionRow.Item("id") & " ORDER BY a.publish_date DESC", myconnection)

                    lstHomeSections.Add(New HomeSectionsList With {
                                        .id = mySectionRow.Item("id"),
                                        .title = mySectionRow.Item("title"),
                                        .articles = CreateArticleList(MyCommand)})
                End Using                   
            Next
        End If
        Return lstHomeSections
    Catch ex As Exception
        Dim lstHomeSections As New List(Of HomeSectionsList)()
        Return lstHomeSections
    End Try
End Function

Public Function CreateArticleList(myCustomSQLCommand As SqlCommand) As List(Of ArticleList)
    Dim dtSelected As DataTable
    Dim daQuery As SqlDataAdapter
    Try
        Using myconnection As New SqlConnection(ConnectionStrings("ConnectionString").ToString)
            myconnection.Open()
            daQuery = New SqlDataAdapter(myCustomSQLCommand)
            dtSelected = New DataTable
            daQuery.Fill(dtSelected)
        End Using

        Dim lstArticles As New List(Of ArticleList)()
        If dtSelected.Rows.Count > 0 Then
            For Each myArticleRow As DataRow In dtSelected.Rows
                lstArticles.Add(New ArticleList() With {
                                .id = myArticleRow.Item("id"),
                                .title = myArticleRow.Item("title"),
                                .image = myArticleRow.Item("image"),
                                .ad = CreateAdsList()                                   
                    })
            Next
        End If
        Return lstArticles
    Catch ex As Exception
        Dim lstArticles As New List(Of ArticleList)()
        Return lstArticles
    End Try
End Function

Public Function CreateAdsList() As List(Of AdsList)
    Dim daQuery As SqlDataAdapter
    Dim lstAds As New List(Of AdsList)()
    Dim dtAds = New DataTable
    Try
        Using myconnection As New SqlConnection(ConnectionStrings("ConnectionString").ToString)
            myconnection.Open()
            MyCommand = New SqlCommand("SELECT a.image, a.link FROM ads a WHERE id=1", myconnection)
            daQuery = New SqlDataAdapter(MyCommand)
            daQuery.Fill(dtAds)
        End Using

        If dtAds.Rows.Count > 0 Then
            For Each myrow As DataRow In dtAds.Rows                    
                lstAds.Add(New AdsList() With {
                           .image = myrow.Item("image"),
                           .link = myrow.Item("link")
                           })
            Next
        End If
        Return lstAds
    Catch ex As Exception
        Return lstAds
    End Try
End Function

Ниже приведен пример возвращаемого JSON:

[
    {
        "id": 1,
        "title": "Container title", 
        "articles": [
            {
                "id": 1,
                "title": "Title 1",
                "ad": [
                    {
                        "image": "path-to-image/image.png",
                        "link": "http://example.com"                    
                    }
                ]
            },
            {
                "id": 2,
                "title": "Title 2",
                "ad": [
                    {
                        "image": "path-to-image/image.png",
                        "link": "http://example.com"                    
                    }
                ]
            },
        ]
    }
]
  • В результате этих запросов возникает утечка памяти?
  • вложенные USING оценки приводят к любой задержке?

Как лучше оптимизировать этот фрагмент кода, зная, что каждая функция вызывает другую функцию?

...