varbinary列のデータに関する一連の行を返すストアドプロシージャを使用しています。私の人生では、を使用するときにクエリ時間が常に同じ割合で増加する理由を理解することはできませsp_executesql
んexec
。
時間のあるクエリsp_executesql
:<1秒、1秒、2秒、4秒、8秒、24秒(など)、最終的に問題が数分間「解消」され、クエリが常に〜0.006秒になるまで
のクエリ時間exec
は常に<500msです。
最初は、これはLinq2Sqlの問題だと思っていましたが、SQL Management StudioでLinqが生成するクエリを実行すると、同じ結果が得られました。
これがsprocの本体です(大幅に検閲されています)
varbinary
カラムが引っ張られていないことに注意してください
select DF.FileID,
DF.DerpFkGuid,
DF.DerpName,
DF.[FileName],
DF.FileSize as 'FileSizeBytes',
ISNULL(DFA.File_Size_Bytes_String,'Unknown') as 'FileSizeFriendly',
CONVERT(nvarchar(30),DF.FoundDate,120) as 'FileDateUploaded',
CONVERT(nvarchar(30),DF.FileDateCreated,120) as 'FileDateCreated',
CONVERT(nvarchar(30),DF.FileDateLastModified,120) as 'FileDateModified',
CASE WHEN ISNULL(dfa.Derp_ID,'00000000-0000-0000-0000-000000000000')='00000000-0000-0000-0000-000000000000' THEN 0 ELSE 1 END as 'AttachedToDerp',
ISNULL(dfa.Derp_ID,'{00000000-0000-0000-0000-000000000000}') as 'Derp_ID'
from DerpFiles DF
inner join DFDerpDerp DFdd on DFdd.DerpName = DF.DerpName
left outer join Derp_Files_Attachments dfa on dfa.FileID = DF.FileID
where WR.UserName = @UserName and DF.DuplicateFileDetected=0
これが一貫して<500msで実行されるコードです
USE [DerpDatabase]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[DerpSproc]
@UserName = N'derp',
@DomainName = N'derp'
SELECT 'Return Value' = @return_value
GO
これが1s、2s、4s、8s、24sなどを実行するコードです
declare @p5 int
set @p5=0
exec sp_executesql N'EXEC @RETURN_VALUE = [dbo].[DerpSproc]
@UserName = @p0,
@DomainName = @p1',
N'@p0 nvarchar(4000),
@p1 nvarchar(4000),
@RETURN_VALUE int output',
@p0=N'derp',
@p1=N'derp',
@RETURN_VALUE=@p5 output
select @p5
私が知る限り、sprocが呼び出される2つの方法は基本的に同じです。唯一の違いはsp_executesql
vsですexec
また、最後にキーワードがexec
ないと、同じようにクエリ時間が長くなるようです。go
追加しようとしたときにクエリがたまたまキャッシュされたかどうかわからないため、はっきりとはわかりませんgo
。