Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> SQL Server 2008r2, процедуры с динамическим SQL 
V
    Опции темы
lv151
Дата 5.12.2014, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: нет
Всего: 2



SQL Server 2008r2
Есть процедура, которая в зависимости от выбранных полей 
на клиенте, строит SELECT запрос, который представляет собой динамический SQL:

Код

SELECT f1 FROM table1
или
SELECT f1, f2 FROM table1
или
SELECT t1.f4, t2.f5 FROM table1 t1
INNER JOIN table2 t2
ON t1.f1 = t2.f1
и т.д. и т.п.


Вопрос. Я думаю, что для данной процедуры хранится не оптимальный план запроса.
Т.е. если после выполнения  
Код

SELECT f1 FROM table1

выполнится
Код

SELECT t1.f4, t2.f5 FROM table1 t1
INNER JOIN table2 t2
ON t1.f1 = t2.f1


Как будет строиться план для второго запроса?


Это сообщение отредактировал(а) lv151 - 5.12.2014, 09:04
PM MAIL   Вверх
Akina
Дата 5.12.2014, 10:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Цитата(lv151 @  5.12.2014,  09:53 Найти цитируемый пост)
Как будет строиться план для второго запроса?

Независимо от предыдущего запроса.




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
lv151
Дата 5.12.2014, 12:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: нет
Всего: 2



Понял.

Это сообщение отредактировал(а) lv151 - 5.12.2014, 12:30
PM MAIL   Вверх
Akina
Дата 5.12.2014, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Нет. Это абсолютно.

Цитата(lv151 @  5.12.2014,  09:53 Найти цитируемый пост)
Есть процедура, которая в зависимости от выбранных полей на клиенте, строит SELECT запрос, который представляет собой динамический SQL:

Вообще это неправильный подход.
Процедура должна принимать один параметр, в ней должны быть прописаны все варианты запросов, и выбираться должен тот, который нужен. Типа:
Код

CREATE PROCEDURE MyProc (IN param INT)
RETURNS TABLE
AS
IF param=1 THEN
  RETURN (SELECT f1 FROM table1)
ELSEIF param=2 THEN
  RETURN (SELECT f1, f2 FROM table1)
ELSEIF param=3 THEN
  RETURN (SELECT t1.f4, t2.f5 FROM table1 t1)
-- ...
ELSE
  RETURN (SELECT NULL dummy FROM dual)
END IF




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
lv151
Дата 5.12.2014, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: нет
Всего: 2



Добавлено @ 12:43
Цитата(Akina @  5.12.2014,  12:26 Найти цитируемый пост)
Вообще это неправильный подход.Процедура должна принимать один параметр, в ней должны быть прописаны все варианты запросов, и выбираться должен тот, который нужен. Типа:

Согласен, как раз хочу сделать что-то подобное.

Цитата(lv151 @  5.12.2014,  12:34 Найти цитируемый пост)
Нет. Это абсолютно.
Почему?Как я понимаю, для обычной ХП, после первого выполнения создаётся план.При последующих выполнениях, план берётся из кэша.
?


Это сообщение отредактировал(а) lv151 - 5.12.2014, 12:45
PM MAIL   Вверх
Akina
Дата 5.12.2014, 12:59 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20570
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 25
Всего: 453



Цитата(lv151 @  5.12.2014,  13:34 Найти цитируемый пост)
для обычной ХП, после первого выполнения создаётся план.При последующих выполнениях, план берётся из кэша.

Ага... при условии, что текст процедуры не изменился ни на байт - вернее, если не было ALTER/DROP PROCEDURE.
Если же текст процедуры динамически изменялся - план строится заново. Даже тогда, когда новый текст точно равен старому.
Иначе с запросами - там, насколько я знаю, сравнивается именно текст.
Что же до динамических запросов - то ЕМНИП они не кэшируются.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Дрон
Дата 7.12.2014, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: нет
Всего: 92



Насколько я помню план для динамических запросов всё-таки кэшируется по их тексту. Причём от хранимой процедуры, в которой собирается этот запрос, он не зависит.

Кстати, если собирать запрос вот так
Код

set @sql = 'select * from T where P = ' + @arg
exec (@sql)

То для каждого значения @arg будет отдельный план.
А если вот так:
Код
set @sql = 'select * from T where P = @A'
exec sp_executesql @sql, N'@A int', @arg

То план будет один для любого параметра (т.к. текст запроса не меняется).
В этом есть и плюсы, и минусы.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM   Вверх
lv151
Дата 8.12.2014, 08:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 916
Регистрация: 11.2.2008

Репутация: нет
Всего: 2



Где можно почитать про все ньюансы  динамическго SQL?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.1490 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.