SQL SERVER資料庫datediff函式引發的效能問題
今天,一哥們反饋系統很慢,很卡,讓我遠端看一下。我遠端過去查了一下資料庫系統,發現很多阻塞,語句都基本相似,並且表的資料也不大,只有10多萬條記錄。
1、問題分析:
本系統是sql server資料庫,仔細分析了該語句,就是想查詢與當前日期差異為3分鐘。就這麼一個條件,由於使用的人多,所以造成了阻塞。
條件如下:
where datediff(mi,uptime,getdate())>=3
仔細檢視了資料庫的索引,並沒有關於uptime的索引,再檢視執行計劃,該語句走的是全表掃描,但實際上即使使用索引,該語句也不會使用索引,因為針對此列使用函式。
2、優化解決
將where後面的條件進行修改調整
修改為如下:
uptime <= DateAdd(minute,-3,getdate())
另外,如果條件可以,再建議查詢前將getdate()
@date = getdate()
這樣調整後,再針對uptime欄位建上索引,問題得到圓滿解決,阻塞沒有了。
3、關於兩個函式的說明
3.1 dateiff使用說明
DateDiff 函式用於判斷在兩個日期之間存在的指定時間間隔的數目。例如可以使用 DateDiff 計算兩個日期相差的天數,或者當天到當年最後一天之間的星期數。要計算 date1 和 date2 相差的天數,可以使用“一年的日數”(“y”)或“日”(“d”)。當 interval 為“一週的日數”(“w”)時,DateDiff 返回兩個日期之間的星期數。如果 date1 是星期一,則 DateDiff 計算到 date2 之前星期一的數目。此結果包含 date2 而不包含 date1。如果 interval 是“周”(“ww”),則 DateDiff 函式返回日曆表中兩個日期之間的星期數。函式計算 date1 和 date2 之間星期日的數目。如果 date2 是星期日,DateDiff 將計算 date2,但即使 date1 是星期日,也不會計算 date1。
如果 date1 晚於 date2,則 DateDiff 函式返回負數。
firstdayofweek 引數會對使用“w”和“ww”間隔符號的計算產生影響。
如果 date1 或 date2 是日期文字,則指定的年度會成為日期的固定部分。但是如果 date1 或 date2 被包括在引號 (" ") 中並且省略年份,則在程式碼中每次計算 date1 或 date2 表示式時,將插入當前年份。這樣就可以編寫適用於不同年份的程式程式碼。
在 interval 為“年”(“yyyy”)時,比較 12 月 31 日和來年的 1 月 1 日,雖然實際上只相差一天,DateDiff 返回 1 表示相差一個年份。
下面的示例利用 DateDiff 函式顯示今天與給定日期之間間隔天數:
Function DiffADate(theDate)
DiffADate = "從當天開始的天數:" & DateDiff("d", Now, theDate)
End Function
由於該函式在查詢使用過程中,經常會把列做為一個引數值,再加上另一個時間值進行比較,導致函式無法使用索引,很多情況下會導致效能下降
3.2 dateadd使用說明
可以使用 DateAdd 函式對日期加上或減去指定的時間間隔。例如,可以用 DateAdd 來計算距今天為三十天的日期;或者計算距現在為 45 分鐘的時間。
為了對 date 加上“日”,可以使用“一年的日數” (“y”),“日” (”d”) 或“一週的日數” (”w”)。
DateAdd 函式將不返回有效日期。在以下例項中將 1 月31 日加上一個月:
DateAdd(m, 1, 31-Jan-95)
上例中,DateAdd 返回 1995 年 2 月 28 日,而不是 1995 年 2 月 31 日。如果 date 是 1996 年 1 月 31 日,則由於 1996 年是閏年,返回值是 1996 年 2 月 29 日。
如果計算的日期超前 100 年(減去的年度超過 date 中的年份),就會導致錯誤發生。
如果 number 不是一個 Long 值,則在計算時取最接近的整數值來計算。
注意 DateAdd 返回值的格式由 Control Panel設定決定,而不是由傳遞到date 引數的格式決定。
DateAdd ( "m" , 1 , "31-Jan-98")
結果: 28-Feb-98
將日期 31-Jan-98 加上一個月,結果為 28-Feb-98 而非 31-Fe-98 。
DateAdd ( "d" , 20 , "30-Jan-99")
結果: 1999/2/9
將一個日期 30-Jan-99 加上 20 天后的日期。
由於該函式裡面只包含一個日期值,那麼在查詢的時候,就可以不對當前的日期列進行轉換,而是將比較的日期及差值放在=、<=、>=的右面,這樣,就可以使用索引。
4、最後關於這個系統的建議
最後應這哥們的要求,我們對資料庫進行了一番巡檢,發現問題還是比較多的
4.1、調整隔離級別!
4.2、記憶體使用不多,cpu高,io比較大,可能很多物理讀,索引優化及碎片整理!
4.3、記憶體使用上不去,是不是存在sql server支援的記憶體方面有問題,需要進一步排查!
原文連線:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29371470/viewspace-2130906/,如需轉載,請註明出處,否則將追究法律責任。
本人補充內容:
首先說明一下,如果 使用 DateAdd 方法能夠解決問題,下面的內容就不需要看了(根據你查詢資料的實際情況)。如果沒辦法使用dateAdd方法完成我們想要實現的功能,那麼要考慮使用其他函式了(我這裡使用的是 sqlserver中的 convert 函式進行處理的)
最近在測試系統的時候,發現系統有些統計功能非常慢,介面功能有按年、月、季度等選項來統計資料,最後找到sql語句發現沒有走索引,但是表中建立了索引以及表資料才 10萬條資料量。
查詢條件是這樣的(這裡是按月統計資料):
where datediff(month, upload_time, getdate()) = 0
發現沒有走索引,資料庫表中為 upload_time 欄位建立了索引。於是對sql語句進行整改。
整改後的查詢條件是這樣的(查詢10月份資料):
where convert(varchar(7), upload_time, 23) = '2020-10'
關於 convert 及其他日期函式詳細資訊,請檢視下面的內容:
SqlServer資料型別及日期格式轉換參照表
SQL Date 函式( MySQL 與 SQL SERVER)
相關文章
- Serverless 解惑——函式計算如何訪問 SQL Server 資料庫Server函式SQL資料庫
- SQL Server資料庫中的資料型別隱式轉換問題SQLServer資料庫資料型別
- SQL Server資料庫————模糊查詢和聚合函式SQLServer資料庫函式
- SQL Server 資料庫開發中的十大問題VYSQLServer資料庫
- Django ORM 引發的資料庫 N+1 效能問題DjangoORM資料庫
- SQL Server資料庫之datepart和datediff應用查詢當天上午和下午的資料SQLServer資料庫
- SQL Server資料庫恢復常見問題SQLServer資料庫
- Sql Server資料庫類似正規表示式的字元處理問題SQLServer資料庫字元
- SQL Server資料庫中Substring函式的用法例項詳解SQLServer資料庫函式
- Sql Server資料庫開窗函式Over()的使用例項詳解SQLServer資料庫函式
- sql server 資料型別轉換函式SQLServer資料型別函式
- SQL Server 資料庫 最佳化 效能瓶頸SQLServer資料庫
- 從函式式元件引發的效能思考函式元件
- 資料庫映象 (SQL Server)資料庫SQLServer
- SQL Server資料庫安全SQLServer資料庫
- 【資料庫資料恢復】SQL SERVER資料庫MDF (NDF)或LDF損壞問題如何解決?資料庫資料恢復SQLServer
- SQL Server常用函式整理SQLServer函式
- SQL Server 2016 函式:CASTSQLServer函式AST
- SQL Server資料庫檢視login所授予的具體許可權問題SQLServer資料庫
- sql server 資料庫收縮SQLServer資料庫
- Blazor使用sql server 資料庫BlazorSQLServer資料庫
- SQL Server資料庫巡檢SQLServer資料庫
- sql server 2005資料庫快照SQLServer資料庫
- SQL Server收縮資料庫SQLServer資料庫
- 管理SQL Server資料庫安全SQLServer資料庫
- SQL Server資料庫遷移SQLServer資料庫
- SQL SERVER 日期和時間資料型別及函式 (Transact-SQL)SQLServer資料型別函式
- Mybatis PageHelper編譯SQL引發的一次效能問題.18286262MyBatis編譯SQL
- SQL Server資料庫恢復,SQL Server資料恢復,SQL Server資料誤刪除恢復工具SQLRescueSQLServer資料庫資料恢復
- 【SQL】18 SQL NULL 函式、SQL 通用資料型別、SQL 用於各種資料庫的資料型別SQLNull函式資料型別資料庫
- 【故障公告】阿里雲 RDS SQL Server 資料庫例項 CPU 100% 引發全站故障阿里SQLServer資料庫
- 資料庫sql的優化問題的面試題資料庫SQL優化面試題
- Sql Server 資料庫學習-常用資料庫 物件SQLServer資料庫物件
- 如何解決SQL Server資料庫的軟硬體效能瓶頸OCSQLServer資料庫
- 使用SQL-Server分割槽表功能提高資料庫的讀寫效能SQLServer資料庫
- 資料庫映象 (SQL Server)操作模式資料庫SQLServer模式
- SQL Server 跨資料庫查詢SQLServer資料庫
- SQL Server 資料訪問策略:CLRMESQLServer