2014-11-05 7 views
0

У меня есть запрос, который я запускаю, но для завершения требуется несколько часов. Он работает на столе с более чем 5 миллионами строк. Я попытался испортить различные порции, чтобы настроить его, но имеет ограниченную подготовку в SQL и без обучения оптимизации SQL. Любая помощь, чтобы сделать это даже немного быстрее, будет значительно оценена.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 Express.

Заранее благодарен!

+0

Это полное обновление столбца и выбор, правильный? – mxix

+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.

+0

Не могу поверить, что у меня еще не было этих индексов ... Запрос тоже потрясающий, спасибо! –

0

У вас есть идеи на ваших столах?

Основная проблема, которую я вижу, - это все подзапросы. Суб-запросы не являются отличным способом.

Нужно ли обновлять каждую строку каждый раз? Вы можете сделать инструкцию обновления быстрее, поставив там предложение where. Несколько примеров ваших данных могут помочь получить ответ быстрее.

Смежные вопросы