2014-11-05 175 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子句来使更新语句更快。您的数据的几个例子可能有助于更快得到答案。