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

Откуда:
Сообщений: 1004
Возникла весьма специфическая ситуация. В динамическом коде юзаются динамически создаваемые функции. Проблема в том, что при использовании скалярок мы не получим параллельные планы выполнения. Случаем никто не знает никаких извратов? Как зафорсить параллелизм. Избавиться от функций кикак не получится. Мини репро:

DROP FUNCTION IF EXISTS f1
GO

CREATE FUNCTION f1 (@a INT)
RETURNS INT
WITH SCHEMABINDING
AS BEGIN
    RETURN @a
END
GO

DROP TABLE IF EXISTS t1

SELECT TOP(1000000) a = 1
INTO t1
FROM sys.all_columns q1
CROSS JOIN sys.all_columns q2

SELECT COUNT(1)
FROM t1
WHERE dbo.f1(a) = 1
OPTION(QUERYTRACEON 8649)

SELECT COUNT(1)
FROM t1
WHERE dbo.f1(a) = 1
OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))
9 апр 19, 12:42    [21856992]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6376
AlanDenton,

никак. Вроде в 2019 же будет проброс скалярки прям в запрос, вот тогда приходите
9 апр 19, 12:43    [21856995]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Буду тогда думать в сторону инлайн функций думать. Ибо вариантов и вправду ноль.

DROP FUNCTION IF EXISTS f1
GO

CREATE FUNCTION f1 (@a INT)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN (SELECT a = @a)
GO

DROP TABLE IF EXISTS t1

SELECT TOP(1000000) a = 1
INTO t1
FROM sys.all_columns q1
CROSS JOIN sys.all_columns q2

SELECT COUNT(1)
FROM t1
WHERE (SELECT * FROM dbo.f1(a)) = 1
OPTION(QUERYTRACEON 8649)

SELECT COUNT(1)
FROM t1
WHERE (SELECT * FROM dbo.f1(a)) = 1
OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'))
9 апр 19, 12:57    [21857013]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6376
или на инлайн перейти... скалярки - нет
9 апр 19, 12:58    [21857015]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
invm
Member

Откуда: Москва
Сообщений: 8661
AlanDenton
Случаем никто не знает никаких извратов?
Если функции приводимы к инлайновым и можно изменить генератор динамики, то генерировать две функции: инлайновую и скалярную на ее основе. И пользоваться либо той, либо другой, в зависимости от надобности.
DROP FUNCTION IF EXISTS f1, dbo.f1_inline
GO

CREATE FUNCTION dbo.f1_inline (@a INT)
RETURNS table
WITH SCHEMABINDING
as
return select @a as a;
go

CREATE FUNCTION dbo.f1 (@a INT)
RETURNS INT
WITH SCHEMABINDING
AS BEGIN
    RETURN (select a from dbo.f1_inline(@a))
END
GO

DROP TABLE IF EXISTS t1

create table t1 (a int);
update statistics t1 with rowcount = 10000000, pagecount = 1000000;

set statistics xml on;

SELECT COUNT(1)
FROM t1
WHERE dbo.f1(a) = 1
OPTION(QUERYTRACEON 8649)

SELECT COUNT(1)
FROM t1
WHERE dbo.f1(a) = 1
OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'));

SELECT COUNT(1)
FROM t1 cross apply
dbo.f1_inline(t1.a) a
WHERE a.a = 1
OPTION(QUERYTRACEON 8649)

SELECT COUNT(1)
FROM t1 cross apply
dbo.f1_inline(t1.a) a
WHERE a.a = 1
OPTION(USE HINT('ENABLE_PARALLEL_PLAN_PREFERENCE'));

set statistics xml off;
go

DROP FUNCTION IF EXISTS f1, dbo.f1_inline
DROP TABLE IF EXISTS t1
9 апр 19, 13:02    [21857019]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
declare @s as varchar(10000)

set @s='запрос'

exec @s

еще в 2000м так жили, и неплохо)))
12 апр 19, 15:22    [21860623]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6376
dklim.kzn
declare @s as varchar(10000)

set @s='запрос'

exec @s

еще в 2000м так жили, и неплохо)))

перегрелся, несите нового
12 апр 19, 15:24    [21860625]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36269
varchar (10000)?
exec @s не для выполнения процедур?
и все это еще в 2000м?
12 апр 19, 15:27    [21860628]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 6532
автор
varchar(10000)


мечты, мечты...
12 апр 19, 15:59    [21860665]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
Я уже не помню, как именно жили

Exec 'ползапроса' + ' еще ползапроса' наверное

Человек про щяс спращшивает
Varchar(10000) щяс нельзя?

Я нигде не говорил, что так было в 2000м
Жили exec'ом
И неплохо
12 апр 19, 22:32    [21860928]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28723
dklim.kzn
Varchar(10000) щяс нельзя?
Нельзя
12 апр 19, 22:56    [21860939]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36269
dklim.kzn
Я уже не помню, как именно жили

Exec 'ползапроса' + ' еще ползапроса' наверное

Человек про щяс спращшивает
Varchar(10000) щяс нельзя?

Я нигде не говорил, что так было в 2000м
Жили exec'ом
И неплохо
Вы там закусывайте что ли.
12 апр 19, 23:16    [21860953]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
Ах ах, varchat только 8000, пичалька
Я не прошел собеседование?)

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

Хорошие напитки не закусывают
13 апр 19, 07:09    [21861008]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
Кстати про мс-oltp ))

Там nc-функция еще методический вариант
Теряем параллелизм, но получаем ускорение ее вычисления

Для некоторых случаев интереснее
13 апр 19, 07:34    [21861013]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28723
dklim.kzn
При этом ограничений на длину сцепки вроде как не было, так и нет.
Нету такого термина в документации, как "сцепка"
Никакими операциями (вроде "сцепки") нельзя получить строку varchar длинной более 8000, без приведения к varchar(max)
Но команда exec имеет специальный синтаксис:
{ EXEC | EXECUTE }   
( { @string_variable | [ N ]'tsql_string' } [ + ...n ] )
который передаёт все указанные строки в обработчик, а там уже они соединяются в длинную строку и выполняются. Конечно, там в этом обработчике уже нет никаких varchar, там что то на "C".
Т.е. + в этой команде не означает конкатенацию строк.
13 апр 19, 09:36    [21861038]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
под риск в третий раз не пройти собеседование)) отмечу, что мне кажется))) что у мс как раз сначала был вариант только с переменной, а потом вот эту "специальную форму" добавили, ибо ... но могу врать в соответствии с порядком ознакомления с этим делом (ну и напитками тоже)

нам то главное чтобы работало, и быстро

(чтобы не было возможности закусывать в промежутках плохие напитки, и посему не изменять правилу только хороших)
13 апр 19, 12:02    [21861080]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 28723
dklim.kzn
что мне кажется))) что у мс как раз сначала был вариант только с переменной, а потом вот эту "специальную форму" добавили
Может и так. Я с 6.0 начинал, в 90-е, по моему, тогда уже были все варианты, но до этого не в курсе.
14 апр 19, 01:13    [21861409]     Ответить | Цитировать Сообщить модератору
 Re: Скалярные функции и QUERYTRACEON 8649  [new]
dklim.kzn
Member

Откуда: Казань
Сообщений: 123
alexeyvg,

ну значит вру, я с 7 начинал
но может доводили древние
или сначала мне одной переменной хватало

собственно, особо используемый механизм - дернуть данные во времянку, там построить индекс, и выполнить запрос
индекс и запрос по несуществующей таблице в хранимой процедуре не получатся, так что всё exec'ом
один вызов с параметрами - и всё получено клиентом
сейчас скорее всего всё иначе, но по сути не сильно лучше, думаю
14 апр 19, 10:25    [21861483]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить