HyperLink
Bejelentkezés
E-mail: 
Jelszó: 





Skip Navigation Links
 

Adatbázislekérdezés sebességvetületei


Példaprogram letöltése

11413 bájt

Valószínűleg nem árulunk el titkot, amikor arról beszélünk, hogy milyen egyszerű adatbázisban tárolt adatainkat XML formátumba konvertálni, vagy onnan visszaolvasni a DataSet objektum felhasználásával. Érdekesebb kérdés viszont, hogy egy hosszabb konverzió mennyi ideig tart, hiszen Webes alkalmazások esetén az időtényező igen fontos. Cikkünkben elvégzünk egy vizsgálatot arra vonatkozóan, hogy mekkora időkülönbség van a lekérdezés, illetve adatkonverzió között, ha a műveletet a DataSet objektummal végezzük el, és ha az SQL Server 2000 beépített XML szolgáltatását vesszük igénybe.

Mellékelt példa megnyitása előtt szükséges egy XMLSpeedTest nevű virtuális könyvtár létrehozása, mely a példa könyvtárára mutat. Ehhez nyissa meg a mappa Tulajdonság ablakát és itt a Webmegosztás lapon engedélyezze a mappa megosztását olvasási és parancsfájlok futtatási jogával.
A program használata előtt fel kell telepíteni a SQLXML 3.0 Service Pack 1 programcsomagot. Ehhez olvassa el a cikk Kezdeti beállítások című bekezdését.
Kezdeti beállítások
A Microsoft elkészítette, és elérhetővé tette új, az MS SQL Server 2000 XML-t támogató funkcionalitásához igazodó névterét, melyet a NET Framework 1.1-es verziója már tartalmaz.
A Microsoft által elkészített névtér a Microsoft.Data.SqlXml nevet viseli, és cikkünk írásakor a következő Webcímen volt elérhető, mely természetesen megváltozhatott:
http://www.microsoft.com/downloads/details.aspx?FamilyId=4023DEEA-F179-45DE-B41D-84E4FF655A3B&displaylang=en.
Letöltve az állományt (sqlxml.msi) telepítenünk kell a .NET Framework alá. Az öntelepítő állomány erről gondoskodik, a használható .DLL állomány (Microsoft.Data.SqlXml.dll) alapértelmezésben a következő mappába kerül: %winroot%:\Program Files\SQLXML 3.0\bin\. Az MS SQL Server 2000 IIS-t konfiguráló, új beépülő modulját a %winroot%:\Program Files\SQLXML 3.0\ helyen érhetjük el. Ennek segítségével hozhatunk létre XML-t támogató virtuális könyvtárat Web-szerverünkön.
A telepített assembly bekerül a globális assembly-listába, így amikor referenciaként megadjuk alkalmazásainkban, akkor a globális palettáról kell kiválasztanunk, nem pedig valamilyen alternatív mappából.
A program fordítása előtt referenciaként meg kell adni a felhasznált névteret. Ehhez válasszuk tehát a Project - Add reference menüpontot, majd a megjelenő ablakban a .NET lapon keressük elő a Microsoft.Data.SqlXml elemet.
A névtér szolgáltatásainak eléréséhez a forrásállomány fejlécében meg kell adnunk egy hivatkozást a névtérre:
using Microsoft.Data.SqlXml;
Vizsgálat elvégzése
A vizsgálat lényege, hogy lemérjük az időeltérést két lekérdezés között. Az első műveletben a Northwind adatbázis Products táblájának adatait lekérdezzük 1000 alkalommal, és a DataSet objektum segítségével egy dataset.xml nevű állományba írjuk.
A második műveletben a fenti lekérdezést 1000 alkalommal a Microsoft.Data.SqlXml névtér SqlXmlCommand osztályának segítségével végezzük el, az eredményhalmazt egy sqlxml.xml nevű állományban helyezzük el.
Az alkalmazás WebFrom1.aspx lapján elhelyeztünk két nyomógombot, melyek közül az első lenyomásával a DataSet objektummal való adatlekérdezést és adatkonverziót végezhetjük el, míg a második nyomógombbal a SQLXML csomaghoz kapcsolódó műveletet.
A műveletek időtartalmát lemérjük, és az eredményt egy feliratban megjelenítjük.
A DataSet objektummal egyszerűen elvégezhető a művelet. Szükség van egy SqlDataAdapter objektumra, mely elvégzi a SELECT * FROM PRODUCTS SQL-utasítást, majd Fill metódusával elhelyezi annak eredményét a DataSet-ben.
DateTime startTime = DateTime.Now;
for(int i=0;i<1000;i++)
{
  ad = new SqlDataAdapter("SELECT * FROM Products",sqlConnection1);
  ad.Fill(ds);
A DataSet tartalmát egy Stream objektum felhasználásával írjuk az állományba.
  Stream xmlStream = File.OpenWrite(Server.MapPath("dataset.xml"));
  ds.WriteXml(xmlStream);
  xmlStream.Close();
}
DateTime endTime = DateTime.Now;
A startTime és az endTime objektumok időpontja között eltelt másodperceket jelenítjük meg a címkén.
TimeSpan fullSecond = endTime.Subtract(startTime);
Label4.Text = "Művelet időtartama: " + fullSecond.Seconds.ToString() + " másodperc";
A másik műveletben deklarálunk egy SqlXmlCommand objektumot, a konstruktorban megadva a kapcsolódás karakterláncát.
SqlXmlCommand command = new SqlXmlCommand("Provider=SQLOLEDB; Server=(local); database=Northwind;Integrated Security=SSPI;");
Megadjuk a szükséges paramétereket, valamint a lekérdezés utasítását.
command.RootTag = "Products";
command.CommandType = SqlXmlCommandType.Sql;
command.CommandText = "SELECT * FROM products FOR XML AUTO, ELEMENTS";
Majd 1000 alkalommal elvégezzük a lekérdezést, és a fájlba írást.
for(int i=0;i<1000;i++)
{
  Stream xmlStream = File.OpenWrite(Server.MapPath("sqlxml.xml"));
  command.ExecuteToStream(xmlStream);
  xmlStream.Close();
}
Az időtartam-lekérdezés a fenti módszerrel történik.
A vizsgálat eredményeképpen arra a következtetésre jutottunk, hogy a SQLXML csomaggal és szolgáltatásaival elvégzett művelet egyértelműen gyorsabb, az 1000 alkalommal elvégzett írásművelet esetén mintegy másfélszeres időkülönbség alakult ki a DataSet objektummal végzett művelet hátrányára. A műveleteket a lokális Web kiszolgálón futtatva, 33 másodpercig tartott a DataSet-el, míg 22 másodpercig a SqlXmlCommand osztállyal végzett procedúra.
Belátható, hogy egy másodpercenként több ezres kérésszámot regisztráló Web-alkalmazás számára létszükség, hogy a kiszolgáláshoz szükséges műveleteket a lehető legrövidebb idő alatt végezze el. A részműveletek időtartamának csökkenésével pedig jelentős időnyereség érhető el a szolgáltatás egészének tekintetében.

Könyv
Ez a cikk megtalálható ebben a könyvben: C# Software Offline 2003 évkönyv 309. oldal

Felhasználási feltételek
A Software Online szoftverfejlesztői magazin mindegyik cikke, minden megjelent képe, és egyéb publikált anyaga szerzői jog védelme alatt áll! Bármilyen formában történő másodlagos terjesztésük, közzétételük vagy felhasználásuk kizárólag a kiadó előzetes írásbeli engedélyével történhet!

Copyright © 1999-2012 Animare Software Kft. Minden jog fenntartva!
| Készült: Animare Stúdió | Adatvédelem | Kapcsolat |