SQL Server优化了数百万行的查询

时间:2014-11-05 16:54:43

标签: sql-server query-optimization

我有一个运行的查询,但需要几个小时才能完成。它运行在一个超过500万行的表上。我已经尝试搞乱不同的部分来调整它,但是在SQL中训练有限,没有SQL优化培训。任何有助于提高速度的帮助都会受到极大的关注。

查询:

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 express。

提前致谢!

2 个答案:

答案 0 :(得分: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上。

答案 1 :(得分:0)

你在桌子上有任何想法吗?

我看到的主要问题是所有子查询。子查询不是一个好方法。

您是否每次都要更新每一行?您可以通过在那里放置where子句来更快地更新语句。您的数据的一些示例可能有助于更快地得到答案。