Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.05.2013, 17:07   #1
Glen
Форумчанин
 
Аватар для Glen
 
Регистрация: 09.02.2011
Сообщений: 150
По умолчанию SQL Server: хранимая процедура затормозилась

У меня есть база на MS SQL Server 2008. В ней есть такая вот хранимая процедура:

Код:
CREATE TYPE [EntityRef] AS TABLE(
	[EntityID] [int] NOT NULL
)

CREATE PROCEDURE [Proc1]
    @HistoryID int,
    @WorkContributorID int = NULL,
    @Action INT,
    @ArchiveItems [EntityRef] READONLY
AS
    SET NOCOUNT ON;

    IF @WorkContributorID IS NOT NULL
    BEGIN
        INSERT INTO [WorkArchive.WorkContributorArc] 
            ([WorkContributorID], [WorkCode], ...<10 more fields> )
        SELECT 
            [WorkContributorID], [WorkCode], ...<10 more fields>,
            @HistoryID, @Action
        FROM 
            [Work.WorkContributor] 
        WHERE 
            WorkContributorID = @WorkContributorID
    END
    ELSE
    BEGIN
        INSERT INTO [WorkArchive.WorkContributorArc] 
            ([WorkContributorID], [WorkCode], ...<10 more fields> )
        SELECT 
            [WorkContributorID], [WorkCode], ...<10 more fields>,
            @HistoryID, @Action
        FROM 
            [Work.WorkContributor] 
        WHERE 
            WorkContributorID IN (SELECT EntityID FROM @ArchiveItems)
    END
Поле [Work.WorkContributor].WorkContributorID является первичным ключом.

Сейчас нас интересует применение процедуры в случае когда "IF @WorkContributorID IS NULL".
Другими словами - когда в таблицу [WorkArchive.WorkContributorArc] вставляется сразу ПАЧКА строк, указанная через входной табличный параметр @ArchiveItems.
Сразу скажу - возможный размер @ArchiveItems небольшой: несколько строк.

Эта процедура [Proc1], в свою очередь, вызывается из некоего T-SQL кода, изнутри цикла WITH, ходящего по некоему курсору.
Всё работало несколько месяцев прекрасно пока вдруг не начало (на тех же самых данных) тормозить - работать раз так в 100 медленнее.
Судя по загрузке диска, происходил перебор таблиц [WorkArchive.WorkContributorArc] и [Work.WorkContributor] - а они большие, по 40 миллионов строк.
План Выполнения посмотреть не успели, потому что вскорости произошло вот что: я взял эту процедуру [Proc1] и НЕсуществено изменил её. Просто вставил где-то в её теле ещё один пробел. То есть процедура перекомпилировалась, хотя по сути не изменилась.
Тут же после этого проблема исчезла и [пока] больше не появлялась.

Что это было? Очевидно, MS SQL начал почему-то строить очень нерациональный план запроса для этого кода. Почему он начала это делать; почему это исчезло после перекомпиляции; и какова вероятность, что эта проблема проявится вновь?
Glen вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Хранимая процедура Jrcfyf БД в Delphi 1 14.02.2012 18:45
Хранимая процедура Ellkat SQL, базы данных 0 22.05.2011 17:02
Хранимая процедура в Microsoft SQL Server Ellkat Помощь студентам 0 22.05.2011 11:27
Хранимая процедура sql Itachi БД в Delphi 0 04.04.2011 21:06
Хранимая процедура. Cartman18 БД в Delphi 21 08.05.2010 18:56