2017-06-30 28 views
1

我正在處理大量的大約134萬行數據,我想在表格中插入一個select查詢。 這是我的表SQL script (SQL Fiddle)SQL查詢比較處理效率,任何更好的解決方案?

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 
Id | Emitter | EmitterIBAN       | Receiver | ReceiverIBAN       |   Adresss       |  Value 
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 
1, Ernst,   HR53 8827 2118 4692 8207 5,   Kimbra,   CH20 1042 6T0N MDTG JT47 U,      3256 Arrowood Point   0002,  121.72 
2, Keene,   SK81 1004 7484 7505 6308 9259,  Torrance,  RO23 ZWTR OJKK VAU9 T5P4 2GDY,     35197 Green Ridge Way,     82.52 
3, Ernst,   HR53 8827 2118 4692 8207 5,   Kimbra,   CH20 1042 6T0N MDTG JT47 U,      3256 Arrowood Point   0048,  51.81 
4, Korie,   ME43 9833 9830 7367 4239 60,Roy,  IL69   9686 1536 8102 2219 165,      5 Swallow Alley,       88.01 
5, Ernst,   HR53 8827 2118 4692 8207 5,   Kimbra,   CH20 1042 6T0N MDTG JT47 U,      3256 Arrowood Point   0001,  133.99 
6, Charmine,  BG92 TOXX 8380 785I JKRQ JS,   Sarette,  MU67 RYRU 9293 5875 6859 7111 075X HR,   8 Sage Place,       36.30 
7, Ernst,   HR53 8827 2118 4692 8207 5,   Kimbra,   CH20 1042 6T0N MDTG JT47 U,      3256 Arrowood Point   0004,  186.99 

而且我選擇我的數據與此查詢


Select count(1) as NumberOperation, 
     MAX(Emitter) as EmitterName, 
     EmitterIban, 
     MAX(Receiver) as ReceiverName, 
     ReceiverIban, 
     MAX(ReceiverAddress) as ReceiverAddress, 
     SUM([Value]) as SumValues 
FROM TableEsperadoceTransaction 
Group By EmitterIban, 
     ReceiverIban 

,我得到以下結果

----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
NumberOperation | Emitter | EmitterIBAN       | Receiver | ReceiverIBAN       |   Adresss       |  SumValue 
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 
4,    Ernst,   HR53 8827 2118 4692 8207 5,   Kimbra,   CH20 1042 6T0N MDTG JT47 U,      3256 Arrowood Point   0002,  494,51 
1,    Keene,   SK81 1004 7484 7505 6308 9259,  Torrance,  RO23 ZWTR OJKK VAU9 T5P4 2GDY,     35197 Green Ridge Way,     82.52 
1,    Korie,   ME43 9833 9830 7367 4239 60,Roy,  IL69   9686 1536 8102 2219 165,      5 Swallow Alley,       88.01 
1,    Charmine,  BG92 TOXX 8380 785I JKRQ JS,   Sarette,  MU67 RYRU 9293 5875 6859 7111 075X HR,   8 Sage Place,       36.30 

我也有這個解決方案


SELECT DISTINCT * 
FROM (SELECT Count(1)  AS NumberOperation, 
       emitteriban AS _EmitterIban, 
       receiveriban AS _ReceiverIban, 
       Sum([value]) AS SumValues 
     FROM tableesperadocetransaction 
     GROUP BY emitteriban, 
        receiveriban) tmp_T 
     LEFT JOIN tableesperadocetransaction 
       ON tableesperadocetransaction.emitteriban = tmp_T._emitteriban 
       AND tableesperadocetransaction.receiveriban = 
        tmp_T._receiveriban 

,我會想知道什麼是最佳解決方案這兩個,如果有更有效的查詢?

感謝

+1

第一個應該更高效..你沒有加入臨時表..所以應該工作得更快.. – scaisEdge

+3

嘗試使用SET STATISTICS IO ON;在運行兩者之前,比較邏輯讀取的次數還可以看到哪個運行更快!最終取決於數據庫的結構,特別是索引 – JeffUK

+0

寫得很好的問題,但我不確定它需要被問到......當然,在自己的服務器上測量真實性能會更容易,而比問我們哪一個可能會更快。 –

回答

1

第二個查詢速度慢的原因是:

  1. 它有一個LEFT JOIN
  2. 它有一個子查詢
  3. 它有一個SELECT DISTINCT
  4. 擁有*代替列名

第一個是這樣做的最自然的方式。

有很多關於如何提高查詢性能和避免什麼。例如見:MSDN on improving queries

+1

嗨@TheEsisia感謝您的迴應和鏈接,我認爲這是非常重要的,我應該閱讀它的未來查詢 你認爲有更好的解決方案,我的情況或第一個是足夠的 – Esperadoce

+0

@Esperadoce就像我說的,你的第一個解決方案是非常自然的。除非它引起問題,否則你不需要改變任何東西。但是如果速度很慢,您可以考慮在表中添加索引,如鏈接中所述。祝你好運! – TheEsnSiavashi

0

第一個查詢應該更有效率。

如果你真的想加快速度,你需要確保你有一個覆蓋索引與EmitterIban,ReceiverIban作爲關鍵。

+0

你的意思是創建一個索引與EmitterIabn和ReceiverIban在一個索引原諒我不擅長的SQL,我想知道爲什麼這比使用一個索引EmitterIban和ReceiverIban一個更好? – Esperadoce

+0

是......根據您的查詢,這些方針的東西... 創建非聚集索引ix_TableEsperadoceTransaction_EmitterIban_ReceiverIban ON dbo.TableEsperadoceTransaction( \t EmitterIban ASC, ReceiverIban ASC \t) 包括:( \t發射器, \t接收器, \t ReceiverAddress, \t Value \t) WITH(FILLFACTOR = 95)ON [PRIMARY]; –

0

你可以試試這個。

在INNER JOIN中使用它後,您將獲得MIN(id)。這也是一種方法。

SELECT 
tmp.NumberOperation 
,tb.Emitter 
,tmp.EmitterIban 
,tb.Receiver 
,tmp.ReceiverIban 
,tb.Adresss 
,tmp.SumValues 
FROM (SELECT Count(1)  AS NumberOperation, 
       emitteriban AS EmitterIban, 
       receiveriban AS ReceiverIban, 
       Sum([value]) AS SumValues, 
       MIN(Id)  AS Id 
     FROM tableesperadocetransaction 
     GROUP BY emitteriban, 
        receiveriban) tmp 
     INNER JOIN tableesperadocetransaction tb 
       ON tableesperadocetransaction.id = tmp.Id