powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / CLR функция для 1С
25 сообщений из 40, страница 1 из 2
CLR функция для 1С
    #40108144
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день всем

Извините, не силен в C# от слова совсем.
Когда-то нашел агрегат функцию CLR и по инструкции получилось ее скомпилировать и установить.

Не особо погружался в код, но благо функция работает как надо.
По большей части программирую на T-SQL...

Волею судеб довелось столкнуться с 1С, где идентификаторы представлены в виде binary(16). Однако API от 1С интерпретирует их в виде GUID.

Удалось найти функцию, которая очень извращенным способом собирает из binary(16) очень своеобразный GUID:

Код: 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.
CREATE function [dbo].[sp_getid] (@id binary(16)) 
	returns char(36) 
    	as 
	begin 
	declare @unidentifier char(36) 
	declare @charvalue char(36) 
	select @unidentifier = CONVERT(char(36),CAST(@id as uniqueidentifier)) 
		select @charvalue = 
		right(@unidentifier, 8) 
		+ substring(@unidentifier,24,5) 
		+ substring(@unidentifier,19,5) 
		+ '-' 
		+ substring(@unidentifier,7,2) 
		+ substring(@unidentifier,5,2) 
		+ '-' 
		+ substring(@unidentifier,3,2) 
		+ left(@unidentifier,2) 
		+ substring(@unidentifier,12,2) 
		+ substring(@unidentifier,10,2) 
		+ substring(@unidentifier,17,2) 
		+ substring(@unidentifier,15,2) 
	
		return ( @charvalue ) 
		end; 



таким образом айди вида:
0x81791CC1DEEA434311EBC3D76298209B ,
преобразовывается в:
C11C7981-EADE-4343-11EB-C3D76298209B

многочисленными сабстрингами режется на части, перетасовывается и получаем на выходе нужный нам GUID:
6298209B-C3D7-11EB-8179-1CC1DEEA4343

именно в таком виде его представляет 1С.

Хотелось бы и остаться на таком результате. Однако, хочу попробовать используемые конверты и сабстринги передать на управление функции CLR, в надежде, что производительность будет выше.

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

Извините за наглость, но очень прошу помочь.
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108155
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Двоичник


Хотелось бы и остаться на таком результате. Однако, хочу попробовать используемые конверты и сабстринги передать на управление функции CLR, в надежде, что производительность будет выше.


Не парьтесь, не будет.
Особенно если у вас 2019.
Ну, или преобразуйте ее в табличную инлайн-функцию, толку больше будет.
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108158
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

У меня 2016й скуль
Производительность ныне не высокая.
Конвертация одного поля в таблице 1млн записей происходит примерно за 30 секунд.

На первый взгляд похоже, что я с жиру бешусь. А по факту таких таблиц порядка 800, в каждой таблице от 4-6 таких полей, только в регистре сведений и накоплений. А в справочниках таких полей может быть уже от 10 до 25-30...
И записей в таблицах 20-100 млн.

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

Инлайн функция это что? Вряд ли мне поможет с моим ядром
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108159
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE function [dbo].[sp_getid] (@id binary(16)) 
RETURNS TABLE 
AS
RETURN 
(	select 
		right(t.u, 8) 
		+ substring(t.u,24,5) 
		+ substring(t.u,19,5) 
		+ '-' 
		+ substring(t.u,7,2) 
		+ substring(t.u,5,2) 
		+ '-' 
		+ substring(t.u,3,2) 
		+ left(t.u,2) 
		+ substring(t.u,12,2) 
		+ substring(t.u,10,2) 
		+ substring(t.u,17,2) 
		+ substring(t.u,15,2) charvalue
	From (values (CONVERT(char(36),CAST(@id as uniqueidentifier)) )) t(u)
)
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108160
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну и вызывать, соответственно:
Код: sql
1.
2.
Select a.*, t.charvalue from dbo._table1c a
   Cross apply [dbo].[sp_getid](a.id) t
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108161
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

Вы уверены, что это даст прирост производительности?

Выглядит как-то странно, в части даже способа конвертации данных...

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

Может все же остановиться на скалярной функции?

Но я попробую Ваше предложение, отпишусь о результате
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108162
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Уверен :-)
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108166
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

Попробовал, прирост производительности и правда есть и хороший. Выгоднее работает примерно на 60-70%
Другое дело, что решение не очень изящное.
Но как вариант очень достойный.
К сожалению, не понимаю в чем профит. Те же конверты и сабстринги...

Пока все еще в поиске решения на CLR.
Но спасибо огромное
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108169
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
uaggster,

У меня 2016й скуль
Производительность ныне не высокая.
Конвертация одного поля в таблице 1млн записей происходит примерно за 30 секунд.



более чем уверен что у ТС проблема не в конвертации значений а получение данных строки.
используется что нибудь вида

Код: sql
1.
2.
3.
4.
select
        [dbo].[sp_getid]([id])
from [dbo].[tbl]
where blablabla



где where blablabla нефига не попадает под существующие индексы или сам предикат поиска сложный.

или еще хуже
Код: sql
1.
2.
3.
4.
5.
declare @id char(36) = '0x....'
select
         *
from [dbo].[tbl]
where [dbo].[sp_getid]([id]) = @id
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108171
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Двоичник, профит в том, что это инлайн-функция (прочитайте о них, наконец :-) ). Ее текст встраивается в текст запроса, и заменяется эквивалентным выражением, а не осуществляется однопоточно, отдельным вызовом. 2019 может встраивать и скалярные функции.
Прирост на CLR именно на таком выражении возможно и будет, но будет незначительным. Т.к., во первых - преобразование несложное, а left-ы и прочие сабстринги работают очень быстро. И потом, в случае вызова CLR функции тоже добавится оверхед.
Короче говоря, именно на таком выражении - особого выигрыша не будет.
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108172
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

Нет, вполне все индексировано и с предикатами нет проблем.

Я делаю именно как Вы написали, но масштабнее

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Insert into STG..mytable
select
        [dbo].[sp_getid]([id1]),
[dbo].[sp_getid]([id2]),
[dbo].[sp_getid]([id3]),
[dbo].[sp_getid]([id4]),
...
[dbo].[sp_getid]([id20]),
from [dbo].[tbl]
where blablabla
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108173
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster,

У меня 2016й скуль
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108174
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник,

ок, сравните приблизительно так:

Код: 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.
set statistics io, time on;


select
        [dbo].[sp_getid]([id1]),
[dbo].[sp_getid]([id2]),
[dbo].[sp_getid]([id3]),
[dbo].[sp_getid]([id4]),
...
[dbo].[sp_getid]([id20])
into #tmp1
from [dbo].[tbl]
where blablabla

print '-------------------------';
select
        [id1],
        [id2],
        [id3],
        [id4],
        [id20]
into #tmp2
from [dbo].[tbl]
where blablabla



и покажите вывод output
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108177
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
К сожалению, не понимаю в чем профит.
Цена вызова скалярной функции невероятно высока, и неважно, что в ней делается, пусть даже просто выводится константа. Это такая старая "бага" реализации.

Сами по себе вычисления в первом посте (с substring) очень быстрые. никакой CLR не сравнится.

Нужно либо сделать инлайн, как показал uaggster, либо использовать инлайн-скалярные функции (появились недавно, сам не пробовал), или делать это прямо в запросах (но да, паст-копи зло).
Двоичник
У меня 2016й скуль
А, тогда скалярные инлайн не получится.
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108188
Двоичник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ff,

Код: 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.
set statistics io, time on;


select top 1000
				ods.dbo.fn_bin2guid(_Fld7880RRef) as fk_agr,
				ods.dbo.fn_bin2guid(_Fld7881RRef) as fk_obj,
				ods.dbo.fn_bin2guid(_Fld7882RRef) as fk_pgm,
				ods.dbo.fn_bin2guid(_Fld7883RRef) as fk_rsk,
				ods.dbo.fn_bin2guid(_Fld7885RRef) as fk_ins,
				ods.dbo.fn_bin2guid(_RecorderRRef) as fk_reg,
				ods.dbo.fn_bin2guid(_Fld7885RRef) as fk_cnt
				into #tmp1
	from STG.._InfoRg7879

print '-------------------------';
select top 1000 
				_Fld7880RRef as fk_agr,
				_Fld7881RRef as fk_obj,
				_Fld7882RRef as fk_pgm,
				_Fld7883RRef as fk_rsk,
				_Fld7885RRef as fk_ins,
				_RecorderRRef as fk_reg,
				_Fld7885RRef as fk_cnt
				into #tmp2
	from STG.._InfoRg7879



получил

Время синтаксического анализа и компиляции SQL Server:
время ЦП = 0 мс, истекшее время = 2 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 1 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Таблица "#tmp1_______________________________________________________________________________________________________________00000001258A". Число просмотров 0, логических чтений 1015, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.
Таблица "_InfoRg7879". Число просмотров 1, логических чтений 23, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

Время работы SQL Server:
Время ЦП = 79 мс, затраченное время = 78 мс.

(затронуто строк: 1000)
-------------------------

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 0 мс.
Таблица "_InfoRg7879". Число просмотров 1, логических чтений 23, физических чтений 0, упреждающих чтений 0, lob логических чтений 0, lob физических чтений 0, lob упреждающих чтений 0.

Время работы SQL Server:
Время ЦП = 0 мс, затраченное время = 2 мс.

(затронуто строк: 1000)

Время выполнения: 2021-10-29T20:15:06.6284756+03:00
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108221
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник,

ну да, теперь убедили :)

большого смысла переписывать данную конструкцию на CLR чисто имхо не имеет смысла если вы собираетесь ее использовать как скалярную фукнцию.

там тоже тогда будет в плане куча compute scalar только подсчета в виде SQLCLR.

я бы попробовал предложить сравнить инлайновый вариант tsql с табличной clr правда которая была бы не универсальной, а принимала предопределенное кол-во параметров и возвращала бы строку с тем же кол-вом колонок

аля:

SQLCLR
Код: c#
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.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
using System.Collections;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

namespace getUids1C
{
    public static class CLR_Func
    {
        [SqlFunction(FillRowMethodName = "getUid_getRow")]
        public static IEnumerable getUid(byte[] c1, byte[] c2, byte[] c3, byte[] c4)
        {
            return new UidsRecord[] { new UidsRecord(c1, c2, c3, c4) };
        }


        public static void getUid_getRow(object obj, out SqlGuid c1, out SqlGuid c2, out SqlGuid c3, out SqlGuid c4)
        {
            UidsRecord o = (UidsRecord)obj;
            c1 = new SqlGuid(o.c1);
            c2 = new SqlGuid(o.c2);
            c3 = new SqlGuid(o.c3);
            c4 = new SqlGuid(o.c4);
        }


        public class UidsRecord
        {
            public byte[] c1;
            public byte[] c2;
            public byte[] c3;
            public byte[] c4;

            public UidsRecord(byte[] a1, byte[] a2, byte[] a3, byte[] a4)
            {
                formatBytes(a1, out c1);
                formatBytes(a2, out c2);
                formatBytes(a3, out c3);
                formatBytes(a4, out c4);
            }

            private void formatBytes(byte[] buffer1, out byte[] buffer2)
            {
                buffer2 = new byte[] {
                                   buffer1[15],
                                   buffer1[14],
                                   buffer1[13],
                                   buffer1[12],
                                   buffer1[11],
                                   buffer1[10],
                                   buffer1[9],
                                   buffer1[8],
                                   buffer1[0],
                                   buffer1[1],
                                   buffer1[2],
                                   buffer1[3],
                                   buffer1[4],
                                   buffer1[5],
                                   buffer1[6],
                                   buffer1[7]
            };
            }
        }

    }
}




TSQL
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
create assembly getUids1C from 'C:\source\getUids1C\getUids1C.dll';
go
create function fn_getUid (
@c1 varbinary(16),
@c2 varbinary(16),
@c3 varbinary(16),
@c4 varbinary(16)
)
returns table (c1 uniqueidentifier, c2 uniqueidentifier, c3 uniqueidentifier, c4 uniqueidentifier)
as
external name [getUids1C].[getUids1C.CLR_Func].[getUid];
go



Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
declare
       @c1 uniqueidentifier = newid(),
       @c2 uniqueidentifier = newid(),
       @c3 uniqueidentifier = newid(),
       @c4 uniqueidentifier = 'C11C7981-EADE-4343-11EB-C3D76298209B';

declare
       @b1 varbinary(16) = cast(@c1 as varbinary(16)),
       @b2 varbinary(16) = cast(@c2 as varbinary(16)),
       @b3 varbinary(16) = cast(@c3 as varbinary(16)),
       @b4 varbinary(16) = cast(@c4 as varbinary(16))

select @c1 as [c1], @c2 as [c3], @c3 as [c3], @c4 as [c4];
select * from [dbo].[fn_getUid](@b1, @b2, @b3, @b4);



и в вашем случае использовать в виде

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
select top 1000
				x.c1 as fk_agr,
				x.c2 as fk_obj,
				x.c3 as fk_pgm,
				x.c4 as fk_rsk,
				ods.dbo.fn_bin2guid(_Fld7885RRef) as fk_ins,
				ods.dbo.fn_bin2guid(_RecorderRRef) as fk_reg,
				ods.dbo.fn_bin2guid(_Fld7885RRef) as fk_cnt
				into #tmp1
	from STG.._InfoRg7879 t cross apply [dbo].[fn_getUid] (_Fld7880RRef, _Fld7881RRef, _Fld7882RRef, _Fld7883RRef) x




опять же не факт что будет быстрее обычной инлайновой tsql
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108246
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
Попробовал, прирост производительности и правда есть и хороший. Выгоднее работает примерно на 60-70%
Выгоднее по CPU А у меня разница по CPU примерно на 60-70%, а по времени в 5 раз.
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108247
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
Двоичник
Попробовал, прирост производительности и правда есть и хороший. Выгоднее работает примерно на 60-70%
Выгоднее по CPU А у меня разница по CPU примерно на 60-70%, а по времени в 5 раз.

Репро:
Код: 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.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
use tempdb
go
create table t(b0 binary(16), b1 binary(16), b2 binary(16), b3 binary(16), b4 binary(16), b5 binary(16), b6 binary(16), b7 binary(16), b8 binary(16), b9 binary(16))
go
insert t 
select top 1000 0x81791CC1DEEA434311EBC3D76298209B, 0x81791CC1DEEA434311EBC3D76298209B, 0x81791CC1DEEA434311EBC3D76298209B, 0x81791CC1DEEA434311EBC3D76298209B, 0x81791CC1DEEA434311EBC3D76298209B, 0x81791CC1DEEA434311EBC3D76298209B, 0x81791CC1DEEA434311EBC3D76298209B, 0x81791CC1DEEA434311EBC3D76298209B, 0x81791CC1DEEA434311EBC3D76298209B, 0x81791CC1DEEA434311EBC3D76298209B
from syscolumns c1 cross join syscolumns c2
select * from t 
go

CREATE function [dbo].[sp_getid_scalar] (@id binary(16)) 
	returns char(36) 
    	as 
	begin 
	declare @unidentifier char(36) 
	declare @charvalue char(36) 
	select @unidentifier = CONVERT(char(36),CAST(@id as uniqueidentifier)) 
		select @charvalue = 
		right(@unidentifier, 8) 
		+ substring(@unidentifier,24,5) 
		+ substring(@unidentifier,19,5) 
		+ '-' 
		+ substring(@unidentifier,7,2) 
		+ substring(@unidentifier,5,2) 
		+ '-' 
		+ substring(@unidentifier,3,2) 
		+ left(@unidentifier,2) 
		+ substring(@unidentifier,12,2) 
		+ substring(@unidentifier,10,2) 
		+ substring(@unidentifier,17,2) 
		+ substring(@unidentifier,15,2) 
	
		return ( @charvalue ) 
		end; 
go
CREATE function [dbo].[sp_getid_table] (@id binary(16)) 
RETURNS TABLE 
AS
RETURN 
(	select 
		right(t.u, 8) 
		+ substring(t.u,24,5) 
		+ substring(t.u,19,5) 
		+ '-' 
		+ substring(t.u,7,2) 
		+ substring(t.u,5,2) 
		+ '-' 
		+ substring(t.u,3,2) 
		+ left(t.u,2) 
		+ substring(t.u,12,2) 
		+ substring(t.u,10,2) 
		+ substring(t.u,17,2) 
		+ substring(t.u,15,2) charvalue
	From (values (CONVERT(char(36),CAST(@id as uniqueidentifier)) )) t(u)
)
go

Select 
[dbo].[sp_getid_scalar](a.b0) as b0,
[dbo].[sp_getid_scalar](a.b1) as b1,
[dbo].[sp_getid_scalar](a.b2) as b2,
[dbo].[sp_getid_scalar](a.b3) as b3,
[dbo].[sp_getid_scalar](a.b4) as b4,
[dbo].[sp_getid_scalar](a.b5) as b5,
[dbo].[sp_getid_scalar](a.b6) as b6,
[dbo].[sp_getid_scalar](a.b7) as b7,
[dbo].[sp_getid_scalar](a.b8) as b8,
[dbo].[sp_getid_scalar](a.b9) as b9
into #temp_scalar
from t a
go
Select t0.charvalue as b0, t1.charvalue as b1, t2.charvalue as b2, t3.charvalue as b3, t4.charvalue as b4, t5.charvalue as b5, t6.charvalue as b6, t7.charvalue as b7, t8.charvalue as b8, t9.charvalue as b9 
into #temp_table
from t a
   Cross apply [dbo].[sp_getid_table](a.b0) t0
   Cross apply [dbo].[sp_getid_table](a.b1) t1
   Cross apply [dbo].[sp_getid_table](a.b2) t2
   Cross apply [dbo].[sp_getid_table](a.b3) t3
   Cross apply [dbo].[sp_getid_table](a.b4) t4
   Cross apply [dbo].[sp_getid_table](a.b5) t5
   Cross apply [dbo].[sp_getid_table](a.b6) t6
   Cross apply [dbo].[sp_getid_table](a.b7) t7
   Cross apply [dbo].[sp_getid_table](a.b8) t8
   Cross apply [dbo].[sp_getid_table](a.b9) t9
go
drop table #temp_scalar
drop table #temp_table

...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108263
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник,

использование скалярной функции не только медленное, а еще и не допускает параллельной обработки в запросах, за исключением 2019 сервера и то с костылями.
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108265
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE function [dbo].[sp_getid] (@id binary(16)) 
RETURNS TABLE 
AS
RETURN 
(	select 
		right(t.u, 8) 
		+ substring(t.u,24,5) 
		+ substring(t.u,19,5) 
		+ '-' 
		+ substring(t.u,7,2) 
		+ substring(t.u,5,2) 
		+ '-' 
		+ substring(t.u,3,2) 
		+ left(t.u,2) 
		+ substring(t.u,12,2) 
		+ substring(t.u,10,2) 
		+ substring(t.u,17,2) 
		+ substring(t.u,15,2) charvalue
	From (values (CONVERT(char(36),CAST(@id as uniqueidentifier)) )) t(u)
)



Проще надо быть

Код: sql
1.
2.
3.
4.
CREATE function [dbo].[getId](@id binary(16)) 
RETURNS TABLE 
AS
RETURN ( select id = convert(char(36), cast( cast( reverse(cast(substring(@id, 9, 8) as char(8)) ) as binary(8) ) + substring(@id, 1, 8) as uniqueidentifier) , 2) )
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108280
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
aleks222
Проще надо быть
Хм, тут CPU стало меньше в 3 раза, а Durations в 5 раз по сравнению с вариантом uaggster
Ну и в 5 и 20 раз соответственно по сравнению со скалярной ф-цией.

Интересно, с чего такая разница, неужели пачка сабстрингов и пара лефт-райт, + 12 конкатенаций настолько тяжелы, по сравнению с вашим вариантом?
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108293
Ролг Хупин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Двоичник
uaggster,

У меня 2016й скуль



х*юль

Обычно у тех, кто мало соображает даже в SQL стоят 2016й скули на масдаях и пр.

SQL Serve 2016
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108304
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
aleks222
uaggster
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
CREATE function [dbo].[sp_getid] (@id binary(16)) 
RETURNS TABLE 
AS
RETURN 
(	select 
		right(t.u, 8) 
		+ substring(t.u,24,5) 
		+ substring(t.u,19,5) 
		+ '-' 
		+ substring(t.u,7,2) 
		+ substring(t.u,5,2) 
		+ '-' 
		+ substring(t.u,3,2) 
		+ left(t.u,2) 
		+ substring(t.u,12,2) 
		+ substring(t.u,10,2) 
		+ substring(t.u,17,2) 
		+ substring(t.u,15,2) charvalue
	From (values (CONVERT(char(36),CAST(@id as uniqueidentifier)) )) t(u)
)



Проще надо быть

Код: sql
1.
2.
3.
4.
CREATE function [dbo].[getId](@id binary(16)) 
RETURNS TABLE 
AS
RETURN ( select id = convert(char(36), cast( cast( reverse(cast(substring(@id, 9, 8) as char(8)) ) as binary(8) ) + substring(@id, 1, 8) as uniqueidentifier) , 2) )


Ээээ... мопед не мой, я только разместил объяву! (с)
И, кстати, в упор не понял, как это так получилось то. Если вариант ТС хоть как то понимаю (ну есть некий набор байт его как то для чего то миксуют) то здесь - в упор непонятно. Почему это два эквивалентных микса то?
Это как то связано с механизмом хранения гуидов?
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108305
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg
aleks222
Проще надо быть
Хм, тут CPU стало меньше в 3 раза, а Durations в 5 раз по сравнению с вариантом uaggster
Ну и в 5 и 20 раз соответственно по сравнению со скалярной ф-цией.

Интересно, с чего такая разница, неужели пачка сабстрингов и пара лефт-райт, + 12 конкатенаций настолько тяжелы, по сравнению с вашим вариантом?

Ну дык там 4 вызова примерно тех же самых функций вместо 20, как в варианте ТС.
Понятно, что оно в 5 раз легче...
...
Рейтинг: 0 / 0
CLR функция для 1С
    #40108312
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
uaggster
Ну дык там 4 вызова примерно тех же самых функций вместо 20, как в варианте ТС.
Не думал, что они так много стоят...
И вообще, интересно как то разложить операции по стоимости, может, тяжёлой являются конкретно какая то одна операция?
uaggster
Это как то связано с механизмом хранения гуидов?
Ага, понимание, как последовательность байт при конвертации в строку.
...
Рейтинг: 0 / 0
25 сообщений из 40, страница 1 из 2
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / CLR функция для 1С
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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