Readern ska ju vara snabbare har jag hört, men är det mycket det handlar om?
Dataset vs datareader
8 svar · 648 visningar · startad av P
Jag hittar tyvärr inte några exakta siffror men visst skiljer det i prestanda. Det är ju för övrigt en datareader som används för att fylla ett dataset. Det är väl framför allt serverminne som går åt.
Glöm heller inte att det finns ett dataset "light" - datatable.
Testa!
kör en trace på en sida och skriv ut när du börjar att hämta med dataset, skriv ut när hämtningen är klar, skriv ut när du börjar hämta med datareadern, skriv ut när hämtningen av readern är klar etc.
Trace.Write("Börjar hämta DataSet")
'## -- kod för att hämta med dataset --
Trace.Write("Hämtningen slutförd.")
Trace.Write("Börjar hämta DataReader")
'## -- kod för att hämta datareadern --
Trace.Write("Hämtningen slutförd")
ngt sådant så kan du själv perf-testa snabbt
Det bästa är väl annars att använda ACT som medföljer VS.NET fast den tar ju längre tid att sätta upp ;)
cya,
PatrikB
Skriv ihop en liten sida som tar ett tiotal rader. Resultatet blev så här:
Message From First(s) From Last(s)
Start dataset 0,000096 0,000049
Stoppa dataset 0,004140 0,004045
Start datareader 0,004213 0,000073
Stoppa datareader 0,008339 0,004126
Men hur ska man tolka det? Tycker det verkar som som Dataset är snabbare än datareader...
med denna kod i page_load
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
'Settings
Dim Cnn As New OdbcConnection("Driver={MySQL};Database=book2")
'Get dataset
Trace.Write("Start dataset")
Dim Adapter As New OdbcDataAdapter("SELECT * FROM roles", Cnn)
Dim ds As New DataSet()
Adapter.Fill(ds, "lal")
Trace.Write("Stoppa dataset")
'Get datareader
Trace.Write("Start datareader")
Cnn.Open()
Dim Command As New OdbcCommand("SELECT * FROM users", Cnn)
Dim dr As OdbcDataReader = Command.ExecuteReader()
Cnn.Close()
Trace.Write("Stoppa datareader")
End Sub
Testade också en anna kod som fyller datset/reader 1000 gånger och sen skriver ut tiden. Hamnade då på att ganska likartade siffror men liten fördel för readern.
Det är ju för övrigt en datareader som används för att fylla ett dataset.
Njae, det är en DataAdapter (sen om den i sin tur använder sig av en datareader är en annan femma)
Skillnaderna mellan en DataReader och en DataAdapter är att DataReadern bara har en forwar-only, read-only ström från
databasen och eftersom den bara håller en rad i minnet hela tiden så skapar detta mindre overhead.
DataAdaptern å andra sidan fungerar som en mellan hand mellan databasen och ett dataset. DataAdaptern kan skriva updatera etc mot databasen. Denna håller då mer information om databasen vilken gör den mer minnes/prestandard krävande.
Lägg på detta datasetet som håller all data ifrån databasen i sig. Alla tabeler. Den kan även hålla relationer mellan tabellerna samt vilka typer alla columner är av, ett sk typed dataset.
Så det krävs lite mer resurser ett dataset.
Angående din testning så det som tar tid är nog att öppna databaskopplingen. Du bör nog kasta in ett par tusen rader för att kunna göra en test. Och sen även ta ut någon data ur DataReader, istället för att bara öppna den ;) samt att använda samma select satser
När skall man använda vilket?
Använd DataSet när du behöver ha kvar saker i minnet eller skall fylla en datagrid eller liknande och använda Update och Insert och de funktionerna från den.
Använd en datareader då du inte behöver använda värderna mer än en gång. Som tex en dropdownlista eller fylla egna objekt med värden eller ta ut en rad med användaren som just loggat in.
Eller!!! använd det som känns bäst för dig. Den förlust i prestandard du får kanske inte spelar någon roll på din webbplats med 10 besökare i timmen eller kan det finnas andra sätt att få bättre prestandard tex med att casha sidor med stora dataset.
Fylla en datagrid? Går inte det lika bra med en datareader?
En datareader kan man ju bara ha öppen en åt gången så där finns väl en nackdel.
Reader är alltså bättre till små enkla saker som att bara plocka ut lite info från en tabell.
Fylla en datagrid? Går inte det lika bra med en datareader?
Självklart kan du det men då får du göra allt själv och 'förlorar' DataAdapterns funktioner för att updatera databasen. Men detta kanske är snabbare?
En datareader kan man ju bara ha öppen en åt gången så där finns väl en nackdel.
Japp, den håller en koppling till databasen öppen. Men i praktiken så håller ju även dataadaptern en koppling öppen så länge den kör mot databasen.
Reader är alltså bättre till små enkla saker som att bara plocka ut lite info från en tabell.
DataReaden är bättre (skall användas?) när du inte behöver (kan) spara nånting i minnet. Ett exempel där du skall använda datareadern för annat än småsaker är när du har en databas på 200 meg och kör en Select * (av nån anledning). Använder du då en DataAdapter tillsammans med ett dataset kommer du att få en väldigt stor minnes åtgång.
Låter bra!
Har aldrig använt mig av dataadapterns (dataset) till att uppdatera databasen, kanske man skulle kolla på.
Datatable+dataadapter hade en smart funktion. Är det någon mer som kör med den eller är det bara jag som gnetar med "update...." ?