none
想撈取最近30天的資料,哪一個寫法效能比較好 RRS feed

  • 問題

  • 各位前輩好,小弟有個問題,如何撈出最近30天內的資料,其中[MyDate]型態是datetime,

    有寫出三個做法,但不知道哪一個效能比較好,或您有更好的建議,謝謝。

    SELECT * FROM [dbo].[MyTable] 
    WHERE [MyDate] >= CAST(DATEADD (day, -30, GETDATE()) AS date) 

    SELECT * FROM [dbo].[MyTable]
    WHERE [MyDate] >= CONVERT(CHAR(8) ,GETDATE()-30, 112)

    SELECT * FROM [dbo].[MyTable] 
    WHERE DATEDIFF(day, DATEADD(day, -30, GETDATE()), [MyDate]) >= 0

    2019年7月31日 上午 10:18

解答

  • 我印象中,有一個原則是
    當WHERE條件裡有『函數運算』時(例如您的計算日期)
    那麼即使您的條件欄位有index
    他依舊會採用TableScan

    因此小喵個人首先的建議,就是把條件中的函數運算移到查詢語法外

    DECLARE @Day30 AS DateTime
    SET @Day30 = CAST(DATEADD (day, -30, GETDATE()) AS date)
    
    SELECT *
    FROM dbo.MyTable
    WHERE [MyDate] >= @Day30

    然後,如果量大,效率不佳,再考慮加Index才有作用

    提供您參考

    ^.^a


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...


    • 已編輯 topcat_小喵MVP 2019年8月1日 上午 07:18 增加內容
    • 已提議為解答 No.18MVP 2019年8月6日 上午 03:30
    • 已標示為解答 taco0508 2019年8月12日 上午 08:37
    2019年8月1日 上午 07:18

所有回覆

  • 您可以用SQL Server Profiler量測看看, 請參考:

    Measuring SQL Query Performance

    2019年8月1日 上午 12:35
  • 其中一個建議:

    用 Select * 通常會比較慢,如果要快,欄位名稱就要乖乖寫清楚。


    在現實生活中,你和誰在一起的確很重要,甚至能改變你的成長軌跡,決定你的人生成敗。 和什麼樣的人在一起,就會有什麼樣的人生。 和勤奮的人在一起,你不會懶惰; 和積極的人在一起,你不會消沈; 與智者同行,你會不同凡響; 與高人為伍,你能登上巔峰。 https://skilltree.my/

    2019年8月1日 上午 07:09
  • 我印象中,有一個原則是
    當WHERE條件裡有『函數運算』時(例如您的計算日期)
    那麼即使您的條件欄位有index
    他依舊會採用TableScan

    因此小喵個人首先的建議,就是把條件中的函數運算移到查詢語法外

    DECLARE @Day30 AS DateTime
    SET @Day30 = CAST(DATEADD (day, -30, GETDATE()) AS date)
    
    SELECT *
    FROM dbo.MyTable
    WHERE [MyDate] >= @Day30

    然後,如果量大,效率不佳,再考慮加Index才有作用

    提供您參考

    ^.^a


    topcat(姍舞之間的極度凝聚)
    http://www.dotblogs.com.tw/topcat
    世界上有兩樣東西分享給別人後,不但不會變少,還會變更多:
    一個是快樂,另一個是知識~ 分享...是知識累積的開始...


    • 已編輯 topcat_小喵MVP 2019年8月1日 上午 07:18 增加內容
    • 已提議為解答 No.18MVP 2019年8月6日 上午 03:30
    • 已標示為解答 taco0508 2019年8月12日 上午 08:37
    2019年8月1日 上午 07:18