<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Websiteudvikler &#187; Dataset</title>
	<atom:link href="http://websiteudvikler.dk/post/tag/dataset/feed" rel="self" type="application/rss+xml" />
	<link>http://websiteudvikler.dk</link>
	<description>med fokus på integration, web 2.0, social media, analytics, konvertering og usability</description>
	<lastBuildDate>Sun, 05 Sep 2010 21:14:55 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Linq, Dataset, Recordset performance resultat</title>
		<link>http://websiteudvikler.dk/post/linq-dataset-recordset-performance-resultat.html?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=linq-dataset-recordset-performance-resultat</link>
		<comments>http://websiteudvikler.dk/post/linq-dataset-recordset-performance-resultat.html#comments</comments>
		<pubDate>Sat, 26 Dec 2009 20:42:31 +0000</pubDate>
		<dc:creator>Kevin Steffer</dc:creator>
				<category><![CDATA[Analyse]]></category>
		<category><![CDATA[Dataset]]></category>
		<category><![CDATA[LINQ]]></category>
		<category><![CDATA[Microsoft .NET]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[Recordset]]></category>

		<guid isPermaLink="false">http://blogs.co3.dk/kevinsteffer/post/linq-dataset-recordset-performance-resultat/</guid>
		<description><![CDATA[Jeg har i længere tid undret mig over en dårlig performance med anvendelse af LINQ, og nu er jeg gået på jagt efter synderen i tiden i databasen SQL Server. I denne første test jeg har lavet har jeg dog ikke fundet synderen, men stadig et interessant resultat, som bekræfter mig i, at du ikke [...]]]></description>
			<content:encoded><![CDATA[<p>Jeg har i længere tid undret mig over en dårlig performance med anvendelse af <a href="http://msdn.microsoft.com/en-us/netframework/aa904594.aspx" target="_blank">LINQ</a>, og nu er jeg gået på jagt efter synderen i tiden i databasen <a href="http://www.microsoft.com/SQL/default.mspx" target="_blank">SQL Server</a>.</p>
<p>I denne første test jeg har lavet har jeg dog ikke fundet synderen, men stadig et interessant resultat, som bekræfter mig i, at du ikke skal bruge et <a href="http://msdn.microsoft.com/en-us/library/system.data.dataset(VS.71).aspx" target="_blank">Dataset</a> som bliver indlæst med data fra en <a href="http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldataadapter.aspx" target="_blank">SqlDataAdapter</a> med Fill metoden, og her kan du se hvorfor:</p>
<p><img src="http://spreadsheets.google.com/a/pro.co3.dk/oimg?key=0An3C8tmqCWSHdGVPRUdCWVFDZzB1V3ByUmlEVWpvLUE&amp;oid=1&amp;v=1261860309379" width="300" />&#160; <img src="http://spreadsheets.google.com/a/pro.co3.dk/oimg?key=0An3C8tmqCWSHdGVPRUdCWVFDZzB1V3ByUmlEVWpvLUE&amp;oid=2&amp;v=1261860545958" width="300" /> </p>
<p><img src="http://spreadsheets.google.com/a/pro.co3.dk/oimg?key=0An3C8tmqCWSHdGVPRUdCWVFDZzB1V3ByUmlEVWpvLUE&amp;oid=3&amp;v=1261860593529" width="300" />&#160; <img src="http://spreadsheets.google.com/a/pro.co3.dk/oimg?key=0An3C8tmqCWSHdGVPRUdCWVFDZzB1V3ByUmlEVWpvLUE&amp;oid=4&amp;v=1261860624910" width="300" /></p>
<p>Min test går i sin simpelhed ud på at læse 1.000, 10.000 og 100.000 rækker fra en simpel tabel og så måle, hvor lang tid det tager få de tre måder at hente data ud på fra en SQL Server.</p>
<h2>Konklusion</h2>
<p><strong>Recordset dobbelt så hurtigt til små database kørsler</strong></p>
<p>Ved små data mængder er LINQ ikke så hurtig som Recordset, men da tiden er så lav mærkes det ikke, hvis de er enkelte jobs, så det er reelt kun et problem, hvis du skal køre rigtig mange af disse små-jobs mod databasen så husk du er færdig på den halve tid med et Recordset.</p>
<p><strong>Dataset skal anvendes, hvor mange af de samme data skal anvendes alsidsigt</strong></p>
<p>Når der skal tælles, hvor mange rækker man har fået ud i et resultat, så må du bede til, at du ikke har anvendt Dataset metoden, det der trækker ned er helt klart at måden hvorpå man skal hive data ud for at få et Dataset ikke egner sig til små resultater, fordi man skal hente hele tabellen med en hel vildt masse egenskaber ud, og det tager bare tid.</p>
<p><strong>Med 10.000 rækker er både LINQ og Recordset over dobbelt så hurtige som Dataset.</strong></p>
<p>Når vi øger antallet af rækker med en faktor 10 til 10.000 rækker stiger test tiderne selvfølgelig, fordi databasen tager længere tid om at sende 10 gange så meget data, men overraskende meget synes jeg. LINQ metoden stiger med en faktor 4,5, Dataset metoden stiger med en faktor 10 og Recordset metoden stiger med en faktor 6,5.</p>
<p><strong>Med 100.000 rækker begynder LINQ at hale gevaldigt ind på Recordset.</strong></p>
<p>Når vi øver antallet af rækker yderligere med en faktor 10 til 100.000 rækker, ville jeg forvente samme stigningsgrad som før med fra 1.000 til 10.000, men nu stiger den endnu mere. LINQ metoden stiger med en faktor 8,7, Dataset metoden med en faktor 9 og Recordset metoden med en faktor 9,5.</p>
<p><a href="http://bit.ly/5JCsPq" target="_blank">Download Visual Studio 2008 Projektet</a></p>
<h2>Testsystem</h2>
<p>Hardware: Bærbar HP Elitebook, 3GB RAM, 2,53GHz Intel Core Duo, 32bit    <br />Software: Windows 7 32bit, SQL Server Express 2009, Visual Studio 2008 Professional Developer Web Server</p>
<h2>Testforløb</h2>
<p>Jeg har opdelt min test i 4 forløb og hver eneste forløb er kørt 10 gange på samme metode for så til sidst at få en gennemsnits tidsforbrug som toneangivende konklusion.</p>
<p><strong>LINQ måling metode</strong></p>
<pre class="code"><span style="color: blue">private void </span>DoLinqTest()
{
    <span style="color: #2b91af">DateTime </span>dtLinqStart = <span style="color: #2b91af">DateTime</span>.Now;
    <span style="color: blue">using </span>( DB.<span style="color: #2b91af">dbDataContext </span>db = <span style="color: blue">new </span>DB.<span style="color: #2b91af">dbDataContext</span>() )
    {
        <span style="color: green">// Execution code
</span>    }
    <span style="color: #2b91af">DateTime </span>dtLinqEnd = <span style="color: #2b91af">DateTime</span>.Now;
    lblLinqTime.Text = ( dtLinqEnd - dtLinqStart ).ToString();
}</pre>
<p><strong>Dataset måling metode</strong></p>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<pre class="code"><span style="color: blue">private void </span>DoDataSetTest()
{
    <span style="color: #2b91af">DateTime </span>dtDsStart = <span style="color: #2b91af">DateTime</span>.Now;
    <span style="color: blue">using </span>( <span style="color: #2b91af">SqlConnection </span>dbCon = <span style="color: blue">new </span><span style="color: #2b91af">SqlConnection</span>( <span style="color: #2b91af">ConfigurationManager</span>.ConnectionStrings[ <span style="color: #a31515">&quot;dbConnectionString&quot; </span>].ConnectionString ) )
    {
        <span style="color: blue">using </span>( <span style="color: #2b91af">SqlDataAdapter </span>sqlAdap = <span style="color: blue">new </span><span style="color: #2b91af">SqlDataAdapter</span>( <span style="color: #a31515">&quot;SELECT * FROM item&quot;</span>, dbCon ) )
        {
            <span style="color: #2b91af">DataSet </span>ds = <span style="color: blue">new </span><span style="color: #2b91af">DataSet</span>();
            sqlAdap.Fill( ds );

            <span style="color: green">// Executing code
</span>        }
    }
    <span style="color: #2b91af">DateTime </span>dtDsEnd = <span style="color: #2b91af">DateTime</span>.Now;
    lblDsTime.Text = ( dtDsEnd - dtDsStart ).ToString();
}</pre>
<p><strong>Recordset måling metode</strong></p>
<pre class="code"><span style="color: blue">private void </span>DoRecordSetTest()
{
    <span style="color: #2b91af">DateTime </span>dtRsStart = <span style="color: #2b91af">DateTime</span>.Now;
    <span style="color: blue">using </span>( <span style="color: #2b91af">SqlConnection </span>dbCon = <span style="color: blue">new </span><span style="color: #2b91af">SqlConnection</span>( <span style="color: #2b91af">ConfigurationManager</span>.ConnectionStrings[ <span style="color: #a31515">&quot;dbConnectionString&quot; </span>].ConnectionString ) )
    {
        dbCon.Open();
        <span style="color: blue">using </span>( <span style="color: #2b91af">SqlCommand </span>sqlCmd = <span style="color: blue">new </span><span style="color: #2b91af">SqlCommand</span>( <span style="color: #a31515">&quot;SELECT * FROM item&quot;</span>, dbCon ) )
        {
            <span style="color: blue">using </span>( <span style="color: #2b91af">SqlDataReader </span>rs = sqlCmd.ExecuteReader() )
            {
                <span style="color: green">// Executing code
</span>            }
        }
    }

    <span style="color: #2b91af">DateTime </span>dtRsEnd = <span style="color: #2b91af">DateTime</span>.Now;
    lblRsTime.Text = ( dtRsEnd - dtRsStart ).ToString();
}</pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<h2>1. forløb</h2>
<p>En test som ses i <em>Testresultat Sheet: <strong>1000 List</strong></em> på at få 1000 database rækker ud som objekter af flg. type:</p>
<pre class="code"><span style="color: blue">public class </span><span style="color: #2b91af">item
</span>{
    <span style="color: blue">public int </span>Id { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }
    <span style="color: blue">public string </span>Name { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }
    <span style="color: blue">public string </span>Description { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }
    <span style="color: blue">public </span><span style="color: #2b91af">DateTime </span>Date { <span style="color: blue">get</span>; <span style="color: blue">set</span>; }

    <span style="color: blue">public </span>item()
    {
    }

}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing LINQ code:</strong></p>
<pre class="code"><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt; objItems = ( <span style="color: blue">from </span>itm <span style="color: blue">in </span>db.items
                        <span style="color: blue">select new </span><span style="color: #2b91af">item
                        </span>{
                          Id = itm.id,
                          Name = itm.name,
                          Description = itm.description,
                          Date = itm.date.Value
                        } ).ToList();</pre>
</p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing Dataset code:</strong></p>
<pre class="code"><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt; items = <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt;();
<span style="color: #2b91af">DataRow</span>[] drs = ds.Tables[ 0 ].Select();
<span style="color: blue">for </span>( <span style="color: blue">int </span>i = 0; i &lt; drs.Length; i++ )
{
    <span style="color: blue">object</span>[] dbFields = drs[ i ].ItemArray;
    <span style="color: #2b91af">item </span>itm = <span style="color: blue">new </span><span style="color: #2b91af">item</span>();
    itm.Id = ( <span style="color: blue">int </span>)dbFields[ 0 ];
    itm.Name = dbFields[ 1 ].ToString();
    itm.Description = dbFields[ 2 ].ToString();
    itm.Date = ( <span style="color: #2b91af">DateTime </span>)dbFields[ 3 ];
    items.Add( itm );
}</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing Recordset code:</strong></p>
<pre class="code"><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt; items = <span style="color: blue">new </span><span style="color: #2b91af">List</span>&lt;<span style="color: #2b91af">item</span>&gt;();
<span style="color: blue">while </span>( rs.Read() )
{
  <span style="color: #2b91af">item </span>itm = <span style="color: blue">new </span><span style="color: #2b91af">item</span>();
  itm.Id = rs.GetInt32( 0 );
  itm.Name = rs.GetString( 1 );
  itm.Description = rs.GetString( 2 );
  itm.Date = rs.GetDateTime( 3 );
  items.Add( itm );
}</pre>
<h2>2. forløb</h2>
<p>En test som ses i <em>Testresultat sheet: <strong>1000 Count</strong></em> på at få antallet af rækker ud på en database tabel med 1.000 rækker</p>
<p><strong>Executing LINQ code:</strong></p>
<pre class="code"><span style="color: blue">int </span>count = ( <span style="color: blue">from </span>itm <span style="color: blue">in </span>db.items
              <span style="color: blue">select new </span><span style="color: #2b91af">item
              </span>{
                Id = itm.id,
                Name = itm.name,
                Description = itm.description,
                Date = itm.date.Value
              } ).Count();</pre>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing Dataset code:</strong></p>
<pre class="code"><span style="color: blue">int </span>count = ds.Tables[ 0 ].Rows.Count;</pre>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<p><strong>Executing Recordset code:</strong></p>
<pre class="code"><span style="color: blue">int </span>count = 0;
<span style="color: blue">while </span>( rs.Read() )
{
    count++;
}</pre>
<h2>3. forløb</h2>
<p>En test som ses i <em>Testresultat sheet: <strong>10000 List</strong></em> med samme <em>Executing code</em> som 1. forløb, men denne gang på at få 10.000 database rækker ud.</p>
<h2>4. forløb</h2>
<p>En test som ses i <em>Testresultat sheet: <strong>100000 List</strong></em> med samme <em>Executing code</em> som 1. forløb, men denne gang på at få 100.000 database rækker ud.</p>
<p><a href="http://11011.net/software/vspaste"></a><a href="http://11011.net/software/vspaste"></a></p>
<h2>Testresultat</h2>
<p><iframe height="350" src="http://spreadsheets.google.com/pub?key=teOEGBYQCg0uWprRiDUjo-A&amp;output=html&amp;widget=true" frameborder="0" width="400"></iframe></p>
<p><a href="http://bit.ly/5JCsPq" target="_blank">Download Visual Studio 2008 Projektet</a></p>
]]></content:encoded>
			<wfw:commentRss>http://websiteudvikler.dk/post/linq-dataset-recordset-performance-resultat.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
