2015-12-16 2 views
5

У меня есть запрос, который я вставляю в хранимую процедуру. Когда я запускаю запрос с локальными переменными, запрос занимает ~ 1 секунду для запуска. Когда я помещаю один и тот же запрос внутри хранимой процедуры и вызываю SP, для запуска требуется около 2 минут.SQL Server Query работает медленно, когда размещен внутри хранимой процедуры

Из предыдущих вопросов в SO Я думаю, что это может быть связано с параметром sniffing. Когда у меня была эта проблема, прежде чем я объявил локальные переменные внутри моего SP, а затем использовал локальные переменные. Это работало в прошлом, но, похоже, не помогает мне в этом случае.

я в настоящее время

CREATE PROCEDURE dbo.ProcedureName 

    @DIV VARCHAR(4), 
    @STD VARCHAR(1), -- S or N 
    @scen varchar(20) 
AS 
BEGIN 

    DECLARE 
     @DIV_copy VARCHAR(4), 
     @STD_copy VARCHAR(1), 
     @scen_copy varchar(20); 
    SELECT 
     @DIV_copy = @DIV, 
     @STD_copy = @STD, 
     @scen_copy = @scen; 

Я также попытался добавить WITH RECOMPILE как так

CREATE PROCEDURE dbo.ProcedureName 

    @DIV VARCHAR(4), 
    @STD VARCHAR(1), -- S or N 
    @scen varchar(20) 

WITH RECOMPILE 
AS 
BEGIN 

    DECLARE 
     @DIV_copy VARCHAR(4), 
     @STD_copy VARCHAR(1), 
     @scen_copy varchar(20); 
    SELECT 
     @DIV_copy = @DIV, 
     @STD_copy = @STD, 
     @scen_copy = @scen; 

Кроме того, я попытался добавить OPTION(RECOMPILE) в конце моего SP как так:

SELECT * 
    FROM #Output 

OPTION(RECOMPILE) 

END 
GO 

Я также пробовал использовать:

OPTION(OPTIMIZE FOR UNKNOWN) 

Как:

OPTION(QUERYTRACEON 4136) 

На этот вариант, у меня нет соответствующих разрешений для отслеживания запросов.

Ни один из 5 исправлений, приведенных выше, не исправляет проблему, поскольку хранимая процедура по-прежнему занимает от 2 минут до 2 минут и 30 секунд для того же запроса, который занимает 1 или 2 секунды вне хранимой процедуры.

Эти исправления все пришли из этой статьи «Different Approaches to Correct SQL Server Parameter Sniffing»

Кто-нибудь были подобные проблемы? Спасибо за ваше время!

SQL Server 2008R2

+0

Звучит как параметр sniffing, и у меня нет другой идеи, что это может быть. Вы можете проверить эту статью, чтобы узнать, предлагают ли она какие-либо дополнительные решения, которые вы еще не пробовали: http://www.sommarskog.se/query-plan-mysteries.html –

+0

'Я попытался добавить параметр OPTION (RECOMPILE) в конец моего SP' - он должен быть помещен после оскорбительного запроса. Но если «с перекомпиляцией» не работает, я сомневаюсь, что это исправление будет. –

+0

У меня были те же симптомы, и создание локальных копий параметров всегда решало это. Единственное различие заключается в том, что я всегда использовал инструкцию SET вместо инструкции SELECT для копирования значений в локальные переменные. –

ответ

0

К сожалению, я не выяснить, почему же точный запрос был так много проблем при размещении внутри хранимой процедуры по сравнению с одними операторами SQL.

Как «обходной путь», я потратил некоторое время на оптимизацию своих запросов в SP. Я понял, что одна таблица, к которой я присоединилась, была очень большой (миллионы и миллионы строк), поэтому я сделал захват соответствующих данных из большой таблицы и создал временную таблицу для ее хранения, а затем присоединился к (намного) более низкой временной таблице и это, казалось, делало трюк. SP запускается через 3-4 секунды.

Я до сих пор несколько новичок в SQL за пределами основ, поэтому я многому учусь. Пусть это служит напоминанием о тщательном изучении ваших запросов, часто есть возможности для улучшения. Это похоже на скотч и скрепки, но моя проблема решена.

Спасибо всем за ваш ввод.

+0

Вместо таблицы temp вы, скорее всего, добьетесь большего, добавив индекс в большую таблицу, соответствующую условиям соединения. –

+0

Правда, но у меня нет разрешений на это, хотя я мог бы спросить нашу команду DBA, возможно. – Soulfire

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