2014-11-05 279 views
0

我有一個查詢,我運行,但它需要幾小時才能完成。它運行在一個超過500萬行的桌子上。我嘗試過用不同的部分來調整它,但是對SQL進行了有限的培訓,並沒有對SQL優化進行培訓。任何幫助,使其更快一點,將大大appriciated。SQL Server優化查詢數百萬行

查詢:

UPDATE Work_Orders SET status_ref = (SELECT id FROM Status s WHERE s.status LIKE 'Invalid Loan Number') 
WHERE id IN (SELECT w.id FROM Work_Orders w LEFT JOIN (SELECT * FROM Contract_Code_Ref c WHERE c.contract_code = 'AAA') a 
ON w.file_name LIKE a.prior_servicer_loan_number + '%' 
WHERE a.id IS NULL AND w.work_order_ref = (SELECT id FROM Work_Order_Lookup l WHERE l.work_order = '1234')); 

表結構:

Work_Orders: 
id    bigint 
work_order_ref int 
path   varchar(300)  
file_name  varchar(150)  
file_size  bigint 
loan_number  varchar(15) Null 
scan_date  date  Null 
doctype   varchar(50) Null 
status_ref  tinyint 
last_updated timestamp 


Work_Order_Lookup: 
id   int 
work_order varchar(6) 


Status: 
id  int 
status varchar(30) 


Contract_Code_Ref: 
id int Unchecked 
contract_code    varchar(3) 
prior_servicer_loan_number varchar(15) 
current_loan_number   varchar(10) 
last_updated    timestamp 

我使用SQL Server 2014快件。

在此先感謝!

+0

這是一個完整的列更新和選擇語句,是否正確? – mxix 2014-11-05 17:00:53

+0

對不起,選擇那裏進行測試。這是真正的查詢 – 2014-11-05 17:18:33

回答

1
UPDATE w 
SET status_ref = (SELECT id FROM Status s WHERE s.status LIKE 'Invalid Loan Number') 
FROM 
Work_Orders w 
WHERE 
NOT EXISTS 
(
SELECT * 
FROM 
Contract_Code_Ref c 
WHERE 
c.contract_code = 'AAA' 
-- this is probably the issue 
AND w.file_name LIKE a.prior_servicer_loan_number + '%' 
) 
AND w.work_order_ref = (SELECT id FROM Work_Order_Lookup l WHERE l.work_order = '1234') 
AND status_ref <> (SELECT id FROM Status s WHERE s.status LIKE 'Invalid Loan Number'); 

把一個指數Work_Order_Lookup.work_order,一個在Work_Orders.work_order_ref,和一個在Contract_Code_Ref.contract_code。

+0

我不敢相信我沒有這些索引...查詢太棒了,謝謝! – 2014-11-06 16:26:54

0

你的桌子上有任何idexes嗎?

我看到的主要問題是所有的子查詢。子查詢不是一個好方法。

您是否必須每次更新每一行?你可以通過在那裏放置一個where子句來使更新語句更快。您的數據的幾個例子可能有助於更快得到答案。