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

Откуда: Бобруйск
Сообщений: 356
Добрый день всем

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

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

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

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

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#.. Видать я стар стал для изучения нового.

Извините за наглость, но очень прошу помочь.
29 окт 21, 17:35    [22390051]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
uaggster
Member

Откуда:
Сообщений: 1155
Двоичник


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


Не парьтесь, не будет.
Особенно если у вас 2019.
Ну, или преобразуйте ее в табличную инлайн-функцию, толку больше будет.
29 окт 21, 17:53    [22390071]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 356
uaggster,

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

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

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

Инлайн функция это что? Вряд ли мне поможет с моим ядром
29 окт 21, 18:00    [22390078]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
uaggster
Member

Откуда:
Сообщений: 1155
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)
)
29 окт 21, 18:01    [22390080]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
uaggster
Member

Откуда:
Сообщений: 1155
Ну и вызывать, соответственно:
Select a.*, t.charvalue from dbo._table1c a
   Cross apply [dbo].[sp_getid](a.id) t
29 окт 21, 18:05    [22390081]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 356
uaggster,

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

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

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

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

Но я попробую Ваше предложение, отпишусь о результате
29 окт 21, 18:06    [22390084]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
uaggster
Member

Откуда:
Сообщений: 1155
Уверен :-)
29 окт 21, 18:08    [22390085]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 356
uaggster,

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

Пока все еще в поиске решения на CLR.
Но спасибо огромное
29 окт 21, 18:25    [22390096]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1909
Двоичник
uaggster,

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



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

select
        [dbo].[sp_getid]([id])
from [dbo].[tbl]
where blablabla


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

или еще хуже
declare @id char(36) = '0x....'
select
         *
from [dbo].[tbl]
where [dbo].[sp_getid]([id]) = @id


Сообщение было отредактировано: 29 окт 21, 18:37
29 окт 21, 18:34    [22390101]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
uaggster
Member

Откуда:
Сообщений: 1155
Двоичник, профит в том, что это инлайн-функция (прочитайте о них, наконец :-) ). Ее текст встраивается в текст запроса, и заменяется эквивалентным выражением, а не осуществляется однопоточно, отдельным вызовом. 2019 может встраивать и скалярные функции.
Прирост на CLR именно на таком выражении возможно и будет, но будет незначительным. Т.к., во первых - преобразование несложное, а left-ы и прочие сабстринги работают очень быстро. И потом, в случае вызова CLR функции тоже добавится оверхед.
Короче говоря, именно на таком выражении - особого выигрыша не будет.
29 окт 21, 18:37    [22390105]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 356
felix_ff,

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

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

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
29 окт 21, 18:38    [22390106]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 356
uaggster,

У меня 2016й скуль
29 окт 21, 18:39    [22390107]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1909
Двоичник,

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

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

Сообщение было отредактировано: 29 окт 21, 18:49
29 окт 21, 18:40    [22390108]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
Двоичник
К сожалению, не понимаю в чем профит.
Цена вызова скалярной функции невероятно высока, и неважно, что в ней делается, пусть даже просто выводится константа. Это такая старая "бага" реализации.

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

Нужно либо сделать инлайн, как показал uaggster, либо использовать инлайн-скалярные функции (появились недавно, сам не пробовал), или делать это прямо в запросах (но да, паст-копи зло).
Двоичник
У меня 2016й скуль
А, тогда скалярные инлайн не получится.

Сообщение было отредактировано: 29 окт 21, 18:53
29 окт 21, 18:51    [22390112]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
Двоичник
Member

Откуда: Бобруйск
Сообщений: 356
felix_ff,

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
29 окт 21, 20:16    [22390150]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1909
Двоичник,

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

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

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

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

аля:

+ SQLCLR

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

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


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);


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

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
29 окт 21, 23:38    [22390218]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
Двоичник
Попробовал, прирост производительности и правда есть и хороший. Выгоднее работает примерно на 60-70%
Выгоднее по CPU А у меня разница по CPU примерно на 60-70%, а по времени в 5 раз.

К сообщению приложен файл. Размер - 63Kb
30 окт 21, 10:49    [22390284]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
alexeyvg
Двоичник
Попробовал, прирост производительности и правда есть и хороший. Выгоднее работает примерно на 60-70%
Выгоднее по CPU А у меня разница по CPU примерно на 60-70%, а по времени в 5 раз.

Картинка с другого сайта.
Репро:
+
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
30 окт 21, 10:50    [22390285]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 9155
Двоичник,

использование скалярной функции не только медленное, а еще и не допускает параллельной обработки в запросах, за исключением 2019 сервера и то с костылями.
30 окт 21, 12:59    [22390320]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
aleks222
Member

Откуда:
Сообщений: 1846
uaggster
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)
)


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

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) )
30 окт 21, 13:03    [22390323]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
aleks222
Проще надо быть
Хм, тут CPU стало меньше в 3 раза, а Durations в 5 раз по сравнению с вариантом uaggster
Ну и в 5 и 20 раз соответственно по сравнению со скалярной ф-цией.

Интересно, с чего такая разница, неужели пачка сабстрингов и пара лефт-райт, + 12 конкатенаций настолько тяжелы, по сравнению с вашим вариантом?
30 окт 21, 16:20    [22390363]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 4434
Двоичник
uaggster,

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



х*юль

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

SQL Serve 2016
30 окт 21, 17:56    [22390384]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
uaggster
Member

Откуда:
Сообщений: 1155
aleks222
uaggster
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)
)


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

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) )

Ээээ... мопед не мой, я только разместил объяву! (с)
И, кстати, в упор не понял, как это так получилось то. Если вариант ТС хоть как то понимаю (ну есть некий набор байт его как то для чего то миксуют) то здесь - в упор непонятно. Почему это два эквивалентных микса то?
Это как то связано с механизмом хранения гуидов?
30 окт 21, 18:57    [22390415]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
uaggster
Member

Откуда:
Сообщений: 1155
alexeyvg
aleks222
Проще надо быть
Хм, тут CPU стало меньше в 3 раза, а Durations в 5 раз по сравнению с вариантом uaggster
Ну и в 5 и 20 раз соответственно по сравнению со скалярной ф-цией.

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

Ну дык там 4 вызова примерно тех же самых функций вместо 20, как в варианте ТС.
Понятно, что оно в 5 раз легче...
30 окт 21, 19:00    [22390416]     Ответить | Цитировать Сообщить модератору
 Re: CLR функция для 1С  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 32173
uaggster
Ну дык там 4 вызова примерно тех же самых функций вместо 20, как в варианте ТС.
Не думал, что они так много стоят...
И вообще, интересно как то разложить операции по стоимости, может, тяжёлой являются конкретно какая то одна операция?
uaggster
Это как то связано с механизмом хранения гуидов?
Ага, понимание, как последовательность байт при конвертации в строку.
30 окт 21, 20:46    [22390433]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить