0

この sql squery で実行時間を短縮するにはどうすればよいですか? 実行して行を返すのに 1 分以上かかります。 (Sql server management studio 2008 で実行)

if(@NotInvoiced =1)
BEGIN
Select @Command = 
'select Distinct C.FileID, C.FileName, convert(nvarchar,C.DateReported,111) AS ''DateReported'', 
C.FileDetailsPlainText, CFIT.Level3 as ''InvestigationType'', INV.FName + '' '' + INV.LName AS ''Name'', 
convert(nvarchar,DD,111) AS ''DD'', i.FirstName + '' '' + i.LastName AS ''ReportedBy''
from CaseFiles C 
join InvestigatorCaseFileAccess IA on C.FileID=IA.CaseFileID 
LEFT OUTER JOIN CaseFileTimeBills tb on C.FileID=tb.FileID
LEFT OUTER JOIN CaseFileExpenses e on C.FileID=e.FileID

left join Element07a_Persons i on i.PersonID = c.PersonID
LEFT OUTER JOIN CaseFileInvestigationTypes CFIT ON C.InvestigationTypeID = CFIT.InvestigationTypeID 
LEFT OUTER JOIN Investigators INV ON C.InvestigatorID = INV.InvestigatorID
where (tb.InvNumber IS null OR e.InvNumber IS null) and Deleted=0 and IA.InvestigatorID=' + CONVERT (nvarchar(max),@InvestigatorID) + ' and IA.AllowAccess = ''True''
 and tb.FileID = C.FileID or e.FileID=C.FileID '
END
4

1 に答える 1

1

コメントで発見したように、問題は の周りの括弧が欠落していたようですtb.FileID = C.FileID or e.FileID=C.FileID

これらの括弧を追加すると、フィルタリングのセマンティクスが根本的に変わるため、返されるデータが変わります。かっこのない元のクエリがデータのゴブを返すか、少なくともいくつかの行を比較するだけでよい場合に、可能なすべての行を比較するようなものです。

Deleted=0Marlin Pierce は、以前はできなかったのに対し、これらの OR を括弧で囲むと、DBMS が利用インデックス (たとえば、条件 ) を使用できるようになるという良い観察を行いました。

于 2012-11-05T20:49:31.880 に答える