[英]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.