簡體   English   中英

SQL Server加載時間過多

[英]Sql Server takes too much time to load

我有一個查詢,它在一個月的每個小時中獲取每天的所有數據,當我在sql server中運行它時,花費太多時間,我的Web報告中出現超時錯誤。 還有其他方法可以查詢並獲得相同的結果嗎?

SELECT DISTINCT  CONCAT(date,' ',FORMAT(CAST([dbo].[TALAGA_PL70_FEEDER_1].time as datetime) , 'HH')) as Time, 
              [dbo].[TALAGA_PL70_FEEDER_1].Ia, 
              [dbo].[TALAGA_PL70_FEEDER_1].Ib, 
              [dbo].[TALAGA_PL70_FEEDER_1].Ic, 
              [dbo].[TALAGA_PL70_FEEDER_1].Ineutral
          FROM [dbo].[TALAGA_PL70_FEEDER_1] 
          JOIN (
               SELECT CONCAT(date,' ',MIN(time)) as mints FROM [TALAGA_PL70_FEEDER_1]  
                WHERE (date >= '2019-04-26' 
                AND date  <= '2019-05-25')  
                GROUP BY date, DATEPART(hh, time)

            )tt 
          ON [dbo].[TALAGA_PL70_FEEDER_1].time = tt.mints AND [TALAGA_PL70_FEEDER_1].date = tt.mints
          ORDER BY 1 ASC

這是示例sql結果:

Time          | Ia               | Ib                | Ic               |  Ineutral
-------------------------------------------------------------------------------------------
2019-04-26 00 | 169.809661865234 |  163.836029052734 | 157.159591674805 |  13.2650079727173
2019-04-26 01 | 159.619323730469 |  155.754028320313 | 149.516830444336 |  10.7174234390259
2019-04-26 02 | 152.855056762695 |  148.814056396484 | 140.819900512695 |  12.0351390838623
2019-04-26 03 | 146.969253540039 |  144.773056030273 | 135.900436401367 |  11.1566619873047

表格架構:

GO
 CREATE TABLE [dbo].[TALAGA_PL70_FEEDER_1](
[id] [int] IDENTITY(1,1) NOT NULL,
[date] [date] NOT NULL,
[time] [time](7) NOT NULL,
[Ineutral] [float] NULL,
[Ia] [float] NULL,
[Ib] [float] NULL,
[Ic] [float] NULL,
[Iave] [float] NULL,
[Ig] [float] NULL
 ) ON [PRIMARY]

 GO
 ALTER TABLE [dbo].[TALAGA_PL70_FEEDER_1] ADD  CONSTRAINT 
 [DF__TALAGA_FEE__date__0F975522]  DEFAULT (getdate()) FOR [date]
 GO
 ALTER TABLE [dbo].[TALAGA_PL70_FEEDER_1] ADD  CONSTRAINT 
 [DF__TALAGA_FEE__time__108B795B]  DEFAULT (getdate()) FOR [time]

我在網絡報告中遇到的錯誤:

數組([0] =>數組([0] => 08S01 [SQLSTATE] => 08S01 [1] => 258 [代碼] => 258 [2] => [Microsoft] [用於SQL Server的ODBC驅動程序11]內存提供程序:超時錯誤[258]。[消息] => [Microsoft] [SQL Server的ODBC驅動程序11]共享內存提供程序:超時錯誤[258]。)[1] =>數組([0] => 08S01 [ SQLSTATE] => 08S01 [1] => 258 [代碼] => 258 [2] => [Microsoft] [用於SQL Server的ODBC驅動程序11]通信鏈接失敗[消息] => [Microsoft] [用於SQL的ODBC驅動程序11服務器]通信鏈接失敗)[2] =>數組([0] => 08S01 [SQLSTATE] => 08S01 [1] => -2147467259 [code] => -2147467259 [2] => [Microsoft] [ODBC驅動程序11表示SQL Server]通訊鏈接失敗[消息] => [Microsoft] [ODBC驅動程序11表示SQL Server]通訊鏈接失敗))

除非您沒有將其包括在內,否則您的表似乎沒有索引。 我還假設查詢查詢的月份比數據更多。 因此查詢每次都必須查看整個表。 實際上,它很可能兩次擊中了整個表,一次是在內部查詢中創建每小時的時段,然后再次確定是將每一行放入哪個時段。

您可能對如何正確建立索引有不同意見,但是如果這是我的數據庫,我會在id列上創建一個主聚集索引,然后在日期(包括時間列)上創建一個非聚集索引。

可能還需要在外部查詢中添加where子句,以將其過濾為與內部查詢相同的日期范圍。

嘗試使用窗口功能:

SELECT date,
       RIGHT('00' + DATENAME(hour, f.time), 2) as Time,
       f.Ia, f.Ib, f.Ic, f.Ineutral
FROM (SELECT f.*,
             ROW_NUMBER() OVER (PARTITION BY date, DATEPART(HOUR, f.time) ORDER BY f.time ASC) as seqnum
      FROM [dbo].[TALAGA_PL70_FEEDER_1] f
      WHERE date >= '2019-04-26' AND
            date <= '2019-05-25' 
     ) f
WHERE seqnum = 1;
ORDER BY 1 ASC;

筆記:

  • 我通常討厭混合類型,因此我將日期和小時分為不同的列。
  • 有傳言說FORMAT()比其他日期/時間函數要慢得多,但我懷疑這會對您的時間安排產生很大影響。
  • 為了提高性能,請在date創建索引。
  • 除非要添加計算列,否則您對ROW_NUMBER()不能做太多事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM