Właśnie utworzyłem tabelę z 5 milionami wierszy. Ze struktury tabeli jako:
rn t1 t2 t3 formula
1 80 23 93 t1/t2 * t3
2 80 87 30 t1/t2 * t3
3 92 83 63 t1/t2 * t3
4 68 19 36 t1/t2 * t3
5 65 63 10 t1/t2 * t3
Jeżeli jesteś pewien, że wszystko, co wzory są ważne, a nie będziesz musiał dzielenie przez zero, na przykład, lub typ danych przelewu, w tym przypadku można zrobić własny eval() funkcja w serwerze SQL.
Stworzyłem własną funkcję dla 3 wartości we wzorze ze znakami takimi jak: "+", "-", "*", "/".
Kod funkcji wynosi:
use db_test;
go
alter function dbo.eval(@a varchar(max))
returns float
as
begin
set @a = replace(@a, ' ', '');
declare @pos1 int = PATINDEX('%[+/*-]%', @a);
declare @t1 float = cast(substring(@a, 1, @pos1 - 1) as float);
declare @sign1 char(1) = substring(@a, @pos1, 1);
set @a = substring(@a, @pos1 + 1, len(@a) - @pos1);
declare @pos2 int = PATINDEX('%[+/*-]%', @a);
declare @t2 float = cast(substring(@a, 1, @pos2 - 1) as float);
declare @sign2 char(1) = substring(@a, @pos2, 1);
set @a = substring(@a, @pos2 + 1, len(@a) - @pos2);
declare @t3 float = cast(@a as float);
set @t1 = (
case @sign1
when '+' then @t1 + @t2
when '-' then @t1 - @t2
when '*' then @t1 * @t2
when '/' then @t1/@t2
end
);
set @t1 = (
case @sign2
when '+' then @t1 + @t3
when '-' then @t1 - @t3
when '*' then @t1 * @t3
when '/' then @t1/@t3
end
);
return @t1;
end;
i działa na kolejnych danych:
select dbo.eval('7.6*11.3/4.5') as eval, 7.6*11.3/4.5 as sqlServerCalc;
eval sqlServerCalc
19,0844444444444 19.084444
Po tym można zastąpić wartości w formule o wartości kolumn i obliczyć:
with cte as (
select rn, t1, t2, t3, formula,
REPLACE(REPLACE(REPLACE(formula, 't1', cast(t1 as varchar(max))), 't2', cast(t2 as varchar(max))), 't3', cast(t3 as varchar(max))) as calc
from db_test.dbo.loop
)
select rn, t1, t2, t3, formula, db_test.dbo.eval(calc) as result
into db_test.dbo.loop2
from cte;
Czas jest dla mnie w porządku, zajmuje 3 minuty na moim serwerze Sql Server 2016 i daje dobre wyniki:
select top 5 *
from db_test.dbo.loop2;
rn t1 t2 t3 formula result
1 80 23 93 t1/t2 * t3 323,478260869565
2 80 87 30 t1/t2 * t3 27,5862068965517
3 92 83 63 t1/t2 * t3 69,8313253012048
4 68 19 36 t1/t2 * t3 128,842105263158
5 65 63 10 t1/t2 * t3 10,3174603174603
Jeśli masz listę wszystkich operacji, które mają zastosowanie w formule, możesz napisać wspólną funkcję dla wielu zmiennych. Ale jeśli w formule jest coś bardziej skomplikowanego, należy użyć CLR.
Możesz opublikować tę wiadomość w [Przeglądzie kodu] (https://codereview.stackexchange.com/). To lepsze miejsce do pracy z kodem, który chcesz przyspieszyć. –
jest formuła akt obliczona kolumna? –
Musisz szukać wąskich gardeł w swojej 'aktualizacji'. Czy masz jakieś wyzwalacze, indeksy lub FK? Jakiego rodzaju izolacji używasz? Zobacz także plan zapytania. –