Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Если в ХП есть условие IF, то скрипт выполняется в 10 раз дольше  [new]
nibbles
Member

Откуда: Moscow
Сообщений: 2378
Этот скрипт выполняется 10 секунд.
DECLARE @FindText VARCHAR(4000) = ''

SET NOCOUNT ON 

IF @FindText = ''

    -- сам по себе этот SELECT выполняется за 1 сек, а в составе ХП - за 10 сек
    SELECT TOP 100 caao.City_id, cnt = COUNT(DISTINCT caaa.aut_id)
    FROM core_art_ArtOrganisations caao WITH(NOLOCK)
    JOIN core_art_ArtAutors caaa WITH(NOLOCK) ON caao.art_id = caaa.art_id         
    WHERE caao.City_id IS NOT NULL        
    GROUP BY caao.City_id
    ORDER BY cnt desc, 1

ELSE

    SELECT TOP 100 City_id, cnt = COUNT(DISTINCT caaa.aut_id)
    FROM core_art_ArtIndex i WITH(NOLOCK) 
    JOIN core_art_ArtOrganisations caao WITH(NOLOCK) ON i.art_id = caao.art_id 
    JOIN core_art_ArtAutors caaa WITH(NOLOCK) ON caao.art_id = caaa.art_id         
    WHERE (
        CONTAINS(i.[art_title], @FindText) 
        OR CONTAINS(i.[art_abstract], @FindText) 
        OR CONTAINS(i.[art_keywords], @FindText)
        )
        AND City_id IS NOT NULL
    GROUP BY City_id
    ORDER BY cnt desc, 1


А если запустить просто select, то меньше 1 секунды.
    SELECT TOP 100 caao.City_id, cnt = COUNT(DISTINCT caaa.aut_id)
    FROM core_art_ArtOrganisations caao WITH(NOLOCK)
    JOIN core_art_ArtAutors caaa WITH(NOLOCK) ON caao.art_id = caaa.art_id         
    WHERE caao.City_id IS NOT NULL        
    GROUP BY caao.City_id
    ORDER BY cnt desc, 1


Как победить?
18 май 18, 13:53    [21420283]     Ответить | Цитировать Сообщить модератору
 Re: Если в ХП есть условие IF, то скрипт выполняется в 10 раз дольше  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
Пересоздать процедуру с опцией WITH ECOMPILE, например
18 май 18, 13:56    [21420290]     Ответить | Цитировать Сообщить модератору
 Re: Если в ХП есть условие IF, то скрипт выполняется в 10 раз дольше  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
iap
Пересоздать процедуру с опцией WITH ECOMPILE, например
RECOMPILE
18 май 18, 13:57    [21420293]     Ответить | Цитировать Сообщить модератору
 Re: Если в ХП есть условие IF, то скрипт выполняется в 10 раз дольше  [new]
nibbles
Member

Откуда: Moscow
Сообщений: 2378
Пробовал WITH RECOMPILE - не помогло :((
Пробовал с заполнением таблицы-переменной - не помогло
Делать разные ХП для пустого и непустого @FindText очень не хочется.
18 май 18, 14:00    [21420303]     Ответить | Цитировать Сообщить модератору
 Re: Если в ХП есть условие IF, то скрипт выполняется в 10 раз дольше  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7757
nibbles,

Так включите set statistics io, time on и смотрите. Может там затраты на компиляцию.
И планы выполнения смотрите.
18 май 18, 14:19    [21420375]     Ответить | Цитировать Сообщить модератору
 Re: Если в ХП есть условие IF, то скрипт выполняется в 10 раз дольше  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
nibbles
Пробовал WITH RECOMPILE - не помогло :((
Пробовал с заполнением таблицы-переменной - не помогло
Делать разные ХП для пустого и непустого @FindText очень не хочется.

DSQ + with (recompile)
18 май 18, 14:20    [21420380]     Ответить | Цитировать Сообщить модератору
 Re: Если в ХП есть условие IF, то скрипт выполняется в 10 раз дольше  [new]
nibbles
Member

Откуда: Moscow
Сообщений: 2378
Решил проблему использованием временной таблицы, а не таблицы-переменной.
18 май 18, 15:17    [21420600]     Ответить | Цитировать Сообщить модератору
 Re: Если в ХП есть условие IF, то скрипт выполняется в 10 раз дольше  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
nibbles
Решил проблему использованием временной таблицы, а не таблицы-переменной.

жесть
а то что они у вас были, как можно было догадаться?
18 май 18, 15:21    [21420627]     Ответить | Цитировать Сообщить модератору
 Re: Если в ХП есть условие IF, то скрипт выполняется в 10 раз дольше  [new]
nibbles
Member

Откуда: Moscow
Сообщений: 2378
TaPaK
nibbles
Решил проблему использованием временной таблицы, а не таблицы-переменной.

жесть
а то что они у вас были, как можно было догадаться?


до этого временные таблицы не использовались
18 май 18, 15:47    [21420739]     Ответить | Цитировать Сообщить модератору
 Re: Если в ХП есть условие IF, то скрипт выполняется в 10 раз дольше  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
nibbles
TaPaK
пропущено...

жесть
а то что они у вас были, как можно было догадаться?


до этого временные таблицы не использовались

*звук отклеивающихся обоев*
18 май 18, 15:51    [21420754]     Ответить | Цитировать Сообщить модератору
 Re: Если в ХП есть условие IF, то скрипт выполняется в 10 раз дольше  [new]
Посетитель
Member

Откуда:
Сообщений: 1209
TaPaK,

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

намек на это есть в

nibbles
Пробовал WITH RECOMPILE - не помогло :((
Пробовал с заполнением таблицы-переменной - не помогло
Делать разные ХП для пустого и непустого @FindText очень не хочется.


на абсолютную истинность предположений не претендую
18 май 18, 16:08    [21420819]     Ответить | Цитировать Сообщить модератору
 Re: Если в ХП есть условие IF, то скрипт выполняется в 10 раз дольше  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
Посетитель,

всё перечисленное не меняет длительность выполнения в тех масштабах который указал ТС. Скорее всего он смог всё таки сделать перекомпиляцию или у него дикий вариант с INSERT INTO EXEC sp
18 май 18, 16:14    [21420839]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить