मैंने अभी 5 मिलियन पंक्तियों के साथ तालिका बनाई है। तालिका संरचना के साथ के रूप में:
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
तो क्या आप वाकई यह है कि आप सभी सूत्र मान्य हैं, और आप उदाहरण के लिए शून्य से भाग नहीं होगा, या डेटा प्रकार अतिप्रवाह, इस मामले में आप अपने खुद के eval कर सकते हैं() एसक्यूएल सर्वर में फंक्शन।
मैंने फॉर्मूला में 3 मानों के लिए अपना स्वयं का फ़ंक्शन बनाया है जैसे '+', '-', '*', '/'।
समारोह कोड है:
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;
और यह अगले डेटा पर काम करता है:
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
उसके बाद आप स्तंभ मान करके अपने सूत्र में मूल्यों की जगह है और यह गणना कर सकते हैं:
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;
मेरे लिए समय ठीक है, मेरे एसक्यूएल सर्वर 2016 पर 3 मिनट लगते हैं और अच्छे परिणाम प्राप्त करते हैं:
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
यदि आपके पास सूत्र में लागू होने वाले सभी कार्यों की एक सूची है, तो आप कई चर के लिए एक सामान्य कार्य लिख सकते हैं। लेकिन, अगर सूत्र में कुछ और जटिल है, तो सीएलआर का उपयोग किया जाना चाहिए।
आप इसे [कोड समीक्षा] (https://codereview.stackexchange.com/) पर पोस्ट करना चाहते हैं। यह काम करने वाले कोड के लिए बेहतर जगह है जिसे आप तेज़ करना चाहते हैं। –
फॉर्मूला एक गणना कॉलम कार्य करता है? –
आपको अपने 'अपडेट' में बाधाओं की तलाश करनी होगी। क्या आपके पास कोई ट्रिगर्स, इंडेक्स या एफके है? आप किस तरह का अलगाव का उपयोग कर रहे हैं? एक प्रश्न योजना भी देखें। –