我有一个大型数据库(大小为1.7TB),并有一个维护索引作业来重建索引。这项工作安排在晚上11点。如何在索引作业的同时执行大型查询?
今天早上,我只是检查在服务器上运行的查询,我注意到索引作业仍在运行(超过10小时),因为另一个在服务器上运行的t-sql查询超过22小时,并锁定表格,表明该工作正试图重建它的索引。这就像一个无休止的进展,所以我不得不杀死阻塞会话(169)让索引作业继续运行。我的问题是;我如何避免索引作业正在工作的锁定表。我知道重建索引正在将表bcs锁定为脱机状态,但是我应该对运行超过22小时的t-sql查询进行一些优化吗? Bcs这个t-sql查询当天由我们的ERP应用程序经常运行。
查询是;
SELECT T1.ACCOUNTNUM,T1.AMOUNTCUR,T1.AMOUNTMST,T1.DUEDATE,T1.RECID,T1.RECVERSION,T1.REFRECID,T1.TRANSDATE,T1.RECVERSION,T2.INVOICE
,T2.TRANSTYPE,T2.TRANSDATE,T2.AMOUNTCUR,T2.ACCOUNTNUM,T2.VOUCHER,T2.COLLECTIONLETTERCODE,T2.SETTLEAMOUNTCUR,T2.CURRENCYCODE,
T2.CUSTBILLINGCLASSIFICATION,T2.RECVERSION,T2.RECID,T3.ACCOUNTNUM,T3.PARTY,T3.CURRENCY,T3.RECID,T3.RECVERSION
FROM **CUSTTRANSOPEN** T1
CROSS JOIN CUSTTRANS T2
CROSS JOIN CUSTTABLE T3
WHERE ((([email protected]) AND ([email protected])) AND (T1.DUEDATE<@P3)) AND ((([email protected]) AND
([email protected])) AND (((((((T2.TRANSTYPE<[email protected]) OR ([email protected])) OR (([email protected]) OR ([email protected])))
OR ((([email protected]) OR ([email protected])) OR ([email protected]))) AND (T2.AMOUNTCUR>[email protected]))
AND (T1.ACCOUNTNUM=T2.ACCOUNTNUM)) AND (T1.REFRECID=T2.RECID))) AND ((([email protected]) AND ([email protected]))
AND (T2.ACCOUNTNUM=T3.ACCOUNTNUM)) ORDER BY T1.DUEDATE OPTION(FAST 5)
**被锁定的表是:CUSTTRANSOPEN
我的意思是,为前。我应该在查询中放入WITH(NOLOCK)语句吗? 如何使用索引作业同时执行大型查询?
**我有非标准版本的sql server。所以'在线重建'是不可能的。