<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
		>
<channel>
	<title>Komentarze do: Czy ty też nadużywasz procedur składowanych?</title>
	<atom:link href="http://blog.jendrusz.pl/2009/03/05/czy-ty-tez-naduzywasz-procedur-skladowanych/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.jendrusz.pl/2009/03/05/czy-ty-tez-naduzywasz-procedur-skladowanych/</link>
	<description>Software Development, Agile, Microsoft .NET, Muzyka</description>
	<lastBuildDate>Mon, 23 Nov 2009 19:18:57 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
	<item>
		<title>Autor: zajefajnyx</title>
		<link>http://blog.jendrusz.pl/2009/03/05/czy-ty-tez-naduzywasz-procedur-skladowanych/#comment-50</link>
		<dc:creator>zajefajnyx</dc:creator>
		<pubDate>Mon, 23 Nov 2009 19:18:57 +0000</pubDate>
		<guid isPermaLink="false">http://blog.jendrusz.pl/?p=239#comment-50</guid>
		<description>Chcemy wiecej :D</description>
		<content:encoded><![CDATA[<p>Chcemy wiecej <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: jenrom</title>
		<link>http://blog.jendrusz.pl/2009/03/05/czy-ty-tez-naduzywasz-procedur-skladowanych/#comment-41</link>
		<dc:creator>jenrom</dc:creator>
		<pubDate>Tue, 19 May 2009 12:36:26 +0000</pubDate>
		<guid isPermaLink="false">http://blog.jendrusz.pl/?p=239#comment-41</guid>
		<description>@Robert
Zgodzę się z tobą, że występują sytuacje w których należy korzystać z procedur składowanych, o czym w poście wspominałem . Mimo to uważam, że stosowanie triggerów do wywoływania skomplikowanych reguł biznesowych jest “hardcorowe”, dlatego że czymś takim się bardzo trudno zarządza, w dużych projektach jest wręcz strzałem w własną stopę.

Tworzenie SOA opartego o wspólną baze danych jest moim zdaniem jednym z największych anty wzorców, który prowadzi do jednego wielkiego tzw “Big Bull of Mud”, w którym nie tylko logika (zachowanie) jest “pokręcona”, ale również dane. Spowodowane jest to głównie tym, że różne aplikacje korzystają z tych samych danych w różnym kontekście operacyjnym, co skolei eliminuje możliwość stworzenie wspólnego współdzielonego modelu.

W wątku dotyczącym testowania wskazujesz na rozwiązanie, które moim zdaniem jest tylko zaślepką na kolejny poważny problem, czyli brak automatyzacji testów i brak buildu integrującego. O tym problemie wspominałem już wcześniej. Powracając do twoich argumentów, to chętnie bym się dowiedział skąd masz pewność, że zmiana w jednej procedurze składowanej czy trigerzenie nie może wpływać na inne funkcjonalności całego systemu.

Odnośnie piątego argumentu. Moim zdaniem procedura składowana nie jest gwarantem wydajności. Owszem zgodze się z tobą, że w przypadku wywoływania tzw. jobów możemy zyskać na wydajności ze względu na minimalizację zdalnych zapytań do bazy. W systemach informatycznych przewyższa jednak liczba operacji składających się z pojedynczej transakcji wywołanych przez użytkowników systemu, typu złożenie zamówienia. W tym przypadku liczba zdalnych zapytań jest znikoma i już nie uzyskamy zbyt wielkiego wzrostu wydajności, stosując procedurę składowaną.

@Marian Boczek

Jeżeli jesteś zadowolony z procedur składowanych i nie przeszkadzają ci w codziennej pracy to używaj ich dalej. W innym przypadku rozważ sens wyżej przedstawionych argumentów.

Ja sam swego czasu korzystałem nagminnie z procedur składowanych i myślałem, że jest to super wydajne, elastyczne itd. Dzisiaj jak widać już tak nie jest :)</description>
		<content:encoded><![CDATA[<p>@Robert<br />
Zgodzę się z tobą, że występują sytuacje w których należy korzystać z procedur składowanych, o czym w poście wspominałem . Mimo to uważam, że stosowanie triggerów do wywoływania skomplikowanych reguł biznesowych jest “hardcorowe”, dlatego że czymś takim się bardzo trudno zarządza, w dużych projektach jest wręcz strzałem w własną stopę.</p>
<p>Tworzenie SOA opartego o wspólną baze danych jest moim zdaniem jednym z największych anty wzorców, który prowadzi do jednego wielkiego tzw “Big Bull of Mud”, w którym nie tylko logika (zachowanie) jest “pokręcona”, ale również dane. Spowodowane jest to głównie tym, że różne aplikacje korzystają z tych samych danych w różnym kontekście operacyjnym, co skolei eliminuje możliwość stworzenie wspólnego współdzielonego modelu.</p>
<p>W wątku dotyczącym testowania wskazujesz na rozwiązanie, które moim zdaniem jest tylko zaślepką na kolejny poważny problem, czyli brak automatyzacji testów i brak buildu integrującego. O tym problemie wspominałem już wcześniej. Powracając do twoich argumentów, to chętnie bym się dowiedział skąd masz pewność, że zmiana w jednej procedurze składowanej czy trigerzenie nie może wpływać na inne funkcjonalności całego systemu.</p>
<p>Odnośnie piątego argumentu. Moim zdaniem procedura składowana nie jest gwarantem wydajności. Owszem zgodze się z tobą, że w przypadku wywoływania tzw. jobów możemy zyskać na wydajności ze względu na minimalizację zdalnych zapytań do bazy. W systemach informatycznych przewyższa jednak liczba operacji składających się z pojedynczej transakcji wywołanych przez użytkowników systemu, typu złożenie zamówienia. W tym przypadku liczba zdalnych zapytań jest znikoma i już nie uzyskamy zbyt wielkiego wzrostu wydajności, stosując procedurę składowaną.</p>
<p>@Marian Boczek</p>
<p>Jeżeli jesteś zadowolony z procedur składowanych i nie przeszkadzają ci w codziennej pracy to używaj ich dalej. W innym przypadku rozważ sens wyżej przedstawionych argumentów.</p>
<p>Ja sam swego czasu korzystałem nagminnie z procedur składowanych i myślałem, że jest to super wydajne, elastyczne itd. Dzisiaj jak widać już tak nie jest <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: Marian Boczek</title>
		<link>http://blog.jendrusz.pl/2009/03/05/czy-ty-tez-naduzywasz-procedur-skladowanych/#comment-38</link>
		<dc:creator>Marian Boczek</dc:creator>
		<pubDate>Tue, 19 May 2009 08:01:06 +0000</pubDate>
		<guid isPermaLink="false">http://blog.jendrusz.pl/?p=239#comment-38</guid>
		<description>Naprawdę procedury składowe są aż tak tragiczne? Od zawsze ich używałem i szczerze mówiąc nigdy nie miałem żadnych problemów. Chociaż może rzeczywiście trochę ich nadużywam...</description>
		<content:encoded><![CDATA[<p>Naprawdę procedury składowe są aż tak tragiczne? Od zawsze ich używałem i szczerze mówiąc nigdy nie miałem żadnych problemów. Chociaż może rzeczywiście trochę ich nadużywam&#8230;</p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: Robert</title>
		<link>http://blog.jendrusz.pl/2009/03/05/czy-ty-tez-naduzywasz-procedur-skladowanych/#comment-31</link>
		<dc:creator>Robert</dc:creator>
		<pubDate>Thu, 30 Apr 2009 21:21:16 +0000</pubDate>
		<guid isPermaLink="false">http://blog.jendrusz.pl/?p=239#comment-31</guid>
		<description>Witam, jestem &quot;dinozaurem&quot; (kończyłem studia w 1990, gdy Windows nie był rozpowszechniony), na SP (Informix) zjadłem zęby, więc chciałbym podać kilka argumentów na ich rzecz.
Po pierwsze, są takie zastosowania, gdzie SP to jedyna opcja - gdy coś ma się dziać na triggerze (logowanie zmian, propagacja zmian z jednej tabeli do innej).
Po drugie więzy integralności, np. w systemie obsługi karty kredytowej procedura na triggerze do tabeli kart sprawdza, czy numer karty znajduje się w zakresie, który został podany w parametrach. Często są to bardzo złożone reguły biznesowe.
Po trzecie zasada DRY - skoro do naszej bazy podpięte są programy różnych firm napisane w VB, PowerBuilder, java, .NET, Ab Initio (ETL) to lepiej jest mieć logikę biznesową w procedurach. Jeśli np. zmienimy procedurę liczącą kwotę opłaty okresowej, to wszyscy klienci bazy od razu to uwzględnią - takie mini SOA. W przeciwnym razie musielibyśmy zmieniać kilka różnych aplikacji i ich wdrożenie synchronizować w czasie.
Po czwarte łatwość testowania. Jak zamawiamy u dostawcy oprogramowania drobną zmianę, ale przysyła nam jeden wielki msi, to wiadomo że na pewno spieprzyli coś jeszcze w kodzie, który nie miał być zmieniany. A więc testy regresyjne całej aplikacji  tabunem użytkowników. Kiedy natomiast dostarczają kilka zmienionych procedur bazy, to przynajmniej wiemy że wystarczy przetestować tylko te zmienione procedury.
Po piąte wydajność. W aplikacjach takich jak system autoryzacji transakcji to oczywiście najwyższy priorytet (czyli C i procedury składowane). Ale również i w aplikacjach
mniej krytycznych czasowo to jest ważne. Proces końca dnia liczący opłaty i odsetki - tutaj teoretycznie ORM byłby idealny, bo mamy bardzo złożony model dziedziny. W praktyce nikt tak nie robi. Chodzi nie tylko o wydajność pod względem czasu wykonania, ale też niektórych rzeczy w ORM nie da się zrobić wcale! Typowe przetwarzanie końca dnia to pętla typu (Informix):
  foreach
    select *
    Into r_rachunki.*
    From rachunki
      begin work;
      
     commit work;
 end foreach
Problem w tym, że w klasycznym NHibernate mogę zrobić tylko coś takiego:
  foreach (Account account in Criteria.List())
    - co zabija serwer, bo cała lista rachunków (milion) jest wczytywana do pamięci
albo: Interfejs Enumerable, który przetwarza wprawdzie po jednym rekordzie, ale dla każdego rachunku wykonuje dodatkowy pojedyńczy select. A jest jeszcze transakcja w środku pętli, czyli coomit zamknie kursor po stronie bazy.
ORM nigdy nie będzie rozwiązaniem wydajnym, bo nie działa na zbiorach, np. takie coś w procedurach końca roku:
   update rachunki
     set odsetki_rok_poprzedni = odsetki_aktualne,
           odsetki_aktualne=0
znów zabija ORM&#039;a, bo każdy rachunek zostanie pojedyńczo pobrany z bazy, a potem zapisany.

Tak więc ORM jest dobry dla obsługi niewielkiej liczby obiektów, typowo w aplikacjach webowych. Ułatwia też tworzenie testów jednostkowych (ale to tylko część, i to ta najprostsza całego procesu testowania). Pozwala uniknąć &quot;SQLi w długich stringach&quot;, jednak to ostatnie zapewniają również SP (są tylko &quot;krótkie stringi&quot;, a liczba odwołań do bazy mniejsza).

Wiem, że jestem na wymarciu, pocieszam się że wciąż jednak istnieje mniejszość w IT, która nie może, lub nie chce nawrócić się na rozwiązania czysto obiektowe (o jej istnieniu świadczą  artykuły takie jak &quot;A Database-centric Approach to J2EE Application Development&quot;).</description>
		<content:encoded><![CDATA[<p>Witam, jestem &#8222;dinozaurem&#8221; (kończyłem studia w 1990, gdy Windows nie był rozpowszechniony), na SP (Informix) zjadłem zęby, więc chciałbym podać kilka argumentów na ich rzecz.<br />
Po pierwsze, są takie zastosowania, gdzie SP to jedyna opcja &#8211; gdy coś ma się dziać na triggerze (logowanie zmian, propagacja zmian z jednej tabeli do innej).<br />
Po drugie więzy integralności, np. w systemie obsługi karty kredytowej procedura na triggerze do tabeli kart sprawdza, czy numer karty znajduje się w zakresie, który został podany w parametrach. Często są to bardzo złożone reguły biznesowe.<br />
Po trzecie zasada DRY &#8211; skoro do naszej bazy podpięte są programy różnych firm napisane w VB, PowerBuilder, java, .NET, Ab Initio (ETL) to lepiej jest mieć logikę biznesową w procedurach. Jeśli np. zmienimy procedurę liczącą kwotę opłaty okresowej, to wszyscy klienci bazy od razu to uwzględnią &#8211; takie mini SOA. W przeciwnym razie musielibyśmy zmieniać kilka różnych aplikacji i ich wdrożenie synchronizować w czasie.<br />
Po czwarte łatwość testowania. Jak zamawiamy u dostawcy oprogramowania drobną zmianę, ale przysyła nam jeden wielki msi, to wiadomo że na pewno spieprzyli coś jeszcze w kodzie, który nie miał być zmieniany. A więc testy regresyjne całej aplikacji  tabunem użytkowników. Kiedy natomiast dostarczają kilka zmienionych procedur bazy, to przynajmniej wiemy że wystarczy przetestować tylko te zmienione procedury.<br />
Po piąte wydajność. W aplikacjach takich jak system autoryzacji transakcji to oczywiście najwyższy priorytet (czyli C i procedury składowane). Ale również i w aplikacjach<br />
mniej krytycznych czasowo to jest ważne. Proces końca dnia liczący opłaty i odsetki &#8211; tutaj teoretycznie ORM byłby idealny, bo mamy bardzo złożony model dziedziny. W praktyce nikt tak nie robi. Chodzi nie tylko o wydajność pod względem czasu wykonania, ale też niektórych rzeczy w ORM nie da się zrobić wcale! Typowe przetwarzanie końca dnia to pętla typu (Informix):<br />
  foreach<br />
    select *<br />
    Into r_rachunki.*<br />
    From rachunki<br />
      begin work;</p>
<p>     commit work;<br />
 end foreach<br />
Problem w tym, że w klasycznym NHibernate mogę zrobić tylko coś takiego:<br />
  foreach (Account account in Criteria.List())<br />
    &#8211; co zabija serwer, bo cała lista rachunków (milion) jest wczytywana do pamięci<br />
albo: Interfejs Enumerable, który przetwarza wprawdzie po jednym rekordzie, ale dla każdego rachunku wykonuje dodatkowy pojedyńczy select. A jest jeszcze transakcja w środku pętli, czyli coomit zamknie kursor po stronie bazy.<br />
ORM nigdy nie będzie rozwiązaniem wydajnym, bo nie działa na zbiorach, np. takie coś w procedurach końca roku:<br />
   update rachunki<br />
     set odsetki_rok_poprzedni = odsetki_aktualne,<br />
           odsetki_aktualne=0<br />
znów zabija ORM&#8217;a, bo każdy rachunek zostanie pojedyńczo pobrany z bazy, a potem zapisany.</p>
<p>Tak więc ORM jest dobry dla obsługi niewielkiej liczby obiektów, typowo w aplikacjach webowych. Ułatwia też tworzenie testów jednostkowych (ale to tylko część, i to ta najprostsza całego procesu testowania). Pozwala uniknąć &#8222;SQLi w długich stringach&#8221;, jednak to ostatnie zapewniają również SP (są tylko &#8222;krótkie stringi&#8221;, a liczba odwołań do bazy mniejsza).</p>
<p>Wiem, że jestem na wymarciu, pocieszam się że wciąż jednak istnieje mniejszość w IT, która nie może, lub nie chce nawrócić się na rozwiązania czysto obiektowe (o jej istnieniu świadczą  artykuły takie jak &#8222;A Database-centric Approach to J2EE Application Development&#8221;).</p>
]]></content:encoded>
	</item>
	<item>
		<title>Autor: jenrom</title>
		<link>http://blog.jendrusz.pl/2009/03/05/czy-ty-tez-naduzywasz-procedur-skladowanych/#comment-30</link>
		<dc:creator>jenrom</dc:creator>
		<pubDate>Mon, 30 Mar 2009 09:34:23 +0000</pubDate>
		<guid isPermaLink="false">http://blog.jendrusz.pl/?p=239#comment-30</guid>
		<description>@Darek: Zgodze się z tobą, że tego typu narzędzia pomogą, przy czym ich funkcjonalność nie jest na tak wysokim poziomie jak ich odpowiedników stosowanych w objektówce. Zresztą na to zwróciłem uwagę w poście. 

PS: Automatyczne testowanie bazy jest mało wydajne i problematyczne jest przygotowywanie danych potrzebnych do poprawnego wykonania się testu. Co w głównej mierze zniechęca mnie do używania narzędzi typu Team Edition for DB. Co nie znaczy, że w niektórych przypadkach nie należy tego typu rozwiązania używać. Lepiej wolne testy niż żadne :)</description>
		<content:encoded><![CDATA[<p>@Darek: Zgodze się z tobą, że tego typu narzędzia pomogą, przy czym ich funkcjonalność nie jest na tak wysokim poziomie jak ich odpowiedników stosowanych w objektówce. Zresztą na to zwróciłem uwagę w poście. </p>
<p>PS: Automatyczne testowanie bazy jest mało wydajne i problematyczne jest przygotowywanie danych potrzebnych do poprawnego wykonania się testu. Co w głównej mierze zniechęca mnie do używania narzędzi typu Team Edition for DB. Co nie znaczy, że w niektórych przypadkach nie należy tego typu rozwiązania używać. Lepiej wolne testy niż żadne <img src='http://s.wordpress.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
	</item>
</channel>
</rss>
