2017-06-05 179 views
0

我有一個SQL查詢,它使用來自填充的登臺表的SELECT INTO語句構建分析表。這一部分非常流暢,但是當我嘗試將字段附加到分析表時,相互之間或從原始臨時表中,UPDATE查詢運行HOURS。SQL Server更新查詢花費太長

我覺得這個運行時間是沒有根據的,因爲每個表的最多記錄是200K。我有一種感覺,這是我的日誌文件管理的問題,或者我沒有任何這些表的索引。我一直不願意建立索引,因爲我知道如果匆忙完成,他們實際上可能會導致更多問題。這些表中沒有任何觸發器。

我想找到一種方法,以便這個查詢運行一致。過去,它運行時間不到1小時(仍然可能過長),但今天例如它花費了3個多小時。

我已經將日誌文件修改爲自動增長50%而不是10%,擁有無限MAXSIZE,我已將DB恢復模式設置爲SIMPLE,並且手動縮小了日誌文件。這沒有任何幫助。

我知道TABLE SCANS是大型查詢滯後的來源,所以這裏的解決方案是爲我在下面描述的LEFT JOIN中使用的所有字段創建索引?這些片段是查詢滯後的確切示例。我對此有透明度,因爲我正在執行LIVE QUERY STATISTICS窗口中的腳本。

UPDATE a 
SET a.[Account ID] = b.[Account ID] 
FROM SFAX.dbo.Leads as a 
left join SFAX.dbo.Accts as b on a.[Company Account] = b.[Account Name] 
WHERE a.[Account ID] IS NULL; 

-- Link by website2 
UPDATE a 
SET a.[Account ID] = b.[Account ID] 
FROM SFAX.dbo.Leads as a 
left join SFAX.dbo.Accts as b on a.url2 = b.Website2 
WHERE a.[Account ID] IS NULL; 
-- 
UPDATE a 
SET a.[SFDC Account Name] = b.[Account Name] 
FROM SFAX.dbo.Leads as a 
left join SFAX.dbo.Accts as b on 
a.[Account ID] = b.[Account ID] 
WHERE a.[Account ID] IS NOT NULL; 

UPDATE a 
SET a.ConvertedFlag = b.[Lead ID] 
FROM SFAX.dbo.WhoAnalysis1 as a 
LEFT JOIN SFAX.dbo.Contacts as b ON a.WhoId = b.[Contact ID]; 
+4

請不要在列名中加空格 – Hogan

+2

您應該編制索引 – Hogan

+1

您不認爲CREATE TABLE語句可能有絲毫興趣嗎? –

回答

3

注:在你上面的意見表示懷疑。這很容易測試 - 在更新之前將腳本分成兩部分 - 運行第一部分 - 然後運行一次更新並計時。然後爲那個更新制作索引。再次運行它。它有多快幾個數量級呢?

如果您使用SQL工作,不要害怕索引 - 愛你的索引。對於

SFAX.dbo.Leads.[Company Account], [Account ID] 
SFAX.dbo.Accts.[Account Name] 

SFAX.dbo.Leads.url2, [Account ID] 
SFAX.dbo.Accts.Website2 

SFAX.dbo.Leads.[Account ID] 
SFAX.dbo.Accts.[Account ID] 

SFAX.dbo.WhoAnalysis1.WhoID 
SFAX.dbo.Contacts.[Contact ID] 

創建索引但是,請記住 - 如果你在你的數據庫改變了很多紀錄,這可以通過你的我的速度被限制/ O

+0

執行計劃中會有什麼突出的東西來證明這些指標確實是需要的嗎?如[建議](https://stackoverflow.com/a/20687291/578411)所示,[Account ID]索引中的空值是否需要額外關注? – rene

+0

我不認爲我見過亞倫伯特蘭是錯的,但這似乎在我的優化領域。我們有一個需要幾個小時的查詢,並且需要幾秒鐘的時間 - 首先簡單,然後根據需要進行優化。執行計劃掃描的事實顯示索引會有所幫助。 – Hogan

+0

@Hogan試圖將您的建議擴展到我的整個腳本,我只想澄清一些事情......當我創建索引時,您是否建議僅在JOIN中使用的字段上創建它?或者我應該在JOIN中使用的字段上創建一個索引,並且由UPDATE語句設置這個字段? – hansolo

1

下面有很多廢話的工作要做 - 所以不要這樣做。

UPDATE a 
SET a.[Account ID] = b.[Account ID] 
FROM SFAX.dbo.Leads as a 
left join SFAX.dbo.Accts as b on a.[Company Account] = b.[Account Name] 
WHERE a.[Account ID] IS NULL; 

如果b中沒有匹配,您將[a.Account ID]設置爲null。但是你只是在列的空值處選擇那些行。 所以不要這樣做 - 你的左連接是毫無意義的額外工作。將其更改爲內部聯接。這會有幫助嗎?在不知道數據特徵的情況下無法分辨。

+0

哇...這是微妙的 - 它不會改變查詢的速度,除非有一個索引,但好點。 – Hogan

+0

這是一個我從未想過的偉大建議。內部連接將有助於消除多餘的語句。 – hansolo