我有一个运行的查询,但需要几个小时才能完成。它运行在一个超过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。
提前致谢!
答案 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子句来更快地更新语句。您的数据的一些示例可能有助于更快地得到答案。