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

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

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

Код: 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
09.04.2019, 12:58
    #39798699
TaPaK
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скалярные функции и QUERYTRACEON 8649
или на инлайн перейти... скалярки - нет
...
Рейтинг: 0 / 0
09.04.2019, 13:02
    #39798701
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скалярные функции и QUERYTRACEON 8649
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
12.04.2019, 15:22
    #39800619
dklim.kzn
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Скалярные функции и QUERYTRACEON 8649
declare @s as varchar(10000)

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

exec @s

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

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

exec @s

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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