2016-05-21 30 views
-1

我試圖在vb.net中運行此查詢,但每次它超時,因爲它超過49秒。vb.net SQL查詢將不會運行 - 超時

Dim customer_sequence As Integer = 0 
Dim description As String = "" 
Dim customer_cost As Double = 0 
Dim customer_connection As Double = 0 
Dim customer_ac As Double = 0 
Dim customer_sc As Double = 0 
Dim reseller_cost As Double = 0 
Dim reseller_connection As Double = 0 
Dim reseller_ac As Double = 0 
Dim reseller_sc As Double = 0 

SQL = "UPDATE billing_calldata SET " _ 
         & "status = 'c', " _ 
         & "customer = " & customer_sequence & ", " _ 
         & "description = '" & description & "', " _ 
         & "customer_cost = " & customer_cost & ", " _ 
         & "customer_ac = " & customer_ac & ", " _ 
         & "customer_sc = " & customer_sc & ", " _ 
         & "reseller_cost = " & reseller_cost & ", " _ 
         & "reseller_ac = " & reseller_ac & ", " _ 
         & "reseller_sc = " & reseller_sc & " " _ 
         & "WHERE sequence = " & sequence & ";" 

查詢的輸出是:

UPDATE billing_calldata SET 
status = 'c', 
customer = 470, 
description = 'Mobile', 
customer_cost = 0.006175, 
customer_ac = 0, 
customer_sc = 0, 
reseller_cost = 0, 
reseller_ac = 0, 
reseller_sc = 0 
WHERE sequence = 10348384;" 

在我的應用程序的所有其他查詢工作正常和快速,但它只是這樣一個需要年齡。

+4

非常多[重複/轉貼](http://stackoverflow.com/a/372​​62159/1070452) – Plutonix

+0

這是一個SQL問題,直到您提供您的代碼執行查詢。 –

+0

對不起,那不是假設在那裏。它是在實際的代碼 – charlie

回答

0

您可能需要將billing_calldata表中的索引添加到sequence列以提高性能。

根據你的數據庫平臺,它看起來類似於下面。 (這是一個SQL Server實例):

CREATE INDEX i_billing_calldata_sequence ON billing_calldata (sequence); 
+0

索引已被添加 – charlie

+0

對此有何想法? – charlie

+0

此表中有多少行? – NickHeidke

1

在SSMS執行查詢時,你有同樣的問題? 如果是這樣,

在我工作的企業中,與在SSMS中執行完全相同的查詢相比,使用ADO(通過我們的應用程序)某些查​​詢過於緩慢時,我遇到了一個問題。

在我們的例子中,初始化ADO連接時將ARITHABORT設置爲ON解決了我們的問題。

SET ARITHABORT ON 

你只需做一次每個連接,所以你可以使用的方法,如 下一個打開的連接,並首次設置的選項。

Public Shared Sub OpenAndSetArithAbort(MyConnection As SqlConnection) 
Using _Command As SqlCommand = MyConnection.CreateCommand() 
    _Command.CommandType = CommandType.Text 
    _Command.CommandText = "SET ARITHABORT ON;" 

    MyConnection.Open() 

    _Command.ExecuteNonQuery() 
End Using 

結束子

這裏是原因(見在端供參考)。

您的應用程序與ARITHABORT OFF連接,但是當您在SSMS中運行查詢時,ARITHABORT處於ON狀態,因此您將不會重用應用程序使用的緩存條目,但SQL Server將重新編譯該過程,嗅探當前參數值,並且您可能會得到與應用程序不同的計劃。所以,你對這篇文章的最初問題有一個可能的答案。我們將在下一章探討一些更多的可能性,但是在SQL 2005和更高版本中,SSMS中應用速度較慢的最常見原因是參數嗅探和ARITHABORT的不同默認值。

參考:Slow in the Application, Fast in SSMS? Understanding Performance Mysteries

+0

即時通訊使用MySQL,但同樣的問題正在發生在phpmyadmin – charlie

+0

不幸的是,我不太熟悉MySQL。 由於表格非常大,可能是MYSQL服務器性能問題。看看這個 http://www.tocker.ca/2013/10/24/improving-the-performance-of-large-tables-in-mysql.html –

1

閱讀一些其他意見後發佈的,你看着最後一次你的表進行分析?

EXPLAIN Update billing SET col1, col2,.... where sequence = 12345; 

請參閱此幫助您瞭解輸出。驗證您是否正在使用該查詢中的索引。 [https://www.sitepoint.com/using-explain-to-write-better-mysql-queries/][1]

對於高度事務性的表,最好讓分析保持最新狀態。基本上,如果沒有分析,數據庫可能會遇到問題,決定是否使用索引來獲取元組,並可能回落到全表掃描(在這種情況下,它聽起來像是發生了什麼....) 。

一旦您獲得了最新的分析結果,MySql優化器就會知道訪問您請求的記錄的最佳方法。

插入工作正常,因爲沒有完整的掃描是需要的......只是彈出行假設你沒有違反某種關鍵或約束。

更新需要導航到記錄所在的位置以更新相關字段......並且如果執行全表掃描,這將嚴重降低性能,特別是在較大的表中。