Avatar billede sillemann Nybegynder
15. juni 2003 - 17:45 Der er 9 kommentarer

Meget langsomme tabelopslag ved flere "Select."

Hej,

Er der nogen der kan forklare hvorfor der går næsten 20 sek. med efterfølgende stump kode ?
---
Function checkloginDealer
    Dim c1, rsUser, rsDealer

    set c1 = createobject("ADODB.Connection")
    c1.Open "FILEDSN=Web.dsn"

    user = Request.Cookies("WEB")("user")

    if user="" then
        Response.Redirect Application("VRoot") & "/default.asp"
        Response.End
    end if

    set rsUser = c1.Execute("SELECT * FROM Person WHERE brugerkode=" & safestring(user))
    if rsUser.eof then
        Response.Redirect Application("VRoot") & "/default.asp"
        Response.End
    end if

    set rsDealer = c1.execute("SELECT * FROM Dealer WHERE DealerAccount =" & safestring(rsUser("DealerAccount")))
    if rsDealer.eof then
        Response.Redirect Application("VRoot") & "/default.asp"
        Response.End
    end if

    Response.Cookies("WEB")("user") = user
    Response.Cookies("WEB").Expires = Date() + 10
End function
---

Når jeg kun udfører eet opslag går den med normal hastighed, dvs. svartid under 1 sek.

På forhånd tak.
Avatar billede -master-d- Nybegynder
15. juni 2003 - 18:38 #1
Hvor stor er tabellen DealerAccount ?

For det lyder som om at du laver en forespørgsel som skal tælle mange records igennem.
Avatar billede -master-d- Nybegynder
15. juni 2003 - 18:40 #2
Lav evt. din sidste SELECT således

Her vil jeg kun have id og brugernavn ud af tabellen :

set rsDealer = c1.execute("SELECT id,brugernavn FROM Dealer WHERE DealerAccount =" & safestring(rsUser("DealerAccount")))

Det går en anelse hurtigere hvis man skriver alle de felter man vil have med i sin select.
Avatar billede -master-d- Nybegynder
15. juni 2003 - 18:58 #3
Så din løsning hedder vel egentlig bare :

---
Function checkloginDealer
    Dim c1, rsUser, rsDealer

    set c1 = createobject("ADODB.Connection")
    c1.Open "FILEDSN=Web.dsn"

    user = Request.Cookies("WEB")("user")

    if user="" then
        Response.Redirect Application("VRoot") & "/default.asp"
        Response.End
    end if

    set rsUser = c1.Execute("SELECT brugerkode FROM Person WHERE brugerkode=" & safestring(user))
    if rsUser.eof then
        Response.Redirect Application("VRoot") & "/default.asp"
        Response.End
    end if

    set rsDealer = c1.execute("SELECT DealerAccount FROM Dealer WHERE DealerAccount =" & safestring(rsUser("DealerAccount")))
    if rsDealer.eof then
        Response.Redirect Application("VRoot") & "/default.asp"
        Response.End
    end if

    Response.Cookies("WEB")("user") = user
    Response.Cookies("WEB").Expires = Date() + 10
End function
---
Avatar billede sillemann Nybegynder
15. juni 2003 - 19:42 #4
Hej master-d,

Jeg har prøvet at oprette en c2 connection
------
Dim c2

set c1 = createobject("ADODB.Connection")
c1.Open "FILEDSN=Web.dsn"

og udført erstattet c1 med c2 på

set rsDealer = c2.execute("SELECT DealerAccount FROM Dealer WHERE DealerAccount =" & safestring(rsUser("DealerAccount")))
------

Herved går tingene meget hurtige. Problemet er blot at jeg andre steder i hele webstedet anvender mange flere tabeller i mine asp sider.
Rent faktisk lægger jeg alle mine ADODB.connections ind i global.asa, samt
at jeg anvender 2 SQL baser.
Mit problem er at jeg forespørger flere gange gennem samme connection mange steder, og skulle til at oprette nye connections til mer eller mindre alle tabeller, er noget træls.
Avatar billede -master-d- Nybegynder
15. juni 2003 - 20:52 #5
Jo, du kan godt have ret i at det er træls at skulle rette det hele igennem, men det er nu trods alt den bedste løsning på problemet.

Det vigtige er at man kun spørger efter de oplysningerne man skal bruge og ikke mere end det.
Avatar billede roo104 Nybegynder
15. juni 2003 - 20:57 #6
index på brugerkode og DealerAccount kunne måske også have noget at sige. Det er ikke så stor en operation
Avatar billede coolcoder Nybegynder
15. juni 2003 - 21:18 #7
hvilken database bruger du?
Avatar billede sillemann Nybegynder
16. juni 2003 - 08:37 #8
Tak for svarende.

Jeg bruger MS-SQL.
Forhistorien er at mine tabeller har før været i MS-Access database,
men jeg har valgt af primært driftmæssige årsager at lægge tabellerne
ind i MS-SQL hvor jeg har oprettet en tilsvarende database.
Jeg havde overhovedet ingen svartidsproblemer med MS-Access.
Det eneste der er gjort ar at jeg har udskriftet min ODBC opsætning.
Jeg har prøvet at søge på symptomerne hos Microsoft, men intet fundet.
Det eneste er at man "drukner" i information - desværrer ...
Avatar billede coolcoder Nybegynder
16. juni 2003 - 19:27 #9
er det korrekt at første tabelopslag bruges til at finde en "DealerAccount" som derefter kan bruges til næste opslag? I så fald ville jeg lave begge opslag samtidig og dermed nøjes med et enkelt recordset.

Det må blive noget a'la:

sql = "SELECT DealerAccount FROM Dealer WHERE DealerAccount = (SELECT TOP 1 DealerAccount FROM Person WHERE brugerkode=" & safestring(user) & ")"

Derefter ville jeg til enhver tid åbne mit recordset på følgende måde:

set rs = server.createobject("adodb.recordset")
rs.open sql, conn, 1, 1
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester