SQL Server 2014にストアドプロシージャがあり、ハードコードされたパラメータで直接クエリを実行すると、瞬時に実行されます。 ストアドプロシージャを実行するときに時間がかかります。クエリ実行が高速、ストアドプロシージャが遅い - 複数の試行が行われました
それは、私は、ストアドプロシージャでこれらのparamsをハードコードしているし、それがほぼ瞬時に実行されるような問題を引き起こしているトップ1
, ISNULL((SELECT TOP 1 block_score FROM block_states BS WHERE BS.block_id = defined_blocks.id AND BS.user_name = @local_userName AND BS.orgId = @local_orgId AND BS.assessment_key = 0), 'NONE')
を取得して選択クエリでパラメータを表示されます。
私はparameter sniffingについてよく読んで、Query runs fast, but runs slow in stored procedureで示唆しているようにいくつか試みました。私は地元のもの は私も
OPTION(RECOMPILE)
を追加しようとしたパラメータを作り、
exec sp_updatestats
を実行しようとしたが、すべてはありませんどちらかにするかにはほとんど違いに見えてきました。
次のようにストアドプロシージャは、次のとおりです。
@userName NVARCHAR(100), @orgId NVARCHAR(100),@ chartId INT
AS
DECLARE @definedchartBlocks TABLE(
chartId INT,
sectId BIGINT,
subsectId BIGINT,
blockId BIGINT,
blockScore NVARCHAR(10)
)
Declare @local_userName NVARCHAR(100), @local_orgId NVARCHAR(100), @local_chartId INT
select @[email protected], @[email protected],@[email protected] /*attempt to speed up stp*/
INSERT INTO @definedchartBlocks
SELECT
defined_sects.chart_id
, defined_subsects.sect_id
, defined_blocks.subsect_id
, defined_blocks.id AS blockId
, ISNULL((SELECT TOP 1 block_score FROM block_states BS WHERE BS.block_id = defined_blocks.id AND BS.user_name = @local_userName AND BS.orgId = @local_orgId AND BS.assessment_key = 0), 'NONE')
FROM
defined_subsects
INNER JOIN
defined_sects ON defined_subsects.sect_id = defined_sects.id
INNER JOIN
defined_blocks ON defined_subsects.id = defined_blocks.subsect_id
WHERE
(defined_sects.chart_id = @local_chartId)
OPTION(RECOMPILE)
IF EXISTS (
SELECT
MAX(definedchartBlocks.blockScore)
FROM
@definedchartBlocks definedchartBlocks
WHERE
definedchartBlocks.blockScore = 'AMBER' OR definedchartBlocks.blockScore = 'RED' OR definedchartBlocks.blockScore = 'NONE' OR definedchartBlocks.blockScore = '' OR definedchartBlocks.blockScore IS NULL
GROUP BY
definedchartBlocks.blockScore
)
BEGIN
SELECT 0 AS chartCompleted
END
ELSE
BEGIN
SELECT 1 AS chartCompleted
END
'username'列と' orgid'列はNVARCHAR(100)データ型ですか? – Siyual
@Siyual - 実際には、彼らはvarcharではありません(50)。私はそれを確認するとは思わなかった、これは継承されたストアドプロシージャです。私はそれらに合って試してみる。 – Bex
@Siyual That Worked!ありがとうございました!!それを答えに入れると、私はあなたに値する信用を与えることができます! – Bex