powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / параметризация запросов insert
71 сообщений из 71, показаны все 3 страниц
параметризация запросов insert
    #38426167
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Столкнулся со странным поведением механизма параметризации у SQL Server.
Проблема в том, что SQL Server создает разные планы для казалось бы одинаковых запросов на insert.

Пример такой

CREATE TABLE A (a int, b float) --создаем тестовую табличку
GO

DBCC FREEPROCCACHE -- чистим операционный кэш, чтобы проще искать результат
GO

-- вставляем строки
insert into A (a, b) values (1, 10000.01)
insert into A (a, b) values (1, 990000.019999)
GO

Смотрим, что у нас лежит в кэше
SELECT text, * FROM sys.dm_exec_cached_plans cp CROSS APPLY sys.dm_exec_sql_text (cp.plan_handle)

а там два разных плана
(@1 int,@2 numeric(12,6))INSERT INTO [A]([a],[b]) values(@1,@2)
(@1 int,@2 numeric(7,2))INSERT INTO [A]([a],[b]) values(@1,@2)

Как заставить SQL Server, чтобы он создавал один план в такой ситуации и использовал его повторно?

Версия сервера
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426175
kalimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
artii,

Приводить все числа явно к типу определенному, либо включить Forced параметризацию, либо попробовать ручную через sp_executesql.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426181
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Это помогает, к сожалению, только для запросов select
Я проверял это все для insert такая же картина с двумя планами.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426197
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiЯ проверял это все для insert такая же картина с двумя планами.
Что "это" вы проверили ?
Предоставьте ваш код с явным приведением типов
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426198
kalimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
artii,

Тогда по ходу печалька : (
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426200
kalimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Glory,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
DROP TABLE A
CREATE TABLE A (a int, b decimal(16, 7)) --создаем тестовую табличку
GO

DBCC FREEPROCCACHE -- чистим операционный кэш, чтобы проще искать результат
GO

-- вставляем строки
INSERT INTO A (a, b) values (1, CAST(10000.01 AS decimal(16, 7))) 
INSERT INTO A (a, b) values (1, CAST(990000.019999 AS decimal(16, 7)))
GO

--Смотрим, что у нас лежит в кэше 
SELECT text, *
FROM
	sys.dm_exec_cached_plans cp
	CROSS APPLY sys.dm_exec_sql_text (cp.plan_handle)
OPTION (RECOMPILE)


Реально не работает : (
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426216
Фотография Knyazev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
2.
3.
declare @cmd nvarchar(1024) = 'insert into A (a, b) values ( @p1, @p2 )'
exec sp_executesql @cmd, N'@p1 int, @p2 numeric(12,6)', @p1 = 1, @p2 = 10000.01
exec sp_executesql @cmd, N'@p1 int, @p2 numeric(12,6)', @p1 = 1, @p2 = 990000.019999



а так?
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426220
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kalimbaРеально не работает : (
declare @x decimal (16,7)
set @x = 10000.01
INSERT INTO A (a, b) values (1, @x)
set @x = 990000.019999
INSERT INTO A (a, b) values (1, @x)
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426225
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Knyazev Alexey
Код: sql
1.
2.
3.
declare @cmd nvarchar(1024) = 'insert into A (a, b) values ( @p1, @p2 )'
exec sp_executesql @cmd, N'@p1 int, @p2 numeric(12,6)', @p1 = 1, @p2 = 10000.01
exec sp_executesql @cmd, N'@p1 int, @p2 numeric(12,6)', @p1 = 1, @p2 = 990000.019999



а так?

так лучше

declare @cmd nvarchar(1024) = 'insert into A (a, b) values ( @p1, @p2 )'
exec sp_executesql @cmd, N'@p1 int, @p2 float', @p1 = 1, @p2 = 10000.01
exec sp_executesql @cmd, N'@p1 int, @p2 float', @p1 = 1, @p2 = 990000.019999


(@p1 int, @p2 float)insert into A (a, b) values ( @p1, @p2 )
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426226
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
GlorykalimbaРеально не работает : (
declare @x decimal (16,7)
set @x = 10000.01
INSERT INTO A (a, b) values (1, @x)
set @x = 990000.019999
INSERT INTO A (a, b) values (1, @x)

Такой вариант, вообще не приводит к параметризации
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426231
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiТакой вариант, вообще не приводит к параметризации
А к чему он приводит ? )
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426253
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
к формированию не параметризованного плана для конкретного батча.

declare @x decimal (16,7) set @x = 10000.01 INSERT INTO A (a, b) values (1, @x) set @x = 990000.019999 INSERT INTO A (a, b) values (1, @x)
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426574
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Knyazev Alexey
Код: sql
1.
2.
3.
declare @cmd nvarchar(1024) = 'insert into A (a, b) values ( @p1, @p2 )'
exec sp_executesql @cmd, N'@p1 int, @p2 numeric(12,6)', @p1 = 1, @p2 = 10000.01
exec sp_executesql @cmd, N'@p1 int, @p2 numeric(12,6)', @p1 = 1, @p2 = 990000.019999



а так?

Отдельное спасибо за такой вариант, но он мне не совсем подходит, из-за низкой производительности такого подхода.

Я накопал такой вариант, как создание структуры плана для связывания запросов через sp_create_plan_guide.
Попробовал создать структуру плана, но в итоге опять создается два плана.

Пример:

EXEC sp_create_plan_guide
@name = N'update_A',
@stmt = N'insert into A (a, b) values ( @p1, @p2 )',
@type = N'SQL',
@module_or_batch = NULL,
@params = N'@p1 int, @p2 float',
@hints = BULL
GO

DBCC FREEPROCCACHE
GO

insert into A (a, b) values (1, 10000.01)
insert into A (a, b) values (1, 990000.019999)
GO

на выходе опять
(@1 int,@2 numeric(12,6))INSERT INTO [A]([a],[b]) values(@1,@2)
(@1 int,@2 numeric(7,2))INSERT INTO [A]([a],[b]) values(@1,@2)



посмотреть и удалить схемы можно так
SELECT * FROM sys.plan_guides
exec sp_control_plan_guide

Вопрос будет создание схемы аналогом вызова sp_executesql с параметрами?
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426656
Фотография Knyazev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiKnyazev Alexey
Код: sql
1.
2.
3.
declare @cmd nvarchar(1024) = 'insert into A (a, b) values ( @p1, @p2 )'
exec sp_executesql @cmd, N'@p1 int, @p2 numeric(12,6)', @p1 = 1, @p2 = 10000.01
exec sp_executesql @cmd, N'@p1 int, @p2 numeric(12,6)', @p1 = 1, @p2 = 990000.019999




а так?

он мне не совсем подходит, из-за низкой производительности такого подхода.


в чём это проявляется?
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426706
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а сделать хранимку (вплоть до временной) - не предлагать?
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426746
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня работа с БД при загрузке данных построена таким образом.
Запросы insert(update) склеиваются в один батч от одного до N шт. При низкой нагрузке в БД могут ехать отдельные запросы при высокой запросы объединяются в один пакет. т.е.
into (..) values ()
into (..) values ()
into (..) values ()
into (..) values ()
into (..) values ()
GO

Такой подход позволяет не ждать ответа от сервера после каждого запроса, если запросы выполняются по одному и SQL Server и приложения стоят на разных машинах. А ожидать ответ только после отправки пачки запросов.

Пока это написал я понял, что я не совсем прав, говоря, что этот подход с sp_executesql будет медленнее, чем описанный выше.
Я предполагал, что sp_executesql будет делаться для каждого insert или update по-отдельности, что конечно же не так и можно переделать приложение, подставляя в вызов sp_executesql 20 строк на вставку, но это как-то не красиво и не спортивно.

Хотелось бы выкрутить руки SQL Server, чтобы он таки нашел нужный план плану у себя к кэше и не создавал новый.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426768
Гость333
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiзапросы объединяются в один пакет. т.е.
into (..) values ()
into (..) values ()
into (..) values ()
into (..) values ()
into (..) values ()
GO
Каким образом вы определили, что ваше узкое место — это компиляция запросов?
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426769
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
p.s.

а вы боретесь со скоростью вставки? ну не планы ради планов же? тогда (1) хранимки и (2) оборачивать по ~ 100..1000..10000 вставок в транзакцию. но с транзакцией будет попадалово с ошибками, да.. и будет вам быстро. ну или примеряйте способы передавать не по 1 записи, а пачками сразу на сиквел - тоже будет быстрее
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38426782
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiПри низкой нагрузке в БД могут ехать отдельные запросы при высокой запросы объединяются в один пакет. т.е.
into (..) values ()
into (..) values ()
into (..) values ()
into (..) values ()
into (..) values ()
GO а зачем так много букв, пишите сразу одной командой insert into (..) values (), (), (), ... и будет один план на пакет
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427513
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Crimeanp.s.

а вы боретесь со скоростью вставки? ну не планы ради планов же? тогда (1) хранимки и (2) оборачивать по ~ 100..1000..10000 вставок в транзакцию. но с транзакцией будет попадалово с ошибками, да.. и будет вам быстро. ну или примеряйте способы передавать не по 1 записи, а пачками сразу на сиквел - тоже будет быстрее

Вопрос быстродействия уже решен до начала этой темы, путем вызова ХП, в которой все строки вставляются одним запросом.

Но в процессе понимания, что происходило при тормозах на SQ Server единственное, что было не понятно это зачем SQL Server постоянно генерит новые планы для казалось бы одинаковых запросов, к тому же эти планы далеко не такие безобидные и потребляют довольно много памяти в моем случае это было около 1,3 Гб при этом часть из этих планов удаляется в процессе вставки 500 тыс строк.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427516
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShakillartiiПри низкой нагрузке в БД могут ехать отдельные запросы при высокой запросы объединяются в один пакет. т.е.
into (..) values ()
into (..) values ()
into (..) values ()
into (..) values ()
into (..) values ()
GO а зачем так много букв, пишите сразу одной командой insert into (..) values (), (), (), ... и будет один план на пакет

Не знал про такой синтаксис, спасибо, но мне не подходит вариант, запрос откатывает все вставленные строки, если хотя бы одна вызывает ошибку например PK_violation
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427528
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Гость333artiiзапросы объединяются в один пакет. т.е.
into (..) values ()
into (..) values ()
into (..) values ()
into (..) values ()
into (..) values ()
GO
Каким образом вы определили, что ваше узкое место — это компиляция запросов?

Знаете, я не могу достоверно говорить, как я это определил я просто скажу что произошло

совершенно случайно, я при проявлении этих тормозов, решил очистить процедурный кэш, ну так ради спортивного интереса,
DBCC FREEPROCCACHE
после этого все просто полетело, но через некоторое время все опять начало тормозить

порядок тормозов следующий, запросы при тормозах просасывались по 20 шт за 1 сек, после очистки по несколько тыс за сек

Далее начал смотреть, а что лежит в кэше и увидел , что практически весь процедурный кеш забит запросами к одной таблице, 80% от этих запросов имею UseCount 1 или 2. И этот факт вызвал большие вопросы т.к. запросы в целом одинаковые, т.е. insert содержит одинаковый набор полей в одинаковом порядке с одинаковыми отступами, пробелами и регистром буквенных символов отличаются только значениями полей полей типа float. Эти значения в планах приводятся к параметрам разных вариантов типа numeric(12,6), numeric(7,2) и т.д этих полей порядка 15 и получается, что с высокой вероятностью создается новый план.

После этого я начал пытаться заставить SQL server использовать уже существующие планы, пока правда безуспешно, не считая вариант с параметизацией запросов через sp_executesql

Ну и в конце поста я хотел бы акцентировать внимание на вашем вопросе, скорее всего компиляция планов не является узким местом т.к. после очистки кэша все летит и запросы компилируются со свистом, но проблема все-равно где-то в процедурном кэше возможно в поиске готовых планов.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427531
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiединственное, что было не понятно это зачем SQL Server постоянно генерит новые планы для казалось бы одинаковых запросовЗапросы же не одинаковые. Если хоть байт в тексте отличается, то это другой запрос.
Чтобы уменьшить расходы на компиляцию, нужно либо включить специальную опцию, либо не передавать запросы в виде текста.

Ну и вообще есть способы и в сотни раз увеличить скорость, просто вы говорите, что скорость вас не интересует, что вы выясняете конкретный вопрос поведения SQL Server...
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427536
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiНу и в конце поста я хотел бы акцентировать внимание на вашем вопросе, скорее всего компиляция планов не является узким местом т.к. после очистки кэша все летит и запросы компилируются со свистом, но проблема все-равно где-то в процедурном кэше возможно в поиске готовых планов.Это взаимосвязанные вещи. Сама по себе компиляция такого простого запроса не создаёт нагрузки, но мллионы запросов - это миллионы хранящихся в кеше планов, и естественно серверу становится плохо. Поэтому и нужно избавляться от лишних компиляций и лишних планов.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427548
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgЗапросы же не одинаковые. Если хоть байт в тексте отличается, то это другой запрос.
Чтобы уменьшить расходы на компиляцию, нужно либо включить специальную опцию, либо не передавать запросы в виде текста.

Ну и вообще есть способы и в сотни раз увеличить скорость, просто вы говорите, что скорость вас не интересует, что вы выясняете конкретный вопрос поведения SQL Server...

Значения в запросах не одинаковые, но это как бы не должно играть ни какой роли, если запрос имеет параметризованный план.
Для этого собственно и нужна параметризация. Например для запросов Select в простом текстовом виде, если план параметризуется, добиться повторного использования параметризованного плана довольно просто, достаточно привести нужную константу к нужному типу и соотв параметр в плане примет указанный тип. С инсертами сложнее нужно использовать sp_exeutesql, возможно sp_create_plan_guide делает так же как и sp_exeutesql, но мне пока не удается его распинать применительно к инсертам.

Может кто-то уже использовал sp_create_plan_guide в таком же контексте как я и знает как создать правильную схему для планов?
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427552
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgartiiНу и в конце поста я хотел бы акцентировать внимание на вашем вопросе, скорее всего компиляция планов не является узким местом т.к. после очистки кэша все летит и запросы компилируются со свистом, но проблема все-равно где-то в процедурном кэше возможно в поиске готовых планов.Это взаимосвязанные вещи. Сама по себе компиляция такого простого запроса не создаёт нагрузки, но мллионы запросов - это миллионы хранящихся в кеше планов, и естественно серверу становится плохо. Поэтому и нужно избавляться от лишних компиляций и лишних планов.

Все правильно я и пытаюсь заставить SQL Server создавать параметризованые планы, в которых будут float-ы вместо различных комбинаций numeric и тем самым добиться повторного использования планов.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427556
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiЗначения в запросах не одинаковые, но это как бы не должно играть ни какой роли, если запрос имеет параметризованный план.Нут хорошо, дропустим, у вас есть 2 закешированных плана:
(@1 int,@2 numeric(12,6))INSERT INTO [A]([a],[b]) values(@1,@2)
(@1 int,@2 numeric(7,2))INSERT INTO [A]([a],[b]) values(@1,@2)

Но ведь всего 2, а не 2 миллиона? Всё таки если параметризация происходит, она даже при неких неоптимальностях не приведёт к тому, что на каждый стейтмент будет отдельный план.

Это при включённой Forced параметризации.

Чем забивается кеш-то?

Значит, реально параметризации не происходит (может, не происходит для инсёртов), и на каждую новую отличающуюся строку запроса генерится новый план и сохраняется в кеше, так что всё нормально, как и должно быть.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427561
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiialexeyvgпропущено...
Это взаимосвязанные вещи. Сама по себе компиляция такого простого запроса не создаёт нагрузки, но мллионы запросов - это миллионы хранящихся в кеше планов, и естественно серверу становится плохо. Поэтому и нужно избавляться от лишних компиляций и лишних планов.

Все правильно я и пытаюсь заставить SQL Server создавать параметризованые планы, в которых будут float-ы вместо различных комбинаций numeric и тем самым добиться повторного использования планов.Вы пытаетесь шаманить. Параметризация по текстам в сиквеле - это шаманство, которое делалось как затычка для "вытягивания" старых унаследованных приложений, или просто приложений с плохим дизайном.

Скажем, в команде INSERT Table VALUES ('A', 12345) что является параметрами, а что - частью запроса, которую нужно учитывать при построении плана: 'A', 12345, оба из них, или ни один из них? Это не такой простой вопрос, как кажется, и правильный ответ на него может сильно влиять на производительность.

В некоторых случаях у сиквела это получается, но не понимаю, зачем такие мучения? Не проще просто использовать параметризированные запросы, а не слать сиквелу тексты, надеясь, что он сам из текстов сделает параметризированные запросы?
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427565
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgartiiЗначения в запросах не одинаковые, но это как бы не должно играть ни какой роли, если запрос имеет параметризованный план.Нут хорошо, дропустим, у вас есть 2 закешированных плана:
(@1 int,@2 numeric(12,6))INSERT INTO [A]([a],[b]) values(@1,@2)
(@1 int,@2 numeric(7,2))INSERT INTO [A]([a],[b]) values(@1,@2)

Но ведь всего 2, а не 2 миллиона? Всё таки если параметризация происходит, она даже при неких неоптимальностях не приведёт к тому, что на каждый стейтмент будет отдельный план.

Это при включённой Forced параметризации.

Чем забивается кеш-то?

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

Планы точно параметризуются

вот пример 10 планов и 15 тыс, у 80% из которых useCount 1 или 2 эти планы и забивают весь кеш

(@1 int,@2 int,@3 int,@4 int,@5 int,@6 int,@7 numeric(3,1),@8 numeric(2,1),@9 int,@10 int,@11 int,@12 numeric(6,1),@13 numeric(1,1),@14 numeric(1,1),@15 numeric(1,1),@16 numeric(1,1),@17 numeric(1,1),@18 numeric(3,2),@19 numeric(1,1),@20 numeric(1,1),@21 numeric(1,1),@22 numeric(1,1),@23 numeric(1,1),@24 numeric(1,1),@25 numeric(1,1),@26 numeric(1,1))INSERT INTO [Tab]([created_date],[created_time],[modified_date],[modified_time],[user_created],[user_modified],[Account_ID],[Asset_ID],[Date],[id],[OldDate],[Subacc_ID],[VolBlocked],[VolComBrok],[VolCredit],[VolForward],[VolForwardOut],[VolFree],[VolFreeStart],[VolGO],[VolInOut],[VolRepoIn],[VolRepoOut],[Volume],[VolumeAccrued],[VolVar]) values(@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26)
(@1 int,@2 int,@3 int,@4 int,@5 int,@6 int,@7 numeric(6,1),@8 numeric(2,1),@9 int,@10 int,@11 int,@12 numeric(6,1),@13 numeric(1,1),@14 numeric(1,1),@15 numeric(1,1),@16 numeric(1,1),@17 numeric(1,1),@18 numeric(3,1),@19 numeric(1,1),@20 numeric(1,1),@21 numeric(1,1),@22 numeric(1,1),@23 numeric(1,1),@24 numeric(1,1),@25 numeric(1,1),@26 numeric(1,1))INSERT INTO [Tab]([created_date],[created_time],[modified_date],[modified_time],[user_created],[user_modified],[Account_ID],[Asset_ID],[Date],[id],[OldDate],[Subacc_ID],[VolBlocked],[VolComBrok],[VolCredit],[VolForward],[VolForwardOut],[VolFree],[VolFreeStart],[VolGO],[VolInOut],[VolRepoIn],[VolRepoOut],[Volume],[VolumeAccrued],[VolVar]) values(@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26)
(@1 int,@2 int,@3 int,@4 int,@5 int,@6 int,@7 numeric(3,1),@8 numeric(2,1),@9 int,@10 int,@11 int,@12 numeric(6,1),@13 numeric(1,1),@14 numeric(1,1),@15 numeric(1,1),@16 numeric(1,1),@17 numeric(1,1),@18 numeric(5,2),@19 numeric(1,1),@20 numeric(1,1),@21 numeric(1,1),@22 numeric(1,1),@23 numeric(1,1),@24 numeric(1,1),@25 numeric(1,1),@26 numeric(1,1))INSERT INTO [Tab]([created_date],[created_time],[modified_date],[modified_time],[user_created],[user_modified],[Account_ID],[Asset_ID],[Date],[id],[OldDate],[Subacc_ID],[VolBlocked],[VolComBrok],[VolCredit],[VolForward],[VolForwardOut],[VolFree],[VolFreeStart],[VolGO],[VolInOut],[VolRepoIn],[VolRepoOut],[Volume],[VolumeAccrued],[VolVar]) values(@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26)
(@1 int,@2 int,@3 int,@4 int,@5 int,@6 int,@7 numeric(6,1),@8 numeric(6,1),@9 int,@10 int,@11 int,@12 numeric(7,1),@13 numeric(1,1),@14 numeric(1,1),@15 numeric(1,1),@16 numeric(1,1),@17 numeric(1,1),@18 numeric(4,1),@19 numeric(1,1),@20 numeric(1,1),@21 numeric(1,1),@22 numeric(1,1),@23 numeric(1,1),@24 numeric(17,12),@25 numeric(1,1),@26 numeric(1,1))INSERT INTO [PositionHist]([created_date],[created_time],[modified_date],[modified_time],[user_created],[user_modified],[Account_ID],[Asset_ID],[Date],[id],[OldDate],[Subacc_ID],[VolBlocked],[VolComBrok],[VolCredit],[VolForward],[VolForwardOut],[VolFree],[VolFreeStart],[VolGO],[VolInOut],[VolRepoIn],[VolRepoOut],[Volume],[VolumeAccrued],[VolVar]) values(@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26)
(@1 int,@2 int,@3 int,@4 int,@5 int,@6 int,@7 numeric(3,1),@8 numeric(2,1),@9 int,@10 int,@11 int,@12 numeric(7,1),@13 numeric(1,1),@14 numeric(4,1),@15 numeric(1,1),@16 numeric(1,1),@17 numeric(1,1),@18 numeric(4,1),@19 numeric(1,1),@20 numeric(1,1),@21 numeric(1,1),@22 numeric(1,1),@23 numeric(1,1),@24 numeric(1,1),@25 numeric(1,1),@26 numeric(1,1))INSERT INTO [Tab]([created_date],[created_time],[modified_date],[modified_time],[user_created],[user_modified],[Account_ID],[Asset_ID],[Date],[id],[OldDate],[Subacc_ID],[VolBlocked],[VolComBrok],[VolCredit],[VolForward],[VolForwardOut],[VolFree],[VolFreeStart],[VolGO],[VolInOut],[VolRepoIn],[VolRepoOut],[Volume],[VolumeAccrued],[VolVar]) values(@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26)
(@1 int,@2 int,@3 int,@4 int,@5 int,@6 int,@7 numeric(6,1),@8 numeric(6,1),@9 int,@10 int,@11 int,@12 numeric(7,1),@13 numeric(1,1),@14 numeric(1,1),@15 numeric(1,1),@16 numeric(1,1),@17 numeric(1,1),@18 numeric(2,1),@19 numeric(1,1),@20 numeric(1,1),@21 numeric(1,1),@22 numeric(1,1),@23 numeric(1,1),@24 numeric(17,12),@25 numeric(1,1),@26 numeric(1,1))INSERT INTO [Tab]([created_date],[created_time],[modified_date],[modified_time],[user_created],[user_modified],[Account_ID],[Asset_ID],[Date],[id],[OldDate],[Subacc_ID],[VolBlocked],[VolComBrok],[VolCredit],[VolForward],[VolForwardOut],[VolFree],[VolFreeStart],[VolGO],[VolInOut],[VolRepoIn],[VolRepoOut],[Volume],[VolumeAccrued],[VolVar]) values(@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26)
(@1 int,@2 int,@3 int,@4 int,@5 int,@6 int,@7 numeric(6,1),@8 numeric(6,1),@9 int,@10 int,@11 int,@12 numeric(7,1),@13 numeric(1,1),@14 numeric(1,1),@15 numeric(1,1),@16 numeric(1,1),@17 numeric(1,1),@18 numeric(2,1),@19 numeric(1,1),@20 numeric(1,1),@21 numeric(1,1),@22 numeric(1,1),@23 numeric(1,1),@24 numeric(6,1),@25 numeric(1,1),@26 numeric(1,1))INSERT INTO [Tab]([created_date],[created_time],[modified_date],[modified_time],[user_created],[user_modified],[Account_ID],[Asset_ID],[Date],[id],[OldDate],[Subacc_ID],[VolBlocked],[VolComBrok],[VolCredit],[VolForward],[VolForwardOut],[VolFree],[VolFreeStart],[VolGO],[VolInOut],[VolRepoIn],[VolRepoOut],[Volume],[VolumeAccrued],[VolVar]) values(@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26)
(@1 int,@2 int,@3 int,@4 int,@5 int,@6 int,@7 numeric(6,1),@8 numeric(2,1),@9 int,@10 int,@11 int,@12 numeric(7,1),@13 numeric(1,1),@14 numeric(2,1),@15 numeric(1,1),@16 numeric(1,1),@17 numeric(1,1),@18 numeric(4,2),@19 numeric(1,1),@20 numeric(1,1),@21 numeric(1,1),@22 numeric(1,1),@23 numeric(1,1),@24 numeric(1,1),@25 numeric(1,1),@26 numeric(1,1))INSERT INTO [Tab]([created_date],[created_time],[modified_date],[modified_time],[user_created],[user_modified],[Account_ID],[Asset_ID],[Date],[id],[OldDate],[Subacc_ID],[VolBlocked],[VolComBrok],[VolCredit],[VolForward],[VolForwardOut],[VolFree],[VolFreeStart],[VolGO],[VolInOut],[VolRepoIn],[VolRepoOut],[Volume],[VolumeAccrued],[VolVar]) values(@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26)
(@1 int,@2 int,@3 int,@4 int,@5 int,@6 int,@7 numeric(6,1),@8 numeric(6,1),@9 int,@10 int,@11 int,@12 numeric(7,1),@13 numeric(1,1),@14 numeric(1,1),@15 numeric(1,1),@16 numeric(1,1),@17 numeric(1,1),@18 numeric(3,1),@19 numeric(1,1),@20 numeric(1,1),@21 numeric(1,1),@22 numeric(1,1),@23 numeric(1,1),@24 numeric(17,12),@25 numeric(1,1),@26 numeric(1,1))INSERT INTO [Tab]([created_date],[created_time],[modified_date],[modified_time],[user_created],[user_modified],[Account_ID],[Asset_ID],[Date],[id],[OldDate],[Subacc_ID],[VolBlocked],[VolComBrok],[VolCredit],[VolForward],[VolForwardOut],[VolFree],[VolFreeStart],[VolGO],[VolInOut],[VolRepoIn],[VolRepoOut],[Volume],[VolumeAccrued],[VolVar]) values(@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26)
(@1 int,@2 int,@3 int,@4 int,@5 int,@6 int,@7 numeric(6,1),@8 numeric(6,1),@9 int,@10 int,@11 int,@12 numeric(7,1),@13 numeric(1,1),@14 numeric(1,1),@15 numeric(1,1),@16 numeric(1,1),@17 numeric(1,1),@18 numeric(3,1),@19 numeric(1,1),@20 numeric(1,1),@21 numeric(1,1),@22 numeric(1,1),@23 numeric(1,1),@24 numeric(17,13),@25 numeric(1,1),@26 numeric(1,1))INSERT INTO [Tab]([created_date],[created_time],[modified_date],[modified_time],[user_created],[user_modified],[Account_ID],[Asset_ID],[Date],[id],[OldDate],[Subacc_ID],[VolBlocked],[VolComBrok],[VolCredit],[VolForward],[VolForwardOut],[VolFree],[VolFreeStart],[VolGO],[VolInOut],[VolRepoIn],[VolRepoOut],[Volume],[VolumeAccrued],[VolVar]) values(@1,@2,@3,@4,@5,@6,@7,@8,@9,@10,@11,@12,@13,@14,@15,@16,@17,@18,@19,@20,@21,@22,@23,@24,@25,@26)
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427566
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgartiiпропущено...


Все правильно я и пытаюсь заставить SQL Server создавать параметризованые планы, в которых будут float-ы вместо различных комбинаций numeric и тем самым добиться повторного использования планов.Вы пытаетесь шаманить. Параметризация по текстам в сиквеле - это шаманство, которое делалось как затычка для "вытягивания" старых унаследованных приложений, или просто приложений с плохим дизайном.

Скажем, в команде INSERT Table VALUES ('A', 12345) что является параметрами, а что - частью запроса, которую нужно учитывать при построении плана: 'A', 12345, оба из них, или ни один из них? Это не такой простой вопрос, как кажется, и правильный ответ на него может сильно влиять на производительность.

В некоторых случаях у сиквела это получается, но не понимаю, зачем такие мучения? Не проще просто использовать параметризированные запросы, а не слать сиквелу тексты, надеясь, что он сам из текстов сделает параметризированные запросы?

Я с вами не согласен, что это шаманство. В некоторых случаях грамотная параметризация приводит к сказочной производительности.
В моем случае я хочу добиться снижения издержек при работе с операционым кешем, которые влияют на производительность в худшую сторону.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427575
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiЯ с вами не согласен, что это шаманство. В некоторых случаях грамотная параметризация приводит к сказочной производительности.Ээээ, я не понял. Разве повышение производительности исключает шаманство???
artiiПланы точно параметризуются

вот пример 10 планов и 15 тыс, у 80% из которых useCount 1 или 2 эти планы и забивают весь кешНу вот видите, как они параметризируются?

Я предлагаю параметризировать явно, соответствующими конструкциями клиента. Вот это правильный подходж, а не надежда "параметризации" произвольных текстов.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427598
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgartiiЯ с вами не согласен, что это шаманство. В некоторых случаях грамотная параметризация приводит к сказочной производительности.Ээээ, я не понял. Разве повышение производительности исключает шаманство???
artiiПланы точно параметризуются

вот пример 10 планов и 15 тыс, у 80% из которых useCount 1 или 2 эти планы и забивают весь кешНу вот видите, как они параметризируются?

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

Оставим разговор про шаманство.

Как вы предлагаете параметризировать запрос, использовать конструкцию sp_executesql?
Она мне не подходит т.к. есть ситуации, когда я отправляю не под транзакцией пачку запросов за раз и ожидаю, что в случае возникновения ошибки в одном из запросов остальные вставятся и не приведет к откату остальных запросов.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427601
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artii,

вам предлагают с клиента параметризованные запросы формировать
внезапно, да? впрочем, этой возможности 100 лет в обед будет
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427629
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiКак вы предлагаете параметризировать запрос, использовать конструкцию sp_executesql?
Она мне не подходит т.к. есть ситуации, когда я отправляю не под транзакцией пачку запросов за раз и ожидаю, что в случае возникновения ошибки в одном из запросов остальные вставятся и не приведет к откату остальных запросов.Использование sp_executesql ничем не отличается от неиспользования sp_executesql в плане транзакций и реакции на ошибки.

Ну и вообще да, можно (и нужно!) слать с клиента не текст, а параметризованные запросы.

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

Ну и есть ещё масса вариантов. Например, сделать ХП, в которую передавать данные как табличный параметр. Что бы не было ошибок, делать проверки в ХП.
Или заливать в временные таблицы балк-ом, потом процедурой переносить в постоянные.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427641
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Crimeanartii,

вам предлагают с клиента параметризованные запросы формировать
внезапно, да? впрочем, этой возможности 100 лет в обед будет

А, я понял о чем речь, но если честно такой подход ни чем, на мой взгляд, не лучше вызова sp_sqlexecute.
Там для пачки запросов нужно будет готовить соответствующий заголовок, количество запросов в заголовке будет зависеть от размера пачки. И скорее всего при возникновении ошибки в команде откатятся все остальные строки, хотя это нужно проверять.

Хорошо, я понял про параметризацию запросов на стороне клиента и предлагаю эту тему больше не поднимать.
Хочется все-таки научиться управлять параметризацией на стороне сервера. Если у кого-то есть такой опыт, пожалуйста, напишите,
особенно интересует использование sp_create_plan_guide. Если нет то пусть тема тонет
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427646
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо всем за обсуждение
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427672
kalimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Раз пошла такая пьянка) У меня такой запрос часто приходит на сервер от стороннего PHP приложения:
Код: sql
1.
SELECT own_id FROM warehouse..catalog_good WHERE model_id = ''27985529'' AND deleted = 0 AND on_sell = 1 AND own_id IS NOT NULL AND own_id != ''


Я создаю plan guide:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE @stmt nvarchar(max);
DECLARE @params nvarchar(max);
EXEC sp_get_query_template	N'SELECT own_id FROM warehouse..catalog_good WHERE model_id = ''27985529'' AND deleted = 0 AND on_sell = 1 AND own_id IS NOT NULL AND own_id != '''''
							,@stmt OUTPUT
							,@params OUTPUT

EXEC sp_create_plan_guide	N'TemplateGuide1'
							,@stmt
							,N'TEMPLATE'
							,NULL
							,@params
							,N'OPTION (PARAMETERIZATION FORCED)';

\
Но приходящие запросы все равно не параметризуются. Что сделал не так?
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427733
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiА, я понял о чем речь, но если честно такой подход ни чем, на мой взгляд, не лучше вызова sp_sqlexecute.
Там для пачки запросов нужно будет готовить соответствующий заголовок, количество запросов в заголовке будет зависеть от размера пачки. И скорее всего при возникновении ошибки в команде откатятся все остальные строки, хотя это нужно проверять.

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

Откуда там какие то "пачки", что такое "заголовок"? Ничего похожего при параметризации не используется.

Параметризация - это: http://msdn.microsoft.com/ru-ru/library/vstudio/yy6y35y8(v=vs.100).aspx

Там внизу и примеры есть. Как видите, никаких пачек и заголовков там не упоминается.

Впрочем, если для вас принципиально не говорить про параметризацию, то больше не буду.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427751
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kalimbaЯ создаю plan guide:А резуольтат какой, что в @stmt и @params?

Параметр PARAMETERIZATION у базы какое значение имеет?

Ну и вообще, там же куча исключений...
http://msdn.microsoft.com/ru-ru/library/ms175037(v=sql.105).aspx
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427767
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg,

+1, 1 раз готовим запрос и описание параметров. а дальше тока параметры заполняем и говорим "execute" на каждую строку данных
p.s.
да, теперь понятно, почему ODBC закапывают.. а там целый пласт вокруг массовой обработки был..
вплоть до настройки отображения буфера данных на параметры..
но - всем же облом разбираться
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427769
kalimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

Код: sql
1.
2.
select own_id from warehouse . . catalog_good where model_id = @0 and deleted = @1 and on_sell = @2 and own_id is not null and own_id ! = @3
@0 varchar(8000),@1 int,@2 int,@3 varchar(8000)


База в Simple режиме, про ограничения знаю, но не нашел какое может подходить..
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427782
Фотография Shakill
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crimeanда, теперь понятно, почему ODBC закапывают.. а там целый пласт вокруг массовой обработки был..
вплоть до настройки отображения буфера данных на параметры..
но - всем же облом разбиратьсянаоборот же, OLE DB закапывают
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427801
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Crimeanalexeyvg,

+1, 1 раз готовим запрос и описание параметров. а дальше тока параметры заполняем и говорим "execute" на каждую строку данных
p.s.
да, теперь понятно, почему ODBC закапывают.. а там целый пласт вокруг массовой обработки был..
вплоть до настройки отображения буфера данных на параметры..
но - всем же облом разбираться

Хорошо, если я делаю описание (в моей терминологии заголовок), для одной строки, потом я просто заполняю буфер для этого описания и делаю вызов. Один вызов одна строка в БД.

В нашем приложении такой подход использовался, но он оказался медленнее, чем если завернуть например 20 запросов в один текстовый батч. Особенно, когда много мелких запросов Add(update) и время их выполнения сравнимо в временем отклика от сервера.

Теоретически можно подготовить заголовки, в которых будут параметризация от 1 до N запросов,
Далее, если поступает например 5 запросов, выбирать заголовок, в котором 5 insert-ов, заполнять соотв буфер и делать вставку, если запрос выполняется то вставляется сразу 5 строк. Далее не понятно, что будет с остальными 4-мя строчками, если одна из пяти содержит ошибку откатятся они или останутся в БД. Не хочется с этим связываться, если можно распинать sp_create_plan_guide
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427806
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ShakillCrimeanда, теперь понятно, почему ODBC закапывают.. а там целый пласт вокруг массовой обработки был..
вплоть до настройки отображения буфера данных на параметры..
но - всем же облом разбиратьсянаоборот же, OLE DB закапывают

+1, как раз Microsoft отказывается от использования OLEDB в своих внутренних разработках в пользу ODBC
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427810
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
kalimbaРаз пошла такая пьянка) У меня такой запрос часто приходит на сервер от стороннего PHP приложения:
Код: sql
1.
SELECT own_id FROM warehouse..catalog_good WHERE model_id = ''27985529'' AND deleted = 0 AND on_sell = 1 AND own_id IS NOT NULL AND own_id != ''


Я создаю plan guide:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
DECLARE @stmt nvarchar(max);
DECLARE @params nvarchar(max);
EXEC sp_get_query_template	N'SELECT own_id FROM warehouse..catalog_good WHERE model_id = ''27985529'' AND deleted = 0 AND on_sell = 1 AND own_id IS NOT NULL AND own_id != '''''
							,@stmt OUTPUT
							,@params OUTPUT

EXEC sp_create_plan_guide	N'TemplateGuide1'
							,@stmt
							,N'TEMPLATE'
							,NULL
							,@params
							,N'OPTION (PARAMETERIZATION FORCED)';

\
Но приходящие запросы все равно не параметризуются. Что сделал не так?

так а какой план-то получается в итоге?
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427831
kalimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
artii,

Всё так же как будто я и не добавлял, т.е. в кэш запросов добавляются новые записи, а не увеличивается usecount у какого-то плана. Да и в свойства оператора SELECT не вижу что plan guide используется (должно быть свойство под Physical Operation, если память не изменяет). Скуль 2012 SP1.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427858
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvgartiiА, я понял о чем речь, но если честно такой подход ни чем, на мой взгляд, не лучше вызова sp_sqlexecute.
Там для пачки запросов нужно будет готовить соответствующий заголовок, количество запросов в заголовке будет зависеть от размера пачки. И скорее всего при возникновении ошибки в команде откатятся все остальные строки, хотя это нужно проверять.

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

Откуда там какие то "пачки", что такое "заголовок"? Ничего похожего при параметризации не используется.

Параметризация - это: http://msdn.microsoft.com/ru-ru/library/vstudio/yy6y35y8(v=vs.100).aspx

Там внизу и примеры есть. Как видите, никаких пачек и заголовков там не упоминается.

Впрочем, если для вас принципиально не говорить про параметризацию, то больше не буду.

Нет, я не то чтобы против того, чтобы говорить про параметризацию вообще. Я просто говорю, что в моем случае подсказывать SQL Server какие типы у констант должны быть в плане запросе, на клиентской стороне довольно с трудоемкая задача, которая еще может не выстрелить по быстродействию. Поэтому мой посыл был в том, чтобы сосредоточиться на поиске решения на стороне самого SQL Server, например используя sp_create_plan_guide
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427869
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiпросто говорю, что в моем случае подсказывать SQL Server какие типы у констант должны быть в плане запросе,
Ну так и подсказывайте правильно

insert into A (a, b) values (1, 1.0000010000E3)
insert into A (a, b) values (1, 9.90000019999E4)
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427874
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 kalimba

А если попробовать так?

DECLARE @stmt nvarchar(max);
DECLARE @params nvarchar(max);
EXEC sp_get_query_template N'SELECT own_id FROM warehouse..catalog_good WHERE model_id = ''27985529'' AND deleted = 0 AND on_sell = 1 AND own_id IS NOT NULL AND own_id != '''''
,@stmt OUTPUT
,@params OUTPUT

EXEC sp_create_plan_guide N'TemplateGuide1'
,@stmt
,N'TEMPLATE'
,NULL
,@params
,N'OPTION (PARAMETERIZATION FORCED)';

EXEC sp_create_plan_guide N'SQLGuide1'
,@stmt
,N'SQL'
,NULL
,@params
,N'OPTION (RECOMPILE)';
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427889
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiподсказывать SQL Server какие типы у констант должны быть в плане запросе, на клиентской стороне довольно с трудоемкая задача, которая еще может не выстрелить по быстродействию

дважды неверно. во-первых восприятие констант самим SQL Server описано. а то, что вы не хотите этим пользоваться на server-side просто добавляет вам проблем, внезапно:

Код: sql
1.
2.
3.
4.
select SQL_VARIANT_PROPERTY( 1, 'BaseType' )
select SQL_VARIANT_PROPERTY( 1., 'BaseType' )
select SQL_VARIANT_PROPERTY( 1E0, 'BaseType' )
select SQL_VARIANT_PROPERTY( $1, 'BaseType' )



во-вторых, у вас речь про массированное добавление данных. я уже молчу про существенные накладные расходы на уровне sql connectivity слое. а они будут, поверьте мне. так вы привносите кучу лишних накладных расходов, которых можно было бы избежать просто фактом изучения вопроса массированной загрузки. да-да, тот самый BULK в конце-то концов (угу, возможно, что и в "промежуточную" таблицу). ну или, для начала, действительно работа с параметрами запроса, опять же, внезапно, на клиентской стороне

p.s.

а уж про хитрые типы данных типа datetime так и вообще страшно говорить ибо его невозможно корректно передать никак, кроме как через параметры. ну не предусмотрели разработчики сервера констант типа "дата-время". строкой приходится писать со всеми втекающими и вытекающими
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427890
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Gloryartiiпросто говорю, что в моем случае подсказывать SQL Server какие типы у констант должны быть в плане запросе,
Ну так и подсказывайте правильно

insert into A (a, b) values (1, 1.0000010000E3)
insert into A (a, b) values (1, 9.90000019999E4)

Вот, это мне и нужно было, а не городить огороды в sp_executesql и прочей пертушкой.
Спасибо
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427895
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiгородить огороды в sp_executesql и прочей пертушкой

так все равно придется же, скорее всего :) хотя.. если скорости будет достаточно без этого то и хватит, да
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427915
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Crimeanartiiподсказывать SQL Server какие типы у констант должны быть в плане запросе, на клиентской стороне довольно с трудоемкая задача, которая еще может не выстрелить по быстродействию

дважды неверно. во-первых восприятие констант самим SQL Server описано. а то, что вы не хотите этим пользоваться на server-side просто добавляет вам проблем, внезапно:
...


Все проще я даже не рассматривал вариант (что там говорить не знал), который описал Glory
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427931
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Crimeanтак все равно придется же, скорее всего :) хотя.. если скорости будет достаточно без этого то и хватит, да

Всему свое время хочется с простыми текстовыми запросами разобраться.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38427976
kalimba
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
artii,

А что это даст? Я так понимаю если делать OPTION(RECOMPILE), то темплейт тогда делать бессмыслено, не? Сейчас буду пробовать.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38428008
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artiiна клиентской стороне довольно с трудоемкая задача, которая еще может не выстрелить по быстродействию.Это точно выстрелит, и это правильно. Трудоёмкость нивелируется правильным программированием, это в принципе делается один раз, потом используется.

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

artiiGloryНу так и подсказывайте правильно

insert into A (a, b) values (1, 1.0000010000E3)
insert into A (a, b) values (1, 9.90000019999E4)
Вот, это мне и нужно было, а не городить огороды в sp_executesql и прочей пертушкой.Ну да, если у вас в поле тип данных float, то и передавать константы нужно такого же типа. Я почему то думал, что у вас в таблице тип DECIMAL.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38428055
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artii,

Эксперимент №1
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
set ansi_padding, ansi_nulls on;
go

use master;
create database TestParameterization;
alter database TestParameterization set parameterization forced;
go

use TestParameterization;
go

create table dbo.DummyTable (a int not null primary key, b int not null, c float not null);
go

insert into dbo.DummyTable (a, b, c) values (1, 2, 3.0);
go

insert into dbo.DummyTable (a, b, c) values (4, 5, 56.003);
go

insert into dbo.DummyTable (a, b, c) values (7, 8, 9000.0001);
go

select
 cp.*, t.text
from
 sys.dm_exec_cached_plans cp cross apply
 sys.dm_exec_sql_text(cp.plan_handle) t
where
 t.text not like '%sys.dm_exec_cached_plans%' and
 t.text like '%DummyTable%';
go
  
use master;
alter database TestParameterization set single_user with rollback immediate;
drop database TestParameterization;
go

Эксперимент №2
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
set ansi_padding, ansi_nulls on;
go

use master;
create database TestParameterization;
alter database TestParameterization set parameterization forced;
go

use TestParameterization;
go

create table dbo.DummyTable (a int not null primary key, b int not null, c float not null);
go

insert into dbo.DummyTable (a, b, c) values (1, 2, '3.0');
go

insert into dbo.DummyTable (a, b, c) values (4, 5, '56.003');
go

insert into dbo.DummyTable (a, b, c) values (7, 8, '9000.0001');
go

select
 cp.*, t.text
from
 sys.dm_exec_cached_plans cp cross apply
 sys.dm_exec_sql_text(cp.plan_handle) t
where
 t.text not like '%sys.dm_exec_cached_plans%' and
 t.text like '%DummyTable%';
go
  
use master;
alter database TestParameterization set single_user with rollback immediate;
drop database TestParameterization;
go

...
Рейтинг: 0 / 0
параметризация запросов insert
    #38428067
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и
Эксперимент №3
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
set ansi_padding, ansi_nulls on;
go

use master;
create database TestParameterization;
alter database TestParameterization set parameterization forced;
go

use TestParameterization;
go

create table dbo.DummyTable (a int not null primary key, b int not null, c float not null);
go

insert into dbo.DummyTable (a, b, c) values (1, 2, 3e0);
go

insert into dbo.DummyTable (a, b, c) values (4, 5, 56.003e0);
go

insert into dbo.DummyTable (a, b, c) values (7, 8, 9000.0001e0);
go

select
 cp.*, t.text
from
 sys.dm_exec_cached_plans cp cross apply
 sys.dm_exec_sql_text(cp.plan_handle) t
where
 t.text not like '%sys.dm_exec_cached_plans%' and
 t.text like '%DummyTable%';
go
  
use master;
alter database TestParameterization set single_user with rollback immediate;
drop database TestParameterization;
go

...
Рейтинг: 0 / 0
параметризация запросов insert
    #38438210
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
некропостю, но "закрыть тему":
1.чтобы "отгайдить" запрос с константами - надо или гайдов 2 делать или базу в FORCED переводить. ессно, если запрос на сервер идет непараметризованный. если уже параметризованный - проще, но есть еще и п.2.
2.собственно values параметризации не поддается, только WHERE. как следствие переписывание как INSERT SELECT тоже ничего не дает ибо параметризуется опять же только WHERE
итого - в гайды играть для вставки нет возможности
p.s.
ну и с типами данных надо или четко указывать или рисовать море гайдов под разные типы, что не особо выход
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38438483
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crimeanсобственно values параметризации не поддаетсяБерем скрипт из 14972559 , убираем, за ненадобностью, set parameterization forced, выполняем и получаем:

Код: plaintext
1.
2.
3.
4.
Microsoft SQL Server 2008 R2 (SP2) - 10.50.4276.0 (X64) 
	Feb  8 2013 10:37:00 
	Copyright (c) Microsoft Corporation
	Developer Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38438577
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm,

это у вас PQ считаются - вопросов нет! но будут-то еще и AQ! а с ними проблема как была так и останется
сам профайлером смотрел. для первого получаем AQ miss + PQ miss, для остальных получаем AQ miss но PQ hit
ну и я больше про натягивание гайдов на "такие" вставки - не натянуть, надо параметризовать с клиента ну или уже хранимку
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38438674
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crimean,

Что-то я не пойму: В скрипте же непараметризованные Ad-hoc inserts?
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38438917
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я вот про что. даже если взять "тот" пример и форсировать параметризацию, то собственно батч будет каждый раз разбираться, хотя сам план для insert уже будет параметризован. верх картинки - видно что все 3 батча дают CacheMiss для AQ, хотя, конечно, для PQ дальше мы имеем 1 CacheInsert и дальше CacheHit
а вот если перейти на RPC с параметризацией то первый раз получим CacheInsert и дальше будут только CacheHit. вторая часть картинки
или я совсем в сторону уже сбежал?
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38438983
Фотография Mind
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
artii,

Попробуйте включить 'optimize for adhoc workloads'. Параметризацию конечно не исправит, но возможно поможет решить проблему с процедурным кэшем.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38439001
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crimeanя вот про что. даже если взять "тот" пример и форсировать параметризацию, то собственно батч будет каждый раз разбираться, хотя сам план для insert уже будет параметризован.Ага, теперь понятно о чем была речь. Ну да, для insert'ов shell-планов нету в кеше...Crimeanили я совсем в сторону уже сбежал?Да нет. Понятно, что RPC выгоднее, но ТС его не захотел...
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38439152
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Забавный баг оптимизатора (параметризатора). Типы данных таблы известны заранее.
Из тех, что мне нравятся - не дают сделать через *опу.

Crimean, invm - я немногое не понял, с параметризованные запросами всё нормально (а то я AQ и PQ не могу расшифровать)
И это, RPC и параметризация это не одно и тоже? (опять же детали для тех кто в терминологии плавает)
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38439493
Crimean
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mnior,


AQ и PQ - термины профайлера, собственно, для этого типа событий
а "лирику" написал, подумал и удалил
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38439808
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Mnior,

Все нормально с параметризацией. Просто для Adhoc select в кеше есть план-обертка, а для Adhoc insert нету. Соответственно и видим в трассе CacheMiss для insert AQ.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38440217
Mnior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invmВсе нормально с параметризацией.Ок.
Если будет эта тема (план-обертка, а для Adhoc insert) в баг-трекере, я проголосую против.
Иба нефег.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38440486
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,
Ну, скажем так, я изначально отказался от sp_executesql, по той причине, что не понимал как завернуть несколько insert или update
в один батч, сейчас мне уже понятно, что я был тогда не прав.
Сейчас я уже переписал сервер, чтобы он заворачивал запросы insert или update в параметрическую форму через sp_executesql.
Тестирую на скорость и отсутствие adhoc планов, посмотрим, что получится.
...
Рейтинг: 0 / 0
параметризация запросов insert
    #38440489
artii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mind,
Я знаю про эту настройку, но при моих объемах это всего лишь несколько отсрочит тормоза на некоторое время.
Поэтому это не решение
...
Рейтинг: 0 / 0
71 сообщений из 71, показаны все 3 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / параметризация запросов insert
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]