如果SQL的數(shù)據(jù)庫越來越多,有時候會遇到讀取超時,鎖等一大堆問題,按經(jīng)驗來說,數(shù)據(jù)結(jié)構(gòu)設(shè)計不合理,經(jīng)常使用視圖等原因都有,那些怎么解決呢?
1、由于數(shù)據(jù)庫設(shè)計問題造成SQL數(shù)據(jù)庫新增數(shù)據(jù)時超時
癥狀:
A、
Microsoft OLE DB Provider for SQL Server 錯誤 '80040e31'
[ODBC SQL Server Driver]超時已過期)
B、靜安服務(wù)器上看CPU、內(nèi)存占用率很低;
C、事件日志中提示: 數(shù)據(jù)庫 '*********' 中文件 '***********' 的自動增長在 453 毫秒后已取消或出現(xiàn)超時。使用 ALTER DATABASE 設(shè)置更小的 FILEGROWTH 或設(shè)置新的大小。
原因:
數(shù)據(jù)庫設(shè)置時,[文件增長]按百分比來增長,當(dāng)數(shù)據(jù)庫文件很大時(1G以上),新增操作都會報超時,而這時候其實CPU、內(nèi)存占用率都非常非常的低。
解決方法:
把上述的文件增長這里設(shè)置為一個更低的百分比或者直接指定增加多少兆字節(jié)。
2、SQL Server數(shù)據(jù)庫超時設(shè)置
修改客戶端的連接超時設(shè)置。默認(rèn)情況下,通過企業(yè)管理器注冊另外一臺SQL Server的超時設(shè)置是 4 秒,而查詢分析器是 15 秒。
企業(yè)管理器中的設(shè)置:
A、在企業(yè)管理器中,選擇菜單上的"工具",再選擇"選項";
B、在彈出的"SQL Server企業(yè)管理器屬性"窗口中,點擊"高級"選項卡;
C、在"連接設(shè)置"下的"登錄超時(秒)"右邊的框中輸入一個比較大的數(shù)字,如 30。
查詢分析器中的設(shè)置:
單擊“工具”->"選項"->"連接"; 將登錄超時設(shè)置為一個較大的數(shù)字,連接超時改為0。
3、查詢語句時超時
原因分析:
查詢超時一般來說首先要從sql語句和數(shù)據(jù)表的結(jié)構(gòu)上找原因,優(yōu)化sql語句和為數(shù)據(jù)庫的查詢字段建索引是最常用的辦法。
另外,數(shù)據(jù)庫的查詢超時設(shè)置一般是sqlserver自己維護的(在你沒有修改query wait配置前),只有當(dāng)你的實際查詢時間超過估計查詢時間的25倍時,才會超時。而造成超出估計值那么多的原因有兩種可能:
一是估計時間不準(zhǔn)確;
二是sql語句涉及到大量占用內(nèi)存的查詢(如排序和哈希操作),內(nèi)存不夠,需要排隊等待資源造成的。
解決辦法:
A、優(yōu)化語句,創(chuàng)建/使用合適的索引;
B、解決第一個問題的方法,更新要查詢表的索引分發(fā)統(tǒng)計,保證估計時間的正確性,UPDATE STATISTICS 表名;
C、增加內(nèi)存。
如果想手動設(shè)置查詢超時,可以使用以下語句:
sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
sp_configure 'query wait', 2147483647
GO
RECONFIGURE
GO
4、應(yīng)用程序連接失敗
故障:
在應(yīng)用程序中我們也會遇到類似的錯誤信息,例如:
Microsoft OLE DB Provider for ODBC Drivers 錯誤 '80004005'
[Microsoft][ODBC SQL Server Driver]超時已過期
解決方法:
A、如果遇到連接超時的錯誤,我們可以在程序中修改 Connection 對象的超時設(shè)置,再打開該連接。例如:
<%
Set Conn = Server.CreateObject("ADODB.Connection")
DSNtest="DRIVER={SQL Server};SERVER=ServerName;UID=USER;PWD=password;DATABASE=mydatabase"
Conn. Properties("Connect Timeout") = 15 '以秒為單位,0表示不限制
Conn.open DSNtest
%>
B、如果遇到查詢超時的錯誤,我們可以在程序中修改 Recordset 對象的超時設(shè)置,再打開結(jié)果集。例如:
Dim cn As New ADODB.Connection
Dim rs As ADODB.Recordset
cmd1 = txtQuery.Text
Set rs = New ADODB.Recordset
rs.Properties("Command Time Out") = 300
'同樣以秒為單位,如果設(shè)置為 0 表示無限制
rs.Open cmd1, cn
rs.MoveFirst