<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>Soci blog</title>
	<atom:link href="http://soci.hu/blog/index.php/feed/" rel="self" type="application/rss+xml" />
	<link>http://soci.hu/blog</link>
	<description>Az ember kivételével minden állat tudja, hogy a legfontosabb dolgunk az életben: élvezni azt.</description>
	<pubDate>Wed, 09 May 2012 18:28:03 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.6</generator>
	<language>en</language>
			<item>
		<title>Rss2Mobi: Google Reader -&gt; .mobi</title>
		<link>http://soci.hu/blog/index.php/2012/05/07/rss2mobi-google-reader-mobi/</link>
		<comments>http://soci.hu/blog/index.php/2012/05/07/rss2mobi-google-reader-mobi/#comments</comments>
		<pubDate>Mon, 07 May 2012 12:14:16 +0000</pubDate>
		<dc:creator>Soczó Zsolt</dc:creator>
		
		<category><![CDATA[Szakmai élet]]></category>

		<guid isPermaLink="false">http://soci.hu/blog/?p=1243</guid>
		<description><![CDATA[Mióta van Kindle DX-en nem vagyok hajlandó képernyőről olvasni (pedig 32&#8243;-os, van rajta hely).
Amit rá tudok tolni Kindle-re, arról tudok, másról nem.
Sima könyveket, whitepaperöket Calibre-vel töltök fel rá.
Az msdn és technet magazinokhoz nemrég írtam (mármint nem én írtam, a csak itt a blogban írtam róla) egy kis letöltő programról.
Ami hiányzott még, az a blogok olvasása [...]]]></description>
			<content:encoded><![CDATA[<p>Mióta van Kindle DX-en nem vagyok hajlandó képernyőről olvasni (pedig 32&#8243;-os, van rajta hely).<br />
Amit rá tudok tolni Kindle-re, arról tudok, másról nem.<br />
Sima könyveket, whitepaperöket Calibre-vel töltök fel rá.<br />
Az msdn és technet magazinokhoz nemrég írtam (mármint nem én írtam, a csak itt a blogban <a href="http://soci.hu/blog/index.php/2012/04/30/msdn-magazine-kindle-re/">írtam</a> róla) egy kis letöltő programról.<br />
Ami hiányzott még, az a blogok olvasása Kindle-lel.<br />
Az <a href="https://github.com/ghewgill/rss2mobi">rss2mobi</a> egy kis python programocska, amivel le lehet tölteni a Google Readerbe betárazott feedeket. Egyelőre még nem teljesen komfortos a kimenete (sok lap a tartalom, amire nincs szükségem), de határozottan jó, ha van kis szabad időm, akkor olvashatok némi blogot. Kicsit majd átszabom, legalább látok pythont. Like. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://soci.hu/blog/index.php/2012/05/07/rss2mobi-google-reader-mobi/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL Server 2012 újdonságok - 4. FORCESEEK, FORCESCAN hintek</title>
		<link>http://soci.hu/blog/index.php/2012/05/07/sql-server-2012-ujdonsagok-3-forceseek-forcescan-hintek/</link>
		<comments>http://soci.hu/blog/index.php/2012/05/07/sql-server-2012-ujdonsagok-3-forceseek-forcescan-hintek/#comments</comments>
		<pubDate>Mon, 07 May 2012 10:01:08 +0000</pubDate>
		<dc:creator>Soczó Zsolt</dc:creator>
		
		<category><![CDATA[ATL]]></category>

		<category><![CDATA[Ad]]></category>

		<category><![CDATA[Adatbázisok]]></category>

		<category><![CDATA[Blog]]></category>

		<category><![CDATA[Csillagászat]]></category>

		<category><![CDATA[SQL Server]]></category>

		<category><![CDATA[SQL Server 2008]]></category>

		<category><![CDATA[SQL Server 2008 R2]]></category>

		<category><![CDATA[SQL Server 2012]]></category>

		<category><![CDATA[Szakmai élet]]></category>

		<category><![CDATA[Vista]]></category>

		<guid isPermaLink="false">http://soci.hu/blog/?p=1230</guid>
		<description><![CDATA[A FORCESEEK hint SQL Server 2008 óta létezik. Ezzel azt lehet súgni a query optimizernek, hogy egy lekérdezés kiértékelése során inkább használjon nonclustered index seeket, table vagy clustered index scan helyett. Ez ekkor hasznos, ha egy paraméterezett lekérdezés a tipikus paraméterekre kevés sort ad vissza, így a nonclustered index seek az optimális adatelérő stratégia, de [...]]]></description>
			<content:encoded><![CDATA[<p>A FORCESEEK hint SQL Server 2008 óta létezik. Ezzel azt lehet súgni a query optimizernek, hogy egy lekérdezés kiértékelése során inkább használjon nonclustered index seeket, table vagy clustered index scan helyett. Ez ekkor hasznos, ha egy paraméterezett lekérdezés a tipikus paraméterekre kevés sort ad vissza, így a nonclustered index seek az optimális adatelérő stratégia, de időnként becsusszannak olyan paraméterek is, amelyek scant igényelnek, mert már nem éri meg a sok indirekt adatelérés, ami a nonclustered index seek velejárója. Ilyenkor a szerver helyesen scant választ, azaz inkább lineáris kereséssel végigmegy az egész táblán. Mivel a szerver eltárolja és újrahasznosítja a végrehajtási terveket, ha pont elsőre egy ilyen terv generálódott, akkor a további lekérdezéseket is ezzel hajtja végre. Ez azonban nem optimális sebességet ad a tipikus, pár sort visszahozó lekérdezésekre. Ezt a bizonytalanságot tudja stabilizálni a FORCESEEK hint. A hint hatására szívesebben használja a nonclustered index seeket az SQL Server. Ez rossz hatással lesz az atipikus, ritkán beeső, de sok sort visszaadó lekérdezésekre, de a tipikus, kevés sort visszaadókra stabilabb tervet és válaszidőket kapunk.<br />
SQL Server 2012-ben a FORCESEEK újdonsága, hogy meg lehet adni egy összetett index oszlopait vagy azok egy részhalmazát, hogy pontosabban specifikáljuk, mely index oszlopokat szeretnénk, ha használná az optimizer.<br />
Nézzünk egy példát. Van egy új akciója az internetes kutyatápboltnak, a Bodri májkonzerv, amely 2-es SpecialOfferID-val fut, és szeretnénk másodpercenként frissítve látni egy 50 colos plazma képernyőn azokat az megrendeléseket, amelyben 10-nél több dobozzal rendeltek. A lekérdezésnek nagyon hatékonynak kell lenni, de nem akarunk új indexet létrehozni a táblákon.<br />
Adott egy ilyen index a SalesOrderDetail táblán:</p>
<pre name="code" class="sql">

CREATE NONCLUSTERED INDEX IX_Comp1
ON Sales.SalesOrderDetail (OrderQty, SpecialOfferID, UnitPrice);
</pre>
<p>A lekérdezés így néz ki:</p>
<pre name="code" class="sql">

select * from [Sales].[SalesOrderDetail]
where OrderQty = 10 and SpecialOfferID = 2;
</pre>
<p>Az SQL Server által választott végrehajtási terv NEM használja a fenti indexet, Clustered Index Scant használ:</p>
<p><a href="http://soci.hu/blog/wp-content/uploads/2012/05/planwithscan.png"><img src="http://soci.hu/blog/wp-content/uploads/2012/05/planwithscan.png" alt="" title="Plan with scan" width="500" height="45" class="aligncenter size-full wp-image-1231" /></a></p>
<p>A lekérdezés becsült költsége 1.18mp, és 1240 logikai IO művelettel, 8 kByte-os lap olvasásával oldotta meg a szerver (végignézte a teljes táblát).<br />
A FORCESEEK eddig is ismert alakjával rávehetjük az indexünk használatára:</p>
<pre name="code" class="sql">

select * from [Sales].[SalesOrderDetail]
with(forceseek)
where OrderQty = 10 and SpecialOfferID = 2;
</pre>
<p><a href="http://soci.hu/blog/wp-content/uploads/2012/05/planwithpartialseek.png"><img src="http://soci.hu/blog/wp-content/uploads/2012/05/planwithpartialseek.png" alt="" title="Plan with partial seek" width="500" height="83" class="aligncenter size-full wp-image-1233" /></a></p>
<p>A Properties ablakban megnézve azonban látszik, hogy az Index Seek műveletben csak az OrderQty oszlopra használta ki az indexet, pedig a lekérdezésben benne van egy másik szűrt oszlop is:</p>
<pre name="code" class="sql">

Seek Keys[1]: Prefix: [AdventureWorks2012].[Sales].[SalesOrderDetail].OrderQty = Scalar Operator((10))
</pre>
<p>Ennek becsült költsége 1.91mp, azaz a FORCESEEK hinttel csak rontottunk a dolgon, az IO is felment 2365-re. Ennek oka, hogy mivel csak az OrderQty-re szűrt az indexben, a szűrés után még elő kell venni az adatsorokat (Key Lookup, 768 sor), és azokat tovább szűrni a SpecialOfferID = 2 feltételre (Filter operátor).</p>
<p>Az SQL Server 2012-ben kibővített FORCESEEK-kel (amúgy 2008R2 SP1-ben is benne van) meg lehet mondani a szervernek, hogy márpedig próbálja meg használni az indexet mindkét oszlop szűrésére:</p>
<pre name="code" class="sql">

select * from [Sales].[SalesOrderDetail]
with(forceseek (IX_Comp1 (OrderQty, SpecialOfferID)))
where OrderQty = 10 and SpecialOfferID = 2;
</pre>
<p><a href="http://soci.hu/blog/wp-content/uploads/2012/05/planwithfullseek.png"><img src="http://soci.hu/blog/wp-content/uploads/2012/05/planwithfullseek.png" alt="" title="Plan with full seek" width="500" height="97" class="aligncenter size-full wp-image-1234" /></a></p>
<p>A végrehajtási tervből eltűnt a Filter, ami jó jel, az Index Seek szűrése pedig magában foglalja mindkét oszlopot:</p>
<pre name="code" class="sql">

Seek Keys[1]: Prefix: [AdventureWorks2012].[Sales].[SalesOrderDetail].OrderQty, [AdventureWorks2012].[Sales].[SalesOrderDetail].SpecialOfferID = Scalar Operator((10)), Scalar Operator((2))
</pre>
<p>Az így kapott lekérdezés becsült költsége továbbra is 1.91mp, azonban az IO leesett 4-re! Az eredeti 1240 helyett 4 lett az IO, azaz több mint 300-ad részére csökkent!<br />
A végső verdiktet az mondja ki, hogy ha megmérjük a tényleges végrehajtási időket. 10000 végrehajtás alapján az első, hint nélküli lekérdezés ideje 238mp, az egyszerű hinttel 38mp, az új hinttel 2mp.<br />
120-szoros gyorsulást értünk el az új hint formátummal!</p>
<p>A FORCESCAN teljesen új hint, ezzel scanre vehetjük rá a szervert akkor is, ha seekelne magától. Ennek haszna akkor van, ha tudjuk, hogy a lekérdezés sok sor érint, ezért a seek nem lenne optimális, így mindenképpen scant akarunk. időnként miért választ az SQL Server mégis seeket? Vagy, mert nem frissek a statisztikái, ezért kevés sort vár el, vagy, mert valami oknál fogva nem tudja jól megbecsülni a várható sorok számát. Főleg join-os lekérdezéseknél nehéz a dolga, mert az oszlopszintű eloszlási statisztikáit ilyenkor nem lehet pontosan használni.<br />
Az ilyen eseteket könnyű megismerni, mert ilyenkor Index Seek-et használó Nested Loop Joinokat hajt végre a szerver sok ezer vagy millió soron, Hash Join helyett. Ezekben az esetekben a FORCESCAN hinttel rá lehet venni, hogy inkább ne használjon indexet, ne szaladjon neki sokszor a táblának, hanem inkább egyszer menjen végig az egész táblán, mert a még mindig kisebb költségű.<br />
Nem csak joinos lekérdezéseknél, hanem sima szűréseknél is előfordulhat, hogy rosszul becsüli meg a szerver a feldolgozandó sorok számát, így seekel scan helyett, akkor stabilizálhatjuk a tervet, hogy mindig scant használjon a FORCESCAN hinttel.<br />
Összegezve, ha tudjuk, hogy a seek vagy a scan előnyös a lekérdezésünknek, akkor határozottá tehetjük a várakozásunkat a szerver felé, ezáltal kiszámíthatóbb tervet, így kiszámíthatóbb válaszidőket kapunk.</p>
<p>Update  a cikkhez: amikor a fenti demót írtam, akkor még csak RC1 volt. Miután upgradeltem az RTM-re, hirtelen magától is tudta a jó tervet, nem kellett hint. Vagy okosodott, vagy csak nem voltak frissek a statisztikák, amikor a demót írtam. Az elv mindenesetre látszik a cikkből, és örülünk, ha a szerver okos. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://soci.hu/blog/index.php/2012/05/07/sql-server-2012-ujdonsagok-3-forceseek-forcescan-hintek/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MSDN Magazine Kindle-re</title>
		<link>http://soci.hu/blog/index.php/2012/04/30/msdn-magazine-kindle-re/</link>
		<comments>http://soci.hu/blog/index.php/2012/04/30/msdn-magazine-kindle-re/#comments</comments>
		<pubDate>Mon, 30 Apr 2012 17:44:05 +0000</pubDate>
		<dc:creator>Soczó Zsolt</dc:creator>
		
		<category><![CDATA[Szakmai élet]]></category>

		<guid isPermaLink="false">http://soci.hu/blog/?p=1228</guid>
		<description><![CDATA[Ez a kis program letölti és átkonvertálja mobira. Hasznos, aranyos.
]]></description>
			<content:encoded><![CDATA[<p>Ez a kis <a href="http://msdnmagazineonkindle.codeplex.com/">program</a> letölti és átkonvertálja mobira. Hasznos, aranyos.</p>
]]></content:encoded>
			<wfw:commentRss>http://soci.hu/blog/index.php/2012/04/30/msdn-magazine-kindle-re/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL Server 2012 újdonságok - 3. Paging</title>
		<link>http://soci.hu/blog/index.php/2012/04/18/sql-server-2012-ujdonsagok-3-paging/</link>
		<comments>http://soci.hu/blog/index.php/2012/04/18/sql-server-2012-ujdonsagok-3-paging/#comments</comments>
		<pubDate>Wed, 18 Apr 2012 08:14:09 +0000</pubDate>
		<dc:creator>Soczó Zsolt</dc:creator>
		
		<category><![CDATA[Adatbázisok]]></category>

		<category><![CDATA[SQL Server]]></category>

		<category><![CDATA[SQL Server 2012]]></category>

		<category><![CDATA[Szakmai élet]]></category>

		<guid isPermaLink="false">http://soci.hu/blog/?p=1221</guid>
		<description><![CDATA[A legtöbb alkalmazás tartalmaz olyan funkciót, amelyekben rendezett, nagy eredményhalmazokat kell kisebb darabokban, lapozva megjeleníteni. Gondoljunk pl. a keresés funkcióra, amikben ha sok eredmény jönne vissza, nem zúdítjuk azt az alkalmazás nyakába, csak megmutatjuk az első például 10 eredményt, majd lehetőséget biztosítunk a felhasználóknak, hogy megnézhessék a 11-20. eredményt, stb.
Általában ezt nagy eredményhalmaz egy kis [...]]]></description>
			<content:encoded><![CDATA[<p>A legtöbb alkalmazás tartalmaz olyan funkciót, amelyekben rendezett, nagy eredményhalmazokat kell kisebb darabokban, lapozva megjeleníteni. Gondoljunk pl. a keresés funkcióra, amikben ha sok eredmény jönne vissza, nem zúdítjuk azt az alkalmazás nyakába, csak megmutatjuk az első például 10 eredményt, majd lehetőséget biztosítunk a felhasználóknak, hogy megnézhessék a 11-20. eredményt, stb.<br />
Általában ezt nagy eredményhalmaz egy kis részének megjelenítését hívják lapozási feladatnak. Korábbi SQL Server verziókban erre többféle megoldást is használtunk. Lehetett alkalmazni szerveroldali kurzorokat, trükkös egymásba ágyazott ORDER BY-os és TOP-os lekérdezéseket, SQL Server 2005-től a ROW_NUMBER sorszámgeneráló függvényt WHERE megállási feltétellel kombinálva, ínyenceknek CTE-be csomagolva. Ahogy haladtunk előre az újabb SQL Server verziók felé, úgy lett egyre egyszerűbb ilyen lekérdezéseket írni.<br />
Az SQL Server 2012-re kialakult az a formátum, aminél már valószínűleg nem lehet tovább egyszerűsíteni a feladat megoldását.<br />
Az ORDER BY kiegészült a lapozást lehetővé tevő új elemekkel: ORDER BY OFFSET n ROWS és FETCH NEXT n ROWS ONLY. A n érték lehet változó vagy paraméter is, így paraméterezett tárolt eljárásokban is kényelmesen használható a lapozás.<br />
Például az AdventureWorks2012 adatbázis Person táblájából ha leválogatjuk az A betűvel kezdődő keresztnevű személyeket, akkor 2014 sort kapunk vissza:</p>
<pre name="code" class="sql">

SELECT FirstName, LastName, BusinessEntityID
FROM [AdventureWorks2012].[Person].[Person]
where FirstName like &#039;A%&#039;
order by FirstName, LastName;
</pre>
<p>Az első 33 sor:<br />
<a href="http://soci.hu/blog/wp-content/uploads/2012/04/persontable.png"><img src="http://soci.hu/blog/wp-content/uploads/2012/04/persontable.png" alt="" title="Person Table" class="aligncenter size-full wp-image-1222" /></a></p>
<p>Ennyit nem biztos, hogy a felhasználók nyakába szeretnénk önteni, de könnyedén visszaadhatjuk lapozva is az eredményeket:</p>
<pre name="code" class="sql">

SELECT FirstName, LastName, BusinessEntityID
FROM [AdventureWorks2012].[Person].[Person]
where FirstName like &#039;A%&#039;
order by FirstName, LastName
offset 20 rows
fetch next 10 rows only;
</pre>
<p>A lapozott eredményhalmaz:<br />
<a href="http://soci.hu/blog/wp-content/uploads/2012/04/persontablepaged.png"><img src="http://soci.hu/blog/wp-content/uploads/2012/04/persontablepaged.png" alt="" title="Person Table Paged" class="alignnone size-full wp-image-1224" /></a></p>
<p>Látható, hogy Aaron Foster található az első sorban, ő volt a 21. az eredeti eredményhalmazban.<br />
A lekérdezés végrehajtási terve közel azonos egy TOP operátoros lekérdezés végrehajtási tervével (ami természetes, hisz egy top művelet van a háttérben, csak előtte van egy skip is), így a már ismert elvek alapján indexekkel könnyen optimalizálható a SELECT végrehajtása.</p>
]]></content:encoded>
			<wfw:commentRss>http://soci.hu/blog/index.php/2012/04/18/sql-server-2012-ujdonsagok-3-paging/feed/</wfw:commentRss>
		</item>
		<item>
		<title>NHibernate futures</title>
		<link>http://soci.hu/blog/index.php/2012/03/31/nhibernate-futures/</link>
		<comments>http://soci.hu/blog/index.php/2012/03/31/nhibernate-futures/#comments</comments>
		<pubDate>Sat, 31 Mar 2012 15:59:23 +0000</pubDate>
		<dc:creator>Soczó Zsolt</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[ADO.NET]]></category>

		<category><![CDATA[Adatbázisok]]></category>

		<category><![CDATA[Entity Framework]]></category>

		<category><![CDATA[NHibernate]]></category>

		<category><![CDATA[Szakmai élet]]></category>

		<guid isPermaLink="false">http://soci.hu/blog/?p=1215</guid>
		<description><![CDATA[Korábban írtam, hogy a Future query-k milyen jók, mivel ha tudjuk, hogy sok lekérdezést egymás után akarunk végrehajtani, akkor össze lehet őket rakni egy batchbe, ezzel igen jelentős gyorsulást lehet elérni. Álljon itt egy konkrét példa:


private IQueryable&#60;TradeStatistic&#62; LoadTradeStatisticsQueryable(ISession session, TaConfig config, TradeDirection dir)
{
    return from ts in session.Query&#60;TradeStatistic&#62;()
     [...]]]></description>
			<content:encoded><![CDATA[<p>Korábban írtam, hogy a Future query-k milyen jók, mivel ha tudjuk, hogy sok lekérdezést egymás után akarunk végrehajtani, akkor össze lehet őket rakni egy batchbe, ezzel igen jelentős gyorsulást lehet elérni. Álljon itt egy konkrét példa:</p>
<pre name="code" class="c#">

private IQueryable&lt;TradeStatistic&gt; LoadTradeStatisticsQueryable(ISession session, TaConfig config, TradeDirection dir)
{
    return from ts in session.Query&lt;TradeStatistic&gt;()
            where ts.TaConfig == config &amp;&amp; ts.Dir == dir
            select ts;
}

public Dictionary&lt;TaSubPortfolio, IEnumerable&lt;TradeStatistic&gt;&gt; LoadTradeStatisticsBulk(TradeDirection dir, IEnumerable&lt;TaSubPortfolio&gt; taSubPortfolios)
{
    var futures = new Dictionary&lt;TaSubPortfolio, IEnumerable&lt;TradeStatistic&gt;&gt;();
    using (var session = AtsNHibSessionFactory.Factory.OpenSession())
    {
        foreach (var taSubPortfolio in taSubPortfolios)
        {
            futures.Add(taSubPortfolio, LoadTradeStatisticsQueryable(session, taSubPortfolio.TaConfig, dir).ToFuture());
        }
        foreach (TaSubPortfolio p in futures.Keys.ToList())
        {
            futures[p] = futures[p].ToList();
        }
    }

    return futures;
}
</pre>
<p>A trükk egyszerű. A lekérdezéseket nem hajtjuk végre, hanem a Queryable-öket a ToFuture segítségével betárazzuk későbbre. Aztán mikor mind megvan, a ToList()-tel kikényszerítjük az IQueryable-ök végrehajtását. A poén az, hogy ilyenkor az NHib tudja, hogy ezek future query-k, így a 2. ciklus első iterációjakor egyszerre kiadja az összes lekérdezést, így a ciklus 2..n. iterációjában már csak kivesszük az eredményeket.<br />
Az adatbázisba ez sok-sok selectként megy be egy batchben, majd a több resultsetből az NHib szépen materializálja az entitásokat.<br />
Sokszoros sebességnövekedést lehet elérni csak ezzel az egyszerű trükkel. Ez nem csak homogén lekérdezésekre megy, tetszőlegeseket össze lehet rakni így egybe.<br />
EF-hez <a href="https://github.com/loresoft/EntityFramework.Extended">itt</a> van hasonló kiegészítés.</p>
]]></content:encoded>
			<wfw:commentRss>http://soci.hu/blog/index.php/2012/03/31/nhibernate-futures/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Miért NHibernate?</title>
		<link>http://soci.hu/blog/index.php/2012/03/30/miert-nhibernate/</link>
		<comments>http://soci.hu/blog/index.php/2012/03/30/miert-nhibernate/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 08:43:59 +0000</pubDate>
		<dc:creator>Soczó Zsolt</dc:creator>
		
		<category><![CDATA[.NET]]></category>

		<category><![CDATA[.NET 4]]></category>

		<category><![CDATA[ADO.NET]]></category>

		<category><![CDATA[Adatbázisok]]></category>

		<category><![CDATA[Entity Framework]]></category>

		<category><![CDATA[NHibernate]]></category>

		<category><![CDATA[Szakmai élet]]></category>

		<guid isPermaLink="false">http://soci.hu/blog/?p=1198</guid>
		<description><![CDATA[Jeleztem korábban, hogy mióta megismertem az NHibernate-et, azóta nem nagyon foglalkozok az Entity Frameworkkel. Miért? Pár gondolatot leírok, aztán majd kifejtem őket bővebben is.

Sokféle kulcsgenerálást ismer. Az id generálásnak rendkívül nagy hatása van a módosítások felviteli sebességére. Eddig az assigneded és a HILO-t használtam élőben. SQL Serve Identity elfelejtve, considered harmful. Az SQL Server 2012 [...]]]></description>
			<content:encoded><![CDATA[<p>Jeleztem korábban, hogy mióta megismertem az NHibernate-et, azóta nem nagyon foglalkozok az Entity Frameworkkel. Miért? Pár gondolatot leírok, aztán majd kifejtem őket bővebben is.</p>
<ul>
<li>Sokféle kulcsgenerálást ismer. Az id generálásnak rendkívül nagy hatása van a módosítások felviteli sebességére. Eddig az assigneded és a HILO-t használtam élőben. SQL Serve Identity elfelejtve, considered harmful. Az SQL Server 2012 Sequence + HILO viszont egy jó kombináció lesz.</li>
<li>Batch-elt műveletek. Komplex objektum gráfok módosításakor ez is igen sokat jelent, mivel 1 roundtrip alatt lehet sok insert-update-delete műveletet végrehajtani. Ráadásul pl. Oracle esetén kihasználják az Array Bindingot, ami kb. olyan, mint SQL servernél a tábla típusú paraméter, így eszement gyorsan tud DML műveleteket végrehajtani.</li>
<li>Rendkívüli kibővíthetőség. Az IInterceptor interfészen keresztül mélyen bele lehet nyúlni a működésébe. Ezt pl. field szintű securityhoz használtuk ki, e nélkül nem nagyon tudtuk volna megcsinálni.<br />
Vagy pl. a tranzakciók megkezdése után, de még az SQL parancsok végrehajtása előtt be kellett tolni egy a kliensoldali felhasználót reprezentáló információt (audit miatt). Erre is volt kézenfekvő kibővítési pont.<br />
Vagy oraclenek collection típusú paramétert kellett átadni, ezt is meg tudtuk szépen oldani saját adattípus definiálásával.</li>
<li>Direkt DML műveltek. Update vagy Delete anélkül, hogy behúznánk az entitásokat memóriába. Lehet érvelni, hogy nem erre való egy O-R mapper, de ha már egyszer az ember entitásokban és nem táblákban fogalmazza meg a dolgait, egyszerűbb a DML-eknél is ezt használni. Főleg pl. egy öröklődéses esetben, amikor több táblában is kell törölni.</li>
<li>Flexibilis materializáló. Joinolt direkt SQL select kimenetét szépen bele lehet passzírozni egy objektumfába, egyszerűen.</li>
<li>Saját adattípusok használta. Az Oraclenek nincs GUID típusa, ezért RAW(16)-ként tároltuk a guidokat. Entitás oldalon viszont szeretjük a GUID-ot, ezért egy saját típussal oldottuk meg a leképezést, így mindkét oldal természetes absztrakciókkal dolgozik.</li>
<li>Enum mapping. Ha akarom intként menti el, ha akarom stringként. Hogy is van ez EF-nél?</li>
<li>Cascade műveletek gyerekekre való használata szabályozható.</li>
<li>Szabályozható, hogy csak a megváltozott property-ket updatelje, vagy mindet?</li>
<li>Van stateless sessionje (NHib Session kb. EF ObjectContext) nagytömegű adatkezeléshez</li>
<li>Tud natívan pl. tömböt adatbázisra mappelni. Azaz sorszáma van az elemeknek, ha kitörlök egy elemet, akkor a felette levő sorszámúakat automatikusan updateli.</li>
<li>Vannak current session kontérerei. Ezek pl. WCF szerviz és DI használata esetén nélkülözhetetlenek, így pl. a session élettartama a WCF OperationContexthez láncolható. Ezt annak idején letöltöttem EF-hez, elég bonyolult volt, de ez megy ott is.</li>
<li>Future Query-k: ezekkel több lekérdezést egybe lehet fűzni, hogy egy batchben hajtsa végre. EF-hez láttam ilyet a kiegészítő packben.</li>
<li>Secondary Cache. Ezt még nem használtam, de érzésre hatalmas potenciál van benne. Cache réteg, így a lekérdezések egy részét memóriából adja vissza.</li>
<li>Sokféle adatbázis támogatása.</li>
<li>Lazy properties. Betölti az entitást, de nem tölti be pl. a benne levő byte tömböt, ami egy blobra meppelődik a táblában. Csak akkor töltődik be, ha tényleg hivatkozunk a property-re. Ehhez ugyanazt a virtuális proxy megoldást használja, mint az EF.</li>
</ul>
<p>Hirtelen ennyi jut az eszembe. Egyetlen, de ez nagy negatívum az EF-fel szemben a Linq providere. Az egyszerűen szar, félkész, még most, 2012. márciusában is. Ami kész van, az is elég ostoba, az EF-é viszont okos, tudja, mi a jó az adatbázisnak, így optimalizálja a generált SQL kódot.<br />
Pl. az alábbi NHibernate LINQ-ból: &#8230; where !a.IsValid ezt csinálta Oracle alatt:<br />
where not(a.IsValid).<br />
Ez persze table scant okoz orán is. Így kellett átírni: where a.IsValid == false. Ebből lett: where a.IsValid = 0. Ez már seek. De basszus, ezt elvárnám a LINQ providertől!<br />
Nincs a LINQ providerében outer join implementálva! Vagy amikor írtam egy allekérdezéses, Take-es majd select-es nagyobb LINQ kifejezést egyszerűen NotImplementedExceptiont kaptam, és láttam, az egyik NHib fejlesztő megindokolta, hogy ez miért jó így.<br />
Szóval ez a része beteg, párszor LINQ helyett Criteria vagy HQL alapú lekérdezést kellett írnom, ez bosszantó, ront a jó benyomáson.</p>
<p>Tudom, hogy ez a bejegyzés egyesek agyát felhúzza majd. Lesz, aki utána fog nézni, hogy amiket pozitívumként írtam, valójában megvan vagy lesz EF-ben, vagy az EF Extensions packben. Lehet, nem tudok mindent én se fejből.<br />
Nyissunk vitát, nézzük meg, melyik-miben jó, ebből mindenki tanulhat.</p>
]]></content:encoded>
			<wfw:commentRss>http://soci.hu/blog/index.php/2012/03/30/miert-nhibernate/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL Server 2012 újdonságok - 2. Sequence</title>
		<link>http://soci.hu/blog/index.php/2012/03/30/sql-server-2012-ujdonsagok-2-sequence/</link>
		<comments>http://soci.hu/blog/index.php/2012/03/30/sql-server-2012-ujdonsagok-2-sequence/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 08:08:08 +0000</pubDate>
		<dc:creator>Soczó Zsolt</dc:creator>
		
		<category><![CDATA[Adatbázisok]]></category>

		<category><![CDATA[SQL Server]]></category>

		<category><![CDATA[SQL Server 2012]]></category>

		<category><![CDATA[Szakmai élet]]></category>

		<guid isPermaLink="false">http://soci.hu/blog/?p=1210</guid>
		<description><![CDATA[Update:
A cikkben NEM folytonos sorszámgenerálásról írok, mint pl. amit számla sorszámozásnál használnak, hanem pusztán egyedi kulcsok generálását, amik nem ismétlődnek, monoton nőnek, de nem folytonosak.
A sorszámgenerálás igen általános feladat adatbázisalapú alkalmazásokban. Az egyik leggyakoribb eset, amikor egész számokra épített mesterséges elsődleges kulcsoknak kell értéket generálni. Erre eddig a leggyakrabban alkalmazott megoldás az IDENTITY-vel megjelölt oszlop [...]]]></description>
			<content:encoded><![CDATA[<p>Update:<br />
A cikkben NEM folytonos sorszámgenerálásról írok, mint pl. amit számla sorszámozásnál használnak, hanem pusztán egyedi kulcsok generálását, amik nem ismétlődnek, monoton nőnek, de nem folytonosak.</p>
<p>A sorszámgenerálás igen általános feladat adatbázisalapú alkalmazásokban. Az egyik leggyakoribb eset, amikor egész számokra épített mesterséges elsődleges kulcsoknak kell értéket generálni. Erre eddig a leggyakrabban alkalmazott megoldás az IDENTITY-vel megjelölt oszlop használata volt. IDENTITY-nél az oszlopon kijelölt sorszámgenerálás és az insert művelet össze volt ragadva. A SEQUENCE nevű új adatbázis objektum segítségével mindentől teljesen független sorszámgenerátorokat hozhatunk létre, amelyeket bármikor meghívhatunk, nem csak insertekhez.<br />
Miért jó ez a sorszámgenerálás és a felhasználása elválasztása? Képzeljük el azt az estet, hogy el kell menteni megrendeléseket. Van 1000 megrendelés fejlécünk (Order Header), és mindegyikhez van átlagban 5 megrendelés tétel (Order Detail). IDENTITY -t használva egyesével be kell szúrni a fejléc sorokat, visszavezetni az adatelérő rétegbe a generált identity értéket, átírni az adott fejléc alá tartozó megrendelés tételek szülő fejlécre mutató idegen kulcsát a kapott értékkel, majd beszúrni a megrendelés tételeket. A megrendelés tételeket be lehet szúrni egy batch-ben, azaz egy körülfordulás alatt. Azonban a fejléc sorok identity-jének visszavezetése miatt 1000 külön batch-et kell beküldeni a szülő sorok beszúrásához, majd további 1000-et a gyerek sorok kedvéért. Ez összesen 2000 hálózati körülfordulás, pedig már kötegeltük a gyerekek beszúrását, e nélkül 1000+5000=6000 körülfordulás lenne. Ha egy hálózati körülfordulás 10ms (ez realisztikus, és magában foglalja az insert idejét is), akkor a 2000 művelet 20 másodperc alatt fut le.<br />
Ha azonban SEQUENCE segítségével generáljuk a kulcsokat, akkor az adatelérő réteg minden további nélkül lekérhet egy nagyobb sorszámtartományt, azaz nem 1-gyel lépteti előre a SEQUENCE-t, hanem pl. 10000-rel.  Így az az adatelérő réteg kap 10000 sorszámot, amit más garantáltan nem kap meg, így ezzel ő gazdálkodhat. Mit fog tenni egy okos az adatelérő réteg? Előre kiosztja minden szülő sornak a kulcsértéket a kapott tartományból, utána állítja a gyerekeket, és 1 azaz egy batch-ben képes beszúrni az összes szülő és gyerek sort! Praktikusan ez azt jelenti, hogy valószínűleg 1 mp-en belül beszúrásra kerül mind a 6000 sor.<br />
Óriási nyereség ez, amelyet a fejlettebb Objektum Relációs Mapper-ek (pl. NHibernate) HiLo stratégiaként ismernek, és tudnak SEQUENCE-t használni a kiosztott id-k (elsődleges kulcsok) kezelésére.<br />
A megoldás kulcsa tehát az, hogy még a sorok beszúrása előtt tudunk azoknak id-t generálni, ezáltal extra optimalizálási lehetőségeink vannak. Minek köszönhető ez? Annak, hogy az id generálás és a beszúrás műveletek nincsenek összekötve időben, köszönhetően a SEQUENCE-eknek.<br />
Mivel a SEQUENCE által generált sorszámot tetszés szerint használhatjuk, készíthetünk vele például táblák között megosztott id generátort is, így pár tábla úgy kap elsődleges kulcsot, hogy a táblák között nézve se lesz ütközés közöttük.<br />
Nézzünk pár példát rá.<br />
Integer alapú SEQUENCE létrehozás, amely 1-től indul és 1-esével lépked:</p>
<pre name="code" class="sql">

create sequence HumanResources.Sequence1 as int
start with 1
increment by 1;
</pre>
<p>A következő sorszám lekérése:</p>
<pre name="code" class="sql">

select next value for HumanResources.Sequence1;
</pre>
<p>Trükkösebb SEQUENCE-ek is vannak, amelyek miután elérek egy felső határt, átfordulnak, és újrakezdik a számlálást:</p>
<pre name="code" class="sql">

create sequence HumanResources.SequenceWithCycle
as int
start with 1
increment by 1
minvalue 1
maxvalue 5
cycle;
</pre>
<p>Miután ellépkedett 5-ig, újra 1 lesz a következő generált érték. A cycle kulcsszó nélkül hibát kapnánk az 5 után meghívott next value-ra:</p>
<p>The sequence object &#8216;SequenceWithCycle&#8217; has reached its minimum or maximum value. Restart the sequence object to allow new values to be generated.</p>
<p>Hogyan implementálták a SEQUENCE-t, hogy elég gyors legyen? Ha tisztán memóriában növelgetnék a sorszámot, akkor a sorszám a szerver újraindulása után újraindulna, ezért mindenképpen kell valamilyen tartós tároló (diszk, sql tábla, stb.) mögé. Lehetne azt csinálni, hogy amikor leállítják a szervert, akkor kiírnák az számláló állását, majd újraindítás után visszaolvassák azt. Ezzel viszont az a baj, hogy ha váratlanul lehal a szerver processz, vagy elmegy az áram, akkor nem lesz kiírva az utolsó érték, így legközelebb újra kioszt már kiadott sorszámokat, ami nyilvánvaló logikai hibákat okozna.<br />
Lehetne minden sorszám letépése után kiírni az aktuális értéket, de ez meg nagyon lassú lenne. A SQL Server által választott megoldás kompromisszum a két oldal között, egyfajta cache-elés.<br />
Memóriában tárolja sorszámot, de úgy, hogy egyszerre lekér egy nagyobb tartományt diszkről, és azt osztogatja ki, tisztán memóriában. Mikor elfogyott a tartomány, akkor megint növel egy nagyobb harapást rajta, kiírja a diszkre, és elkezdi újra memóriából osztani. Mi történik, ha elhasal a szerver? Csak annyi, hogy pár sorszám, ami még nem került kiosztásra a lekért tartományból kimarad, és elkezd egy új tartományt osztani a szerver. Luk lesz a sorszámokban, de ez nem okoz problémát, se az IDENTITY-nél, sem a SEQUENCE-nél nem építhetünk a folytonos sorszámokra, csak azt garantálják, hogy kétszer nem adják ki ugyanazt a sorszámot.<br />
A SQUENCE létrehozásakor meg lehet adni, mekkora tartományt használjon cache-ként:</p>
<pre name="code" class="sql">

create sequence HumanResources.SequenceWithLargerCache
as int
start with 1
increment by 1
cache 100;
</pre>
<p>Kis cache esetén kicsi a valószínűsége a luknak, nagy cache esetén gyorsabb a sorszámosztás. Értelemszerűen intenzív SEQUENCE használó programoknál érdemes nagy cache értéket használni, de érdekes módon pár 10-es méret után már nem érhetünk el jelentős nyereséget.<br />
A SEQUENCE-eket nem csak egyesével lehet léptetni, például a korábban leírt HiLo id generátor adatelérő stratégia egyszerre pár száz vagy ezer sorszámot kér magának, amivel aztán maga gazdálkodik. Tetszőleges számú előreléptetést így kell kérni:</p>
<pre name="code" class="sql">

declare @RangeFirstValue sql_variant ;
declare @RangeLastValue sql_variant ;

exec sp_sequence_get_range
@sequence_name = N&#039;HumanResources.CounterSeq&#039;
, @range_size = 50
, @range_first_value = @RangeFirstValue output
, @range_last_value = @RangeLastValue output;

SELECT @RangeFirstValue, @RangeLastValue;
</pre>
<p>Kimenet: 2336 2385</p>
<p>A SEQUENCE egyébként más adatbázisokról való áttéréskor (Oracle, Firebird) az egyik legproblémásabb pont volt, SQL Server 2012-től ez is megoldódott.<br />
A másik problémás pont a soronként működő triggerek, de ebben nem lépett előre a 2012.</p>
]]></content:encoded>
			<wfw:commentRss>http://soci.hu/blog/index.php/2012/03/30/sql-server-2012-ujdonsagok-2-sequence/feed/</wfw:commentRss>
		</item>
		<item>
		<title>SQL Server 2012 újdonságok - 1. File Table</title>
		<link>http://soci.hu/blog/index.php/2012/03/28/sql-server-2012-ujdonsagok-1-file-table/</link>
		<comments>http://soci.hu/blog/index.php/2012/03/28/sql-server-2012-ujdonsagok-1-file-table/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 12:38:06 +0000</pubDate>
		<dc:creator>Soczó Zsolt</dc:creator>
		
		<category><![CDATA[Adatbázisok]]></category>

		<category><![CDATA[SQL Server]]></category>

		<category><![CDATA[SQL Server 2012]]></category>

		<category><![CDATA[Szakmai élet]]></category>

		<guid isPermaLink="false">http://soci.hu/blog/?p=1204</guid>
		<description><![CDATA[Aki még emlékszik rá, valamikor 2004 táján volt egy olyan ötlet, hogy az NTFS valamiféle adatbázis irányba megy el, így a Vista mögött WinFS néven lesz valami hibrid tároló. Még demóztam is annak idején, de aztán nem lett belőle semmi.
Most, 2012-ben az FileTable SQL Server újdonságot látva WinFS feelingem támadt. Lássuk, mi ez?
Nagy fájlok és [...]]]></description>
			<content:encoded><![CDATA[<p>Aki még emlékszik rá, valamikor 2004 táján volt egy olyan ötlet, hogy az NTFS valamiféle adatbázis irányba megy el, így a Vista mögött WinFS néven lesz valami hibrid tároló. Még demóztam is annak idején, de aztán nem lett belőle semmi.<br />
Most, 2012-ben az FileTable SQL Server újdonságot látva WinFS feelingem támadt. Lássuk, mi ez?</p>
<p>Nagy fájlok és a relációs adatok együttes tárolása gyakran visszatérő feladat. Pl. egy website fényképeket publikál, amelyekhez le kell tárolni a fényképeket mint nagytömegű bináris adatot, és hozzá tucatnyi metaadatot a kép méretéről, készítőjéről, stb. A metaadatok könnyen letárolhatók relációs sémában, de a fájl adatok mindig is problémát jelentettek, mivel a relációs adatbáziskezelők nem nagyméretű adatok tárolására tervezettek, hanem sok kicsire.<br />
Az SQL Server 2008-ban bevezetett FILESTREAM attribútum segítségével már tudtunk nagytömegű adatokat hatékonyan tárolni, amely látszólag adatbázisban tárolja az adatokat, valójában fájlrendszerben, a tranzakcionális épség megtartása mellett. Az így tárolt adatokat el lehet érni SQL SELECT paranccsal is, mintha relációs adat lenne, de tranzakcionális fájl apin keresztül is, amely hatékonyabb elérést biztosít. Utóbbi viszont csak tranzakció megnyitása után engedélyezte a kipublikált fájl megosztás elérését, így azt azt az arre fel nem készített alkalmazások közvetlenül nem tudták elérni fájl apival (CreateFile függvény, .NET FileStream osztály, stb.).<br />
Az SQL Server 2012-ben bevezetett FileTable a FILESTREAM funkciót fejleszti tovább. Belül FILESTREAM alapon látszólag táblában, valójában fájlokban tárolja az adatokat, kívülről viszont teljesen úgy lehet elérni őket, mintha egy fájlmegosztás fájljait és könyvtárait látnánk. A FileTable adatok eléréséhez nem kell (de lehet) tranzakciót nyitni, így közönséges módon, mintha tényleg fájlokat látnánk elérhetőek az adatok.<br />
Közelebbről, a FileTable valamely sora egy fájlt vagy egy könyvtárat képes tárolni. Az adatok a fájlrendszerhez hasonlóan hierarchikusan vannak elrendezve. Belül contraintekkel és triggerekkel biztosítják, hogy az igazi fájlrendszerhez hasonlóan működjön. 10 fájl attribútumot is tárolnak (hidden, readonly, stb.). Tartalmaz egy fájl típust azonosító oszlopot is, hogy a FullText kereső tudja, milyen tartalom van benne (rtf, doc, stb.)<br />
SQL szemszögből az adatok elérhetők SQL parancsokkal is, és a backup/restore is kezeli, azaz teljesen integráns része lett az SQL Servernek, míg kívülről teljesen az az élményünk, hogy fájlrendszert látunk.<br />
Nézzünk egy egyszerű példát FileTable létrehozására:</p>
<pre name="code" class="sql">

alter database AdventureWorks2012
ADD FILEGROUP FsGroup CONTAINS FILESTREAM;

alter database AdventureWorks2012
ADD FILE (NAME = Fs, FILENAME = &#039;c:\data\filestream1&#039;)
TO FILEGROUP FsGroup;

ALTER DATABASE AdventureWorks2012
SET FILESTREAM (NON_TRANSACTED_ACCESS = FULL, DIRECTORY_NAME = N&#039;gyoker&#039;);

CREATE TABLE FtStore AS FileTable
WITH (FileTable_Directory = &#039;Ft&#039;,
	FileTable_Collate_Filename = Latin1_General_100_CI_AS);
</pre>
<p>Intézőben közönséges megosztásként látszik a FileTable, létrehozhatunk benne könyvtárakat és fájlokat:<br />
<div id="attachment_1205" class="wp-caption aligncenter" style="width: 310px"><a href="http://soci.hu/blog/wp-content/uploads/2012/03/filetableshareinexplorer.png"><img src="http://soci.hu/blog/wp-content/uploads/2012/03/filetableshareinexplorer-300x153.png" alt="File Table in Windows Explorer" title="File Table in Windows Explorer" width="300" height="153" class="size-medium wp-image-1205" /></a><p class="wp-caption-text">File Table in Windows Explorer</p></div></p>
<p>Így érhető el a FileTable SQL oldalról:</p>
<pre name="code" class="sql">

SELECT * FROM [AdventureWorks2012].[dbo].[FtStore];
</pre>
<p>Az eredményhalmaz ketté van vágva a könnyebb olvashatóság kedvéért:<br />
<div id="attachment_1207" class="wp-caption aligncenter" style="width: 310px"><a href="http://soci.hu/blog/wp-content/uploads/2012/03/ftselect1.png"><img src="http://soci.hu/blog/wp-content/uploads/2012/03/ftselect1-300x15.png" alt="FileTable from SQL side" title="FileTable from SQL side" width="300" height="15" class="size-medium wp-image-1207" /></a><p class="wp-caption-text">FileTable from SQL side</p></div></p>
<p><div id="attachment_1208" class="wp-caption aligncenter" style="width: 310px"><a href="http://soci.hu/blog/wp-content/uploads/2012/03/ftselect2.png"><img src="http://soci.hu/blog/wp-content/uploads/2012/03/ftselect2-300x15.png" alt="FileTable from SQL side" title="FileTable from SQL side" width="300" height="15" class="size-medium wp-image-1208" /></a><p class="wp-caption-text">FileTable from SQL side</p></div></p>
<p>A FILESTREAM vagy FileTable adatokat igazán hatékonyan a megosztáson keresztül, fájlkezelő műveletekkel lehet jól kiaknázni, mivel ilyenkor az adatok nem kerülnek be a Buffer Cache-be, így nem tolják ki onnan a már cache-elt kisebb relációs adatokat.</p>
<p>Egyetlen fura pont van csak az egészben, hogy notepadban nem lehet megnyitni és elmenteni a FileTableben tárolt szövegeket, mert a notepad Memory Mapped File apival nyitja meg a szöveget, amit nem támogat a FileTable redirectora&#8230; Csak sima CreateFile api vagy .NET-ből a FileStream az, amivel meg lehet nyitni a benne levő dolgokat. A WordPad például nem trükközik, nem használ Memory Mapped File-t.</p>
]]></content:encoded>
			<wfw:commentRss>http://soci.hu/blog/index.php/2012/03/28/sql-server-2012-ujdonsagok-1-file-table/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A várakozás vége</title>
		<link>http://soci.hu/blog/index.php/2012/03/28/a-varakozas-vege/</link>
		<comments>http://soci.hu/blog/index.php/2012/03/28/a-varakozas-vege/#comments</comments>
		<pubDate>Wed, 28 Mar 2012 12:05:56 +0000</pubDate>
		<dc:creator>Soczó Zsolt</dc:creator>
		
		<category><![CDATA[Felhívás]]></category>

		<category><![CDATA[Szakmai élet]]></category>

		<guid isPermaLink="false">http://soci.hu/blog/?p=1202</guid>
		<description><![CDATA[Kedves Blogolvasóim!
Örömmel jelentem, hogy vége a hallgatásnak. :) Március elején véget ért az a munka, amely minden erőmet és időmet elvitt, így újra lesz időm blogolni. Ami miatt ez most bizonyosabb, hogy áprilisban lesz egy konferencia, amin az SQL Server 2012-ről fogok beszélni (az, hogy ezt elvállaltam is jelzi, hogy lett újra időm élni), és [...]]]></description>
			<content:encoded><![CDATA[<p>Kedves Blogolvasóim!</p>
<p>Örömmel jelentem, hogy vége a hallgatásnak. :) Március elején véget ért az a munka, amely minden erőmet és időmet elvitt, így újra lesz időm blogolni. Ami miatt ez most bizonyosabb, hogy áprilisban lesz egy konferencia, amin az SQL Server 2012-ről fogok beszélni (az, hogy ezt elvállaltam is jelzi, hogy lett újra időm élni), és ehhez írtam 22 oldalnyi anyagot és sok példakódot, amelyet apránként bedolgozok ide a blogba is. Az elsőt ma tolom is be.</p>
<p>Jó tanulást, köszönöm a kitartást. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://soci.hu/blog/index.php/2012/03/28/a-varakozas-vege/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Boldog Karácsonyt</title>
		<link>http://soci.hu/blog/index.php/2011/12/24/boldog-karacsonyt-2/</link>
		<comments>http://soci.hu/blog/index.php/2011/12/24/boldog-karacsonyt-2/#comments</comments>
		<pubDate>Sat, 24 Dec 2011 13:09:19 +0000</pubDate>
		<dc:creator>Soczó Zsolt</dc:creator>
		
		<category><![CDATA[Szakmai élet]]></category>

		<category><![CDATA[Élet]]></category>

		<guid isPermaLink="false">http://soci.hu/blog/?p=1196</guid>
		<description><![CDATA[Kedves Olvasóim,
  boldog Karácsonyt nektek.
Idén megszakadtam a munkától, így szinte alig írtam, pedig rengeteg új dolgot tanultam: Oracle, NHibernate, WCF mélységei, WPF perf tuning, stb. Jövőre remélem sikerül kidumpolni az agyamból ezeket, mert -főleg az NHibernate- nagyon jó dolog. EF elment szabira, mióta megismertem. :)
]]></description>
			<content:encoded><![CDATA[<p>Kedves Olvasóim,<br />
  boldog Karácsonyt nektek.<br />
Idén megszakadtam a munkától, így szinte alig írtam, pedig rengeteg új dolgot tanultam: Oracle, NHibernate, WCF mélységei, WPF perf tuning, stb. Jövőre remélem sikerül kidumpolni az agyamból ezeket, mert -főleg az NHibernate- nagyon jó dolog. EF elment szabira, mióta megismertem. :)</p>
]]></content:encoded>
			<wfw:commentRss>http://soci.hu/blog/index.php/2011/12/24/boldog-karacsonyt-2/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

