2013-07-17 86 views
0

我有了的SQL Server查詢性能問題

  • 非唯一ID列的表
  • 各種數據

  • 正列時數據的日期已更新

    我有一個查詢,給定一個日期範圍,它獲取在該日期範圍內更新的條目列表以及它剛剛找到的最後一個更新之前的條目列表。通常日期範圍在一天之內,因此07-10-2013 00:00:000 - 7-11-2013 00:00:000。

    例如。鑑於2013年7月10日00:00:000 - 2013年7月11日00:00:000,查詢結果2項

    id new data  updatedate    old data  last updatedate 
    3 randomdata 7-10-2013 03:30:343  randomdata 7-05-2013 06:34:764 
    4 randomdata 7-10-2013 13:30:343  randomdata 6-09-2013 04:37:376 
    

    這是結果,我想獲得。目前,我已經有了一個查詢,但是查詢速度很慢,因爲表中有3個內部聯接,這些聯接有很多條目,我想知道是否有人可以想出一種更快的查詢方式。使用SQL Server 2000

    表信息

    • 非唯一ID
    • 唯一的ID(這僅僅是一個自動遞增ID)
    • 將收集的各種數據
    • 更新日期

    編輯:

    我ndexes目前都在idupdatedate

    查詢我目前使用(概括的話)::警告::這不是漂亮::警告::

    select * 
    from 
        (select distinct 
         s1.id as id, 
         s1.randData1, s2.randData1, s1.randData2, s2.randData2,..., 
         s1.updatedate as newupdatedate, 
         s2.updatedate as prevupdatedate, 
         datediff(second, s1.updatedate ,s2.updatedate) as maxdate 
        from 
         (select * 
         from updates 
         where updatedate >= '{0}' and updatedate < '{1}' 
          and id in ('{3}')) as s1 
        inner join 
         updates s2 on s1.id = s2.id and s1.updateid != s2.updateid) as t1 
    inner join 
        (select 
          s1.id, max(datediff(second, s1.updatedate, s2.updatedate)) as maxdate2 
         from updates s1 
         inner join updates s2 on s1.id in ('{3}') and s1.id = s2.id and s1.updateid != s2.updateid 
         where datediff(second, s1.updatedate, s2.updatedate) < 0 
         and s1.updatedate < '{1}' and s2.updatedate < '{1}' 
         group by 
         s1.id) as t2 on t1.id = t2.id and t1.maxdate = t2.maxdate2 
    

    {0 } {1}和{2}是傳入的參數。

    編輯:如果有什麼區別,查詢正在C#中執行。如有必要,2個查詢也會很好。我最終尋找的是在所選日期的數據中發生了什麼變化。

  • +2

    你能發佈查詢,並告訴我們在什麼地方指標? –

    回答

    0

    我已經有了相當好的運氣,將所有嵌套的select語句放到#Temp表中。取決於你真的在說些什麼,你可能會使用表變量。

    還可以逐步檢查您的查詢,看看您是否確實需要在每個嵌套查詢中攜帶所有數據。換句話說,所有的嵌套查詢都會被外部查詢使用,或者是額外的數據。

    我認爲在這裏使用臨時表的複雜性將是你最好的選擇。這樣,所有的嵌套查詢都可以構建臨時表,而不必將它們保存在內存中。

    您的最終查詢將更加緊湊和快得多。

    +0

    第一個執行不同randData的內部查詢是我正在查找的數據,第二個maxdate2用於查找所選中之前的日期條目。我試圖儘可能地限制內連接的內容,因爲我對Sql性能的瞭解很少。我想如果第一個外部表有最小數量的條目,那麼外部內部聯接會更快。希望這不是太混亂。 – LazyProgrammer

    +0

    只需要多條語句。讓你的嵌套select語句設置在一些真正的表中,然後在完成時截斷它們。這樣,你只有一條select語句,它正在回看磁盤上不在內存中的表。 – TTUGecko

    0

    嘗試使用臨時表 -

    IF OBJECT_ID (N'tempdb.dbo.#temp') IS NOT NULL 
        DROP TABLE #temp 
    
    SELECT * 
    INTO #temp 
    FROM dbo.updates 
    WHERE ID IN ('{3}') 
    
    SELECT * 
    FROM 
        (
        SELECT DISTINCT 
          s1.id AS id, 
          s1.randData1, s2.randData1, s1.randData2, s2.randData2, 
          s1.updatedate AS newupdatedate, 
          s2.updatedate AS prevupdatedate, 
          DATEDIFF(second, s1.updatedate ,s2.updatedate) AS maxdate 
        FROM 
        (
          SELECT * 
          FROM #temp 
          WHERE updatedate BETWEEN '{0}' AND '{1}' 
        ) s1 
        JOIN #temp s2 ON s1.id = s2.id AND s1.updateid != s2.updateid 
    ) t1 
    JOIN (
        SELECT 
          s1.id, 
          MAX(DATEDIFF(second, s1.updatedate, s2.updatedate)) AS maxdate2 
        FROM #temp s1 
        JOIN #temp s2 ON s1.id = s2.id AND s1.updateid != s2.updateid 
        WHERE DATEDIFF(second, s1.updatedate, s2.updatedate) < 0 
          AND s1.updatedate < '{1}' AND s2.updatedate < '{1}' 
        GROUP BY s1.id 
    ) t2 ON t1.id = t2.id AND t1.maxdate = t2.maxdate2 
    
    +0

    問題在於我在C#中運行查詢,所以我不確定這是否可行,因爲有2個select語句。對不起,我可能應該添加到原始文章。 – LazyProgrammer