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

Откуда:
Сообщений: 207
привет всем.

после обсуждения, начальство попросило ссылку на статью НА АНГЛИЙСКОМ, почему плох динамический sql.
есть хранимка, она набирает запрос в переменную @Request, в зависимости от параметров, добавляет или убирает join-ы и условия поиска. потом EXECUTE sp_executesql @Request.

дайте линк на ченить типа статьи конкретно для mssql.
или обьясните, что это нормально, и не надо париться по этому поводу. ..хотя вот аналитика по планам и юзингу заставляет. :-)

заранее спасибо. во
31 май 11, 12:19    [10737683]     Ответить | Цитировать Сообщить модератору
 Re: дайте ссылку, чем плох динамический sql  [new]
Shakill
Member

Откуда: мск
Сообщений: 1887
bastrakov,

http://www.sommarskog.se/dynamic_sql.html

или просто картинка есть
Картинка с другого сайта.
31 май 11, 12:25    [10737740]     Ответить | Цитировать Сообщить модератору
 Re: дайте ссылку, чем плох динамический sql  [new]
AnaceH
Member

Откуда:
Сообщений: 109
Ничем он не плох. Это инструмент, которым следует пользоваться с умом.
В Вашем случае, если переменная @Request формируется путем конкатенации шаблона и переменных (поскольку я не заметил использования дополнительных параметров в sp_executesql), переданных в процедуру, то это чревато http://xkcd.ru/i/327_v1.png
Чтобы этого избежать используйте параметры в динамических запросах.
declare @param nvarchar(256) = '''123''; drop table t1'

create table t1 (s nvarchar(256) )
insert into t1 values('123')
insert into t1 values('1; drop table t1')
declare @s nvarchar(1000) = 'select * from t1 where s = ' + @param
exec sp_executesql @s

create table t1 (s nvarchar(256) )
insert into t1 values('123')
insert into t1 values('''123''; drop table t1')
set @s  = 'select * from t1 where s = @param'
exec sp_executesql @s, N'@param nvarchar(256)', @param = @param
drop table t1

И кроме безопасности в первом случае разные параметры формируют по сути разные запросы. ВО втором же случае все это 1 запрос с разными значениями параметра.
31 май 11, 13:23    [10738278]     Ответить | Цитировать Сообщить модератору
 Re: дайте ссылку, чем плох динамический sql  [new]
bastrakov
Member

Откуда:
Сообщений: 207
AnaceH
Ничем он не плох. Это инструмент, которым следует пользоваться с умом.


у нас этого добра дофига. проект старый. сейчас mssql 2008 R2.

подтвердите плиз, что _изменение_ набора таблиц в динамическом запросе не влияет на работу хранимки?
т.е. в запросе добавляются join-ы на таблицы (до 5 дополнительных таблиц с полями), или убираются, и при этом не строиться новый план?
дело в том, что у меня на каждое выполнение - новый план при любом раскладе. вопрос подняли после того, как влетел на ошибку нехватки кэша.

по поводу статьи и советов - спасибо, все по делу, но это у нас уже есть... где-то, а где-то нет, писали разные люди и команды, в разное время. во
31 май 11, 13:34    [10738384]     Ответить | Цитировать Сообщить модератору
 Re: дайте ссылку, чем плох динамический sql  [new]
Любитель sp_executesql
Guest
bastrakov
подтвердите плиз, что _изменение_ набора таблиц в динамическом запросе не влияет на работу хранимки?
т.е. в запросе добавляются join-ы на таблицы (до 5 дополнительных таблиц с полями), или убираются, и при этом не строиться новый план?
дело в том, что у меня на каждое выполнение - новый план при любом раскладе. вопрос подняли после того, как влетел на ошибку нехватки кэша.

Как можно подтвердить то, что в одном запросе три таблицы, в другом пять, но план для этих запросов один?
Вот тут обратите внимание на параметр @params
bastrakov
по поводу статьи и советов - спасибо, все по делу, но это у нас уже есть... где-то, а где-то нет, писали разные люди и команды, в разное время. во
Что у вас уже есть то?
31 май 11, 13:42    [10738453]     Ответить | Цитировать Сообщить модератору
 Re: дайте ссылку, чем плох динамический sql  [new]
bastrakov
Member

Откуда:
Сообщений: 207
Любитель sp_executesql
bastrakov
подтвердите плиз, что _изменение_ набора таблиц в динамическом запросе не влияет на работу хранимки?
т.е. в запросе добавляются join-ы на таблицы (до 5 дополнительных таблиц с полями), или убираются, и при этом не строиться новый план?
дело в том, что у меня на каждое выполнение - новый план при любом раскладе. вопрос подняли после того, как влетел на ошибку нехватки кэша.

Как можно подтвердить то, что в одном запросе три таблицы, в другом пять, но план для этих запросов один?


это подчеркнуто в первом сообщении. :-)
у нас есть все, что бы эти dinamic-sql считались правильно написанными. все же разработчики (ну и я там, в этой куче) считают, что есть смысл по возможностьи избавиться от такого кода. начальство просит линк на статью на нерусском языке, что бы заказчику было понятно, что разработчики правы. показывать заказчику статистику выполнения и результаты замеров смысла не имеет. :-) во
31 май 11, 14:00    [10738610]     Ответить | Цитировать Сообщить модератору
 Re: дайте ссылку, чем плох динамический sql  [new]
Любитель sp_executesql
Guest
bastrakov
это подчеркнуто в первом сообщении. :-)
у нас есть все, что бы эти dinamic-sql считались правильно написанными. все же разработчики (ну и я там, в этой куче) считают, что есть смысл по возможностьи избавиться от такого кода. начальство просит линк на статью на нерусском языке, что бы заказчику было понятно, что разработчики правы. показывать заказчику статистику выполнения и результаты замеров смысла не имеет. :-) во
1. По ссылке, которую Вам дали, написано, что разработчики могут быть как правы, так и неправы.
2. Совсем не факт, что динамический скуль стал причиной той ошибки, про которую Вы написали.
3. Статьи, в которой чётко написано "Динамика - это зло" скорее всего нет, а если и есть, то с кучей оговорок. Ибо
AnaceH
Ничем он не плох. Это инструмент, которым следует пользоваться с умом.
31 май 11, 14:23    [10738826]     Ответить | Цитировать Сообщить модератору
 Re: дайте ссылку, чем плох динамический sql  [new]
bastrakov
Member

Откуда:
Сообщений: 207
Любитель sp_executesql
3. Статьи, в которой чётко написано "Динамика - это зло" скорее всего нет, а если и есть, то с кучей оговорок. Ибо
AnaceH
Ничем он не плох. Это инструмент, которым следует пользоваться с умом.


ок. спасибо. собственно у меня такой же результат.
то, что это плохо, видно у меня в статистике, но переписывать разрешат, если заказчика уговорить. во
31 май 11, 14:31    [10738895]     Ответить | Цитировать Сообщить модератору
 Re: дайте ссылку, чем плох динамический sql  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
Проблема динамического кода не связано со скулем, это ещё и административная проблема и проблема безопастности. Это каждый TM обязан понимать.

OffTop:
Не знаю какой там у вас запрос, но сервер может сам убрать LEFT JOIN на определённых запросах, если в SELECT не указаны их колонки и висят правильно FK.
31 май 11, 19:24    [10741256]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить