簡體   English   中英

使用參數的sql語句速度很慢,如果沒有參數,則速度很快

[英]Sql statement using parameters is slow, fast without them

我在參數化sql語句的性能方面遇到了一些麻煩。 我正在使用的表有〜150,000條記錄,每條記錄都有〜30列。

該語句在3.5秒內執行。

    Dim selectstring As String
    selectstring = "SELECT * FROM LineInfo WHERE jobNum=@jobnum and revision_number=@revnum AND lineNum=@linenum;"
    Dim selectCommand As New SqlClient.SqlCommand(selectstring, Singleton.DbConnection)
    selectCommand.Parameters.Add("@jobnum", "testing1")
    selectCommand.Parameters.Add("@revnum", "0")
    selectCommand.Parameters.Add("@linenum", 13)

    Dim da As New SqlClient.SqlDataAdapter(selectCommand)
    Dim ds As New DataSet

    Try
        da.Fill(ds)
        MsgBox("Done.")
        ds.Dispose()
    Catch ex As System.Exception
        MsgBox(ex.Message)
    End Try

    da.Dispose()

該select語句在.0015秒內執行。

    Dim selectstring As String
    selectstring = "SELECT * FROM LineInfo WHERE jobNum='testing1' and revision_number=0 AND lineNum=13;"

    Dim selectCommand As New SqlClient.SqlCommand(selectstring, Singleton.DbConnection)
    Dim ds As New DataTable
    Dim a As New SqlClient.SqlDataAdapter(selectCommand)

    Try
        a.Fill(ds)
        MsgBox("Done.")
        ds.Dispose()
    Catch ex As System.Exception
        MsgBox(ex.Message)
    End Try

    a.Dispose()

我已經在論壇上閱讀了一些有關參數嗅探的內容,但這似乎與存儲過程有關。 我不確定從這里到哪里去,所以我想我會在堆棧溢出時嘗試所有這些。 有誰知道是什么引起了這個問題?

運行SQL事件探查器,並檢查擊中數據庫的實際SQL。 接受這兩個查詢,並在啟用了“顯示執行計划”的Query Analyzer / SQL Server Management Studio中運行它們,並查找花費時間。

如果服務器上的性能相同,請再次檢查.NET代碼。 有什么理由為什么要在上面的示例中使用DataSet而在下面的示例中使用DataTable?

我希望您的查詢時間更快是因為SQL Server以前已經緩存了您的確切查詢。 嘗試更改這些值,然后查看它是否仍然可以快速運行。

我會專門看

selectCommand.Parameters.Add("@jobnum", "testing1")

在進行查找之前,我曾經歷過將整個索引轉換為unicode的經歷。 這可能是罪魁禍首。 在這種情況下,您要創建一個參數並將其設置為鍵入ansi字符串或類似的字符串。

不能肯定地說(並不是真的引起了SQL引擎的所有復雜性),但是首先讓我驚訝的是對數字列使用字符串參數:

selectCommand.Parameters.Add("@revnum", "0")

revision_number=0

我懷疑在第二個示例中,如果您使用字符串而不是數字值,那么它也會變慢...嘗試一下,看看會發生什么。

我必須將參數語句更改為:

   selectCommand.Parameters.Add("@jobnum", SqlDbType.Char).Value = "testing1"
   selectCommand.Parameters.Add("@revnum", SqlDbType.Int).Value = 0
   selectCommand.Parameters.Add("@linenum", SqlDbType.Int).Value = 13

僅更改@revnum參數是不夠的,我不得不全部更改。 無論如何,它都在起作用,我現在知道如何處理它。

謝謝。

您是否能夠始終如一地重現每個版本的執行時間? 是否有可能先運行參數化版本,然后在運行動態SQL版本時查詢已被緩存?

我不知道您的.net驅動程序是否具有相似的功能,但是JDBC驅動程序具有選項“ sendStringParametersAsUnicode”,請參閱http://msdn.microsoft.com/de-de/library/ms378988.aspx

我懷疑這是否是答案,因為我不太了解VB,但是我看到在第一個代碼段中,將revnum設置為“ 0”,而將linenum設置為13(無引號)。

我不知道VB數據的鍵入方式是否足夠自信,但是在將revnum作為字符串並且必須在SQL查詢過程中將其轉換為整數的情況下,會不會出現一些怪異的行為?

我相信參數嗅探也適用於此,因為SQL Server像存儲過程一樣緩存SQL語句的執行計划。 您可以嘗試清除語句高速緩存,然后使用相同的參數在運行速度最快的地方重新運行該語句,以查看其是否加速。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM