powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Скалярные функции и QUERYTRACEON 8649
18 сообщений из 18, страница 1 из 1
Скалярные функции и QUERYTRACEON 8649
    #39798686
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Возникла весьма специфическая ситуация. В динамическом коде юзаются динамически создаваемые функции. Проблема в том, что при использовании скалярок мы не получим параллельные планы выполнения. Случаем никто не знает никаких извратов? Как зафорсить параллелизм. Избавиться от функций кикак не получится. Мини репро:

Код: 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.
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'))
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39798688
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlanDenton,

никак. Вроде в 2019 же будет проброс скалярки прям в запрос, вот тогда приходите
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39798697
AlanDenton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Буду тогда думать в сторону инлайн функций думать. Ибо вариантов и вправду ноль.

Код: 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.
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'))
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39798699
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
или на инлайн перейти... скалярки - нет
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39798701
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlanDentonСлучаем никто не знает никаких извратов?Если функции приводимы к инлайновым и можно изменить генератор динамики, то генерировать две функции: инлайновую и скалярную на ее основе. И пользоваться либо той, либо другой, в зависимости от надобности.
Код: 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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
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
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39800619
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
declare @s as varchar(10000)

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

exec @s

еще в 2000м так жили, и неплохо)))
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39800620
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kzndeclare @s as varchar(10000)

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

exec @s

еще в 2000м так жили, и неплохо)))
перегрелся, несите нового
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39800622
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
varchar (10000)?
exec @s не для выполнения процедур?
и все это еще в 2000м?
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39800646
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторvarchar(10000)

мечты, мечты...
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39800800
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я уже не помню, как именно жили

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

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

Я нигде не говорил, что так было в 2000м
Жили exec'ом
И неплохо
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39800805
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kznVarchar(10000) щяс нельзя?Нельзя
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39800810
Гавриленко Сергей Алексеевич
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kznЯ уже не помню, как именно жили

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

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

Я нигде не говорил, что так было в 2000м
Жили exec'ом
И неплохоВы там закусывайте что ли.
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39800838
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ах ах, varchat только 8000, пичалька
Я не прошел собеседование?)

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

Хорошие напитки не закусывают
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39800842
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кстати про мс-oltp ))

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

Для некоторых случаев интереснее
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39800867
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kznПри этом ограничений на длину сцепки вроде как не было, так и нет.Нету такого термина в документации, как "сцепка"
Никакими операциями (вроде "сцепки") нельзя получить строку varchar длинной более 8000, без приведения к varchar(max)
Но команда exec имеет специальный синтаксис:
Код: plaintext
1.
2.
{ EXEC | EXECUTE }   
    ( { @string_variable | [ N ]'tsql_string' }  [ + ...n ]  )  
который передаёт все указанные строки в обработчик, а там уже они соединяются в длинную строку и выполняются. Конечно, там в этом обработчике уже нет никаких varchar, там что то на "C".
Т.е. + в этой команде не означает конкатенацию строк.
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39800886
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
под риск в третий раз не пройти собеседование)) отмечу, что мне кажется))) что у мс как раз сначала был вариант только с переменной, а потом вот эту "специальную форму" добавили, ибо ... но могу врать в соответствии с порядком ознакомления с этим делом (ну и напитками тоже)

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

(чтобы не было возможности закусывать в промежутках плохие напитки, и посему не изменять правилу только хороших)
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39800996
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
dklim.kznчто мне кажется))) что у мс как раз сначала был вариант только с переменной, а потом вот эту "специальную форму" добавилиМожет и так. Я с 6.0 начинал, в 90-е, по моему, тогда уже были все варианты, но до этого не в курсе.
...
Рейтинг: 0 / 0
Скалярные функции и QUERYTRACEON 8649
    #39801010
dklim.kzn
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg,

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

собственно, особо используемый механизм - дернуть данные во времянку, там построить индекс, и выполнить запрос
индекс и запрос по несуществующей таблице в хранимой процедуре не получатся, так что всё exec'ом
один вызов с параметрами - и всё получено клиентом
сейчас скорее всего всё иначе, но по сути не сильно лучше, думаю
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Скалярные функции и QUERYTRACEON 8649
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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