{"id":5004,"date":"2018-04-16T13:19:05","date_gmt":"2018-04-16T11:19:05","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=5004"},"modified":"2023-01-30T10:54:00","modified_gmt":"2023-01-30T09:54:00","slug":"dlaczego-sql-server-nie-jest-dobry-w-rozwiazaniach-gdzie-dokladnosc-wynikow-jest-kluczowa","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/dlaczego-sql-server-nie-jest-dobry-w-rozwiazaniach-gdzie-dokladnosc-wynikow-jest-kluczowa\/","title":{"rendered":"Dlaczego SQL Server nie jest dobry w rozwi\u0105zaniach, gdzie dok\u0142adno\u015b\u0107 wynik\u00f3w jest kluczowa?"},"content":{"rendered":"\n<p>Postanowi\u0142em podzieli\u0107 si\u0119 moim do\u015bwiadczeniem po zako\u0144czeniu projektu w obszarze bankowo\u015bci (ryzyko rynkowe), gdzie u\u017cywali\u015bmy SQL Server 2012 EE jako g\u0142\u00f3wnego silnika do wyliczania dw\u00f3ch metryk:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>NPV (Net Present Value) \u2013 wycena produkt\u00f3w bankowych na wybrany moment w czasie<\/li><li>EaR (Earnings at Risk) \u2013 symulacja wyceny produkt\u00f3w bankowych dla r\u00f3\u017cnych scenariuszy zmian st\u00f3p procentowych (KNF)<\/li><\/ul>\n\n\n\n<p>Obie metryki wyliczane s\u0105 na podstawie wolumen\u00f3w bankowych dla r\u00f3\u017cnych produkt\u00f3w (hipoteki, po\u017cyczki, karty kredytowe,..), symulacji st\u00f3p procentowych oraz specyficznego czynnika dyskontuj\u0105cego dobranego do charakterystyki produktu. Wszystkie obliczenia wykonywane by\u0142y na podstawie wzor\u00f3w finansowych dostarczonych prze klienta i wymaga\u0142y du\u017cej dok\u0142adno\u015bci wynik\u00f3w (do 13 miejsc po prawej stronie separatora dziesi\u0119tnego). W bazie przechowywali\u015bmy bardzo du\u017ce liczby oraz bardzo ma\u0142e z du\u017c\u0105 precyzj\u0105 (skal\u0105), wi\u0119c musieli\u015bmy okre\u015bli\u0107 sp\u00f3jny typ danych dla wszystkich warto\u015bci. Niestety nie wiedzieli\u015bmy jakich warto\u015bci mo\u017cemy si\u0119 dok\u0142adnie spodziewa\u0107 dla wybranych kolumn, wi\u0119c musieli\u015bmy wybra\u0107 uniwersalny typ numeryczny, kt\u00f3ry pozwoli przechowywa\u0107 w tej samej kolumnie bardzo ma\u0142\u0105 i du\u017c\u0105 liczb\u0119 (0.6738230988 lub 238947783.21). Pad\u0142o na typ decimal(25,13) dla procesu NPV i decimal(38,10) dla procesu EaR, \u017ceby pokry\u0107 wszystkie przypadki i by\u0107 sp\u00f3jnym z centraln\u0105 DWH klient zarz\u0105dzan\u0105 na Oracle.<\/p>\n\n\n\n<p>I tutaj zaczynaj\u0105 si\u0119 problemy, poniewa\u017c SQL Server (w tym przypadku wersja 2012) nie jest dobry w obliczeniach i trzeba by\u0107 bardzo \u015bwiadomym, jak operacje mno\u017cenia \/ dzielenia wykonywane s\u0105 przez silnik bazodanowy, \u017ceby uchroni\u0107 si\u0119 przed utrat\u0105 precyzji danych (skali), co w konsekwencji doprowadza do du\u017cych przek\u0142ama\u0144 w finalnych wynikach.<\/p>\n\n\n\n<p>Ca\u0142\u0105 logik\u0119 mo\u017cna znale\u017a\u0107 na stronie Microsoft i radz\u0119 ka\u017cdemu dobrze si\u0119 zapozna\u0107 z tym artyku\u0142em, je\u017celi w Waszym projekcie dok\u0142adno\u015b\u0107 oblicze\u0144 jest kluczowa!<br><a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/t-sql\/data-types\/precision-scale-and-length-transact-sql\" rel=\"nofollow\" >https:\/\/docs.microsoft.com\/en-us\/sql\/t-sql\/data-types\/precision-scale-and-length-transact-sql<\/a><\/p>\n\n\n\n<p>Zacznijmy od prostego przyk\u0142adu.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/1.png\"><img decoding=\"async\" width=\"333\" height=\"348\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/1.png\" alt=\"Pierwsze dzia\u0142anie\" class=\"wp-image-19040\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/1.png 333w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/1-287x300.png 287w\" sizes=\"(max-width: 333px) 100vw, 333px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Dostajemy wynik 0.000003 zamiast warto\u015bci jak w poni\u017cszym przyk\u0142adzie Excel.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/2.png\"><img decoding=\"async\" width=\"429\" height=\"74\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/2.png\" alt=\"Drugie dzia\u0142anie - precyzja\" class=\"wp-image-19042\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/2.png 429w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/2-300x52.png 300w\" sizes=\"(max-width: 429px) 100vw, 429px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Dlaczego SQL Server nie u\u0142atwia nam zadania i nie zadba o prawid\u0142ow\u0105 precyzj\u0119, skal\u0119 wynik\u00f3w dla typu decimal? Niestety je\u017celi dodajesz, odejmujesz, a w szczeg\u00f3lno\u015bci mno\u017cysz i dzielisz liczby decimal, musisz liczy\u0107 si\u0119 z tym, \u017ce SQL Server zwr\u00f3ci zaokr\u0105glony wynik lub wynik z inna precyzj\u0105 (p) i skal\u0105 (s) ni\u017c mog\u0142oby to wynika\u0107 z danych wej\u015bciowych.<\/p>\n\n\n\n<p>W powy\u017cszym przypadku SQL Server wykonuje nast\u0119puj\u0105ce operacje, \u017ceby wykona\u0107 proste dzielenie dw\u00f3ch liczb decimal(p,s):<\/p>\n\n\n\n<p>1.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Wyznacza liczb\u0119 cyfr dla precyzji wed\u0142ug wzoru: p1-s1+s2+max(6,s1+p2+1).<br>W naszym przypadku p=87<br>2.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Wyznacza liczb\u0119 cyfr dla skali wed\u0142ug wzoru: max(6,s1+p2+1).<br>W naszym przypadku s = 47<br>3.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nast\u0119pnie wyznacza cz\u0119\u015b\u0107 ca\u0142kowit\u0105 wed\u0142ug wzoru: p-s<br>W naszym przypadku jest to 40<br>4.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Nast\u0119pnie sprawdzane s\u0105 nast\u0119puj\u0105ce warunki w celu finalnego wyznaczenia precyzji i skali (jak mocno SQL Server musi uci\u0105\u0107 dok\u0142adno\u015b\u0107 wynik\u00f3w po separatorze dziesi\u0119tnym):<br>a.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Je\u017celi cz\u0119\u015b\u0107 ca\u0142kowita jest &lt; 32 to s=min(s,38\u2013(p-s)). Wynik mo\u017ce zosta\u0107 zaokr\u0105glony.<br>b.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Je\u017celi s &lt;= 6 i p &gt; 32 nic nie robimy ze skal\u0105. Mo\u017cemy dosta\u0107 b\u0142\u0105d \u201eArithmetic overflow error converting numeric to data type numeric\u201d je\u017celi wynik dzia\u0142ania nie pasuje do decimal(38,s)<br>c.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Je\u017celi s &gt; 6 i p &gt; 32 to skala jest redukowana do 6 (zaokr\u0105glona do 6 miejsc po separatorze dziesi\u0119tnym). Mo\u017cemy dosta\u0107 b\u0142\u0105d \u201eArithmetic overflow error converting numeric to data type numeric\u201d je\u017celi cz\u0119\u015b\u0107 ca\u0142kowita jest wi\u0119ksza od 32 znak\u00f3w.<\/p>\n\n\n\n<p>W naszym przypadku mamy punkt (c), czyli dostajemy wynik decimal(38,6), czyli 0.000003<\/p>\n\n\n\n<p>\u017beby to naprawi\u0107 musimy zmieni\u0107 typ danych decimal na bardziej dok\u0142adny dla tych dw\u00f3ch warto\u015bci.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/3.png\"><img decoding=\"async\" width=\"343\" height=\"329\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/3.png\" alt=\"Trzecie dzia\u0142anie - zmiana typu\" class=\"wp-image-19044\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/3.png 343w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/3-300x288.png 300w\" sizes=\"(max-width: 343px) 100vw, 343px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Dobieranie prawid\u0142owej precyzji, skali dla decimal mo\u017ce by\u0107 kluczowe dla poprawno\u015bci wykonywanych oblicze\u0144 i dok\u0142adno\u015bci wynik\u00f3w. Co je\u017celi nie wiemy jakich warto\u015bci mo\u017cemy si\u0119 spodziewa\u0107 w kolumnach? U\u017cywanie typ\u00f3w przybli\u017conych&nbsp; w SQL Server jak float mo\u017ce dawa\u0107 bardzo nieprecyzyjne wyniki i jest odradzane w aplikacjach finansowych (szczeg\u00f3lnie, \u017ce warto\u015b\u0107 0 mo\u017ce by\u0107 przybli\u017cone bardzo ma\u0142\u0105 warto\u015bci\u0105 ). Inna opcja to napisa\u0107 w\u0142asny CLR do wykonywania precyzyjnych oblicze\u0144.<\/p>\n\n\n\n<p>Drugi przyk\u0142ad demonstruje krok po\u015bredni liczenia \u201eforward rate\u201d w logice symulacji st\u00f3p procentowych. Wynik powinien by\u0107 bardzo dok\u0142adny i spodziewamy si\u0119 13 miejsc po separatorze dziesi\u0119tnym po wykonaniu oblicze\u0144:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/4.png\"><img decoding=\"async\" width=\"1024\" height=\"418\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/4-1024x418.png\" alt=\"Czwarte dzia\u0142anie - ca\u0142y kod\" class=\"wp-image-19046\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/4-1024x418.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/4-300x122.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/4-768x313.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/4.png 1289w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Niestety wynik znowu zosta\u0142 zaokr\u0105glony do 6 miejsc po separatorze dziesi\u0119tnym i trudno powiedzie\u0107 jak zmodyfikowa\u0107 dzia\u0142anie, \u017ceby otrzyma\u0107 lepsz\u0105 dok\u0142adno\u015b\u0107 wyniku bez zmiany typu danych dla parametr\u00f3w wej\u015bciowych.<\/p>\n\n\n\n<p>Dzia\u0142anie sk\u0142ada si\u0119 z dw\u00f3ch kalkulacji:<br>(@value3+((@iterator-13)\/@const)*(@value1-@value3)) \u2013 zwracany typ decimal(38,6)<br>power((1\/(1+@value2\/@const1)),@sumIterator-3) \u2013 zwracany typ decimal(38,24)<\/p>\n\n\n\n<p>Je\u017celi teraz pomno\u017cymy decimal(38,6) *decimal(38,24) to faktycznie dostaniemy typu decimal(38,6) jako wynik tego dzia\u0142ania zgodnie z logik\u0105 opisan\u0105 przez Microsoft. Zak\u0142adamy, \u017ce dok\u0142adno\u015b\u0107 dw\u00f3ch wynik\u00f3w po\u015brednich jest zadowalaj\u0105ca i chcemy finalny wynik mno\u017cenia dosta\u0107 jako decimal(25,13). Co robimy? Ano kombinujemy.<\/p>\n\n\n\n<p>Rzucamy pierwsz\u0105 operacj\u0119 na typ decimal(25,13), \u017ceby zredukowa\u0107 typ decimal(38,6)<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/5-1024x98-1.png\"><img decoding=\"async\" width=\"1024\" height=\"98\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/5-1024x98-1.png\" alt=\"Pi\u0105te dzia\u0142anie - precyzja b\u0142\u0105d\" class=\"wp-image-19049\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/5-1024x98-1.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/5-1024x98-1-300x29.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/5-1024x98-1-768x74.png 768w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Wynik wygl\u0105da lepiej, ale to jeszcze nie jest dok\u0142adno\u015b\u0107 wyniku, o jak\u0105 nam chodzi.<\/p>\n\n\n\n<p>Rzucamy drug\u0105 operacj\u0119 na typ decimal(25,13), \u017ceby zredukowa\u0107 typ decimal(38,24)<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/6.png\"><img decoding=\"async\" width=\"1024\" height=\"95\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/6-1024x95.png\" alt=\"Sz\u00f3ste dzia\u0142anie - dodatkowe castowanie\" class=\"wp-image-19051\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/6-1024x95.png 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/6-300x28.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/6-768x71.png 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/6.png 1382w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Finalnie wynik wygl\u0105da poprawnie i jest to dok\u0142adno\u015b\u0107, jak\u0105 mo\u017cemy dosta\u0107 w Excel wykonuj\u0105c podobn\u0105 operacj\u0119 (finanse zawsze por\u00f3wnuj\u0105 si\u0119 do wynik\u00f3w z Excel).<\/p>\n\n\n\n<p>Czyli wygl\u0105da, \u017ce w tym wypadku decimal(25,13)*decimal(25,13) daje nam decimal(25,13) poniewa\u017c:<br>P=51, S=26, P-S=25, P-S&lt;32 wi\u0119c S=min(26, 38 \u2013 (51-26)) = 13<\/p>\n\n\n\n<p>Na koniec zagadka do rozwi\u0105zania.<\/p>\n\n\n\n<p>Dlaczego result1 != result2 mimo, \u017ce jedyna r\u00f3\u017cnica w dw\u00f3ch dzia\u0142aniach to kolejno\u015b\u0107 wykonywania mno\u017cenia, kt\u00f3re teoretycznie nie powinno zmieni\u0107 wyniku.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/7.png\"><img decoding=\"async\" width=\"930\" height=\"240\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/7.png\" alt=\"Si\u00f3dme dzia\u0142anie - formu\u0142a\" class=\"wp-image-19053\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/7.png 930w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/7-300x77.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/7-768x198.png 768w\" sizes=\"(max-width: 930px) 100vw, 930px\" \/><\/a><\/figure><\/div>\n\n\n\n<p>Kt\u00f3ry wynik jest prawid\u0142owy? Jak wykrywa\u0107 takie b\u0142\u0119dy w kodzie, je\u017celi kolumny maj\u0105 ten sam typ i nie bardzo wiemy, jakich warto\u015bci mo\u017cemy si\u0119 spodziewa\u0107 w kolumnach? Dlaczego Excel daje prawid\u0142owy wynik niezale\u017cnie od kolejno\u015bci wykonywania mno\u017cenia?<\/p>\n\n\n\n<p>Poni\u017cej kod, kt\u00f3ry pomo\u017ce przygotowa\u0107 dane.<\/p>\n\n\n\n<p>if object_id(\u2019tempdb..#test\u2019) is not null<br>drop table #test<br>select * into #test<br>from<br>(<br>select cast(1.8100000000000 as decimal(25,13)) forwardRateForInterest,<br>cast(0.0000000000000 as decimal(25,13)) Additiv_Mrgn_Pnt,<br>cast(100.0000000000000 as decimal(25,13)) cnt1,<br>cast(100.0000000000000 as decimal(25,13)) cnt2,<br>cast(0.5013698630137 as decimal(25,13)) YF_I,<br>cast(17300000.0000000000000 as decimal(25,13)) Nom_PLN)a<br>\u2013select name, type_name(system_type_id) type, precision, scale<br>\u2013from tempdb.sys.columns where [object_id] = object_id(N\u2019tempdb..#test\u2019);<\/p>\n\n\n\n<p>select<br>((forwardRateForInterest + Additiv_Mrgn_Pnt\/cnt1)\/cnt2) * Nom_PLN*YF_I result1,<br>((forwardRateForInterest + Additiv_Mrgn_Pnt\/cnt1)\/cnt2) * YF_I*Nom_PLN result2<br>from #test<\/p>\n\n\n\n<p>Podsumowuj\u0105c:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Zapoznaj si\u0119 z artyku\u0142em&nbsp;<a href=\"https:\/\/docs.microsoft.com\/en-us\/sql\/t-sql\/data-types\/precision-scale-and-length-transact-sql\" rel=\"nofollow\" >https:\/\/docs.microsoft.com\/en-us\/sql\/t-sql\/data-types\/precision-scale-and-length-transact-sql<\/a>&nbsp;\u017ceby by\u0107 \u015bwiadomym jak SQL Server ustala typ danych dla wynik\u00f3w dzia\u0142a\u0144 arytmetycznych.<\/li><li>Je\u017celi jest to mo\u017cliwe, u\u017cywaj bardzo precyzyjnych typ\u00f3w danych. Precyzja i skala typu decimal powinna by\u0107 dobrana pod rzeczywiste dane.<\/li><li>Uwa\u017caj na typ float, kt\u00f3ry przechowuje przybli\u017cone warto\u015bci liczb (0 mo\u017ce nie by\u0107 zerem).<\/li><li>Je\u017celi jest to mo\u017cliwe, bardzo skomplikowane obliczenia wykonuj w CLR.<\/li><li>Z\u0142o\u015bliwi koledzy z pokoju radz\u0105 zacz\u0105\u0107 u\u017cywa\u0107 Oracle, kt\u00f3ry lepiej radzi sobie z liczbami i operacjami arytmetycznymi.<\/li><\/ul>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;5004&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;6&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5 ( votes: 6)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Dlaczego SQL Server nie jest dobry w rozwi\u0105zaniach, gdzie dok\u0142adno\u015b\u0107 wynik\u00f3w jest kluczowa?&quot;,&quot;width&quot;:&quot;139.5&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 139.5px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            5\/5 ( votes: 6)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Postanowi\u0142em podzieli\u0107 si\u0119 moim do\u015bwiadczeniem po zako\u0144czeniu projektu w obszarze bankowo\u015bci (ryzyko rynkowe), gdzie u\u017cywali\u015bmy SQL Server 2012 EE jako &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/dlaczego-sql-server-nie-jest-dobry-w-rozwiazaniach-gdzie-dokladnosc-wynikow-jest-kluczowa\/\">Continued<\/a><\/p>\n","protected":false},"author":147,"featured_media":15265,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1316],"tags":[545,546,544,441],"class_list":["post-5004","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-miekko","tag-decimal-sql-server","tag-dokladnosc-obliczen","tag-precyzja-danych-sql-server","tag-sql-server"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2018\/04\/BlogersiiCovery-SQL.jpg","category_names":["Development na mi\u0119kko"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/5004"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/147"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=5004"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/5004\/revisions"}],"predecessor-version":[{"id":19055,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/5004\/revisions\/19055"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/15265"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=5004"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=5004"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=5004"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}