webForumDet fria alternativet

Den optimala hämtningen

ASP

7 svar · 178 visningar · startad av Jörgen HP

Medlem sedan feb. 20012 412 inlägg
Frågan#1

tja!

Läste en intressant artikel i DMZ som kom idag om att optimera ASP-kod. Artiklen hette "Att skriva effektiv ASP" och kändes nyttig för mig.

I ett avsnitt togs det upp ett ämne som diskuterats ganska hett här från och till. Tänkte dela med mig till er, deras synpunkt på den optimala hämtningen från en databas.


<%
Const adOpenForwardOnly = 0
Const adLockReadOnly = 1
Const adCmdText = &H0001

strConn = "DSN=bla ha bla ha"
Set objConn = Server.CreateObject("ADOdb.Connection")
Set objRS = Server.CreateObject("ADOdb.Recordset")

objconn.Open(strConn)
objRS.Open(strSQL, strConn, AdOpenForwardOnly, AdlockReadOnly, AdCmdText)

strSQL = "SELECT req_Username, Req_Email, LastVisit " & _
"FROM Profil " & _
"ORDER BY req_Username DESC"

arrMyData = objRS.GetRows()

objRS.Close()
Set objRS = Nothing
objConn.Close()
Set objConn = Nothing 

%>

En kort förklaring till varför just denna var den optimala kommer här:

  1. Den öppna databaskopplingen skickas som argument till Openmetoden av recsetobjectet. Fördel: Det kommer aldrig finnas 2 kopior av recordsetet i minnet, vilket alltid blir fallet om man använder execute metoden.

  2. Användandet av konstanter i recordset-objecten. I form av AdOpenForwardOnly, AdlockReadOnly, AdCmdText. Enligt källan den snabbaste typen av cursor man kan öppna.

Detta blev mkt kort, men jag orkade inte skriva längre.

Källa: Artikeln "Att skriva effektiv ASP" från DMZ.

vänligen Jörgen

------------------
*** Var går gränsen mellan långa kortbyxor och korta långbyxor? ***

Medlem sedan dec. 1999653 inlägg
#2

fan då, sådär skulle de inte riktigt sett ut om jag fått bestämma.. :)
intressant iallafall..

vet du hur de har utfört testen?
hade de nån jämförelse på olika öppningstyper?

mvh.

------------------
void[]
stash/$gu&-public(querystring)/n int{}bind "2" "say i own!" :)

Medlem sedan dec. 19998 577 inlägg
#3

Hmm... nä, det där tycker inte jag ser optimalt ut, varken ur kodarsynpunkt eller prestanda, jag skulle nog säga att detta är mer optimalt:

<%
strSQL = "SELECT req_Username, Req_Email, LastVisit FROM Profil ORDER BY req_Username DESC"
strConn = "DSN=bla"
Set objConn = Server.CreateObject("ADOdb.Connection")
objconn.Open strConn
arrMyData = objConn.Execute(strSQL).GetRows()
objConn.Close()
Set objConn = Nothing
%>

------------------
Vide rox = new Vide();
rox.learn("C#");

webeye.nu

[Redigerat av Vide den 15 jun 2001]

Medlem sedan jan. 2001510 inlägg
#4

Det jag undrar är hur du gör två sökningar om du använder objRS.Open för att öppna ett recordset? Och om det går vad är då execute fortfarande det snabbaste sättet?

/JANspeed

Medlem sedan feb. 20001 590 inlägg
#5

Håller med Vide.
Recordset skall man endast försöka använda sig av när man behöver låsa poster, och man behöver kunna stega valfritt mellan dom.
Ska man bara hämta data är Recordset helt onödigt.

Rent prestandamässigt så är det väl bara att testa.. :-)

/T

------------------
WRITE_PORT_ULONG(devExt->Mymessage,SMART_WRITE_ACK);

Medlem sedan feb. 20012 412 inlägg
#6

Glömde en liten detalj.
3) Det är enbart vid select man har nytta av att skapa ett recordset, vid update, insert och delete behövs inte detta. På grund av att man inte har nytta av ett tomt recordset. Och då kunde man med fördel skriva:


Set objConn = Server.CreateObject("ADOdb.Connection")

With objConn
.open strConn
.Execute
strSQL, intRecs, AdCmdText + adExecuteNoRecords
.Close
End With
Set objConn = Nothing

Jag vet inte, jag är inte så hemma i ASP än så länge, men det är en intressant sak att diskutera.

mvh

Jörgen

------------------
*** Var går gränsen mellan långa kortbyxor och korta långbyxor? ***

Medlem sedan maj 2000175 inlägg
Medlem sedan dec. 19998 577 inlägg
#8

Det är enbart vid select man har nytta av att skapa ett recordset, vid update, insert och delete behövs inte detta. På grund av att man inte har nytta av ett tomt recordset.

Jag hoppas ingen har sagt något annat... :)

------------------
Vide rox = new Vide();
rox.learn("C#");

webeye.nu

282 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
154 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
151 ms — ändringar (db)