Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[SQL/ASP] Trage code/query, maar hoe oplossing vinden

Pagina: 1
Acties:

  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Topicstarter
Eerst even een korte uitleg.
We hebben een SQL query en roepen die aan via een classic ASP pagina.
Vervolgens lopen we met een for-lus eerst door de metadata heen van de teruggegeven data (dus alle kolomnamen en -type).
Dit gaat enorm traag. Het zijn +- 900 kolommen (ja, niet efficient, maar dat is nu even niet de discussie) en kan er voor zorgen dat IIS +- 67 seconden staat te stampen op die for-loop. Daarbij op te merken dat de query zelf binnen enkele milliseconden gewoon data teruggeeft. Dus de query an sich is snel, maar de verdere verwerking in ASP code is enorm traag.

Nu is het geval dat we het probleem hebben weten te traceren tot het volgende:
In de SQL query wordt, naast gewone kolommen, ook gebruik gemaakt van SQL Scalar valued functions.

SELECT Col1, Col2, Col3, dbo.Functie1(col4, col5), dbo.Functie2(col6, col7) FROM table inner join blabla....

Halen we de 2 scalar valued functies uit de query, gaat de for-loop weer als een malle.
We weten dus wat het probleem veroorzaakt, maar weten niet hoe het op te lossen, want we hebben geen flauw idee waar we op moeten googlen. Hoe heet dit fenomeen? Het lijkt erop dat wanneer we van het ADO.RecordSet object, de kolom typen en namen ophalen, de applicatie terug gaat naar de database om die info op te halen. Ik was altijd in de veronderstelling dat die metadata reeds in de geretourneerde RecordSet object aanwezig was.

Ik hoop dat iemand mijn probleem omschrijving snapt en me in een juiste richting kan duwen.

ps. Voor het eerst dat ik gewoon niet eens weet waar ik op moet zoeken, want ik kan het fenomeen geen naam geven.

Alvast bedankt voor de hulp.

[ Voor 5% gewijzigd door Sircuri op 12-09-2013 20:15 . Reden: toegevoegd dat de query zelf enorm snel is ]

Signature van nature


  • markvt
  • Registratie: Maart 2001
  • Laatst online: 20-11 23:59

markvt

Peppi Cola

Hoe zien die scalar valued functies eruit, doen die iets betrekkelijk simpels cq. kan dat andrers geschreven worden?

ik neem aan dat het om asp classic gaat.

Dit al geprobeerd:
code:
1
2
    Set recordsetBla = CreateObject("ADODB.Recordset")
    recordsetBla.cachesize=100


Waarbij cachesize ongeveer de size van je recordset is.

van-tilburg.info -=- meka (sega emulator) - Proud MEDION fanclub member - KOPPIG VOLHOUDEN !


  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Topicstarter
De functies zijn betrekkelijk eenvoudig en ook geoptimaliseerd, maar zijn als functies geschreven om te kunnen hergebruiken in andere queries. Het gaat inderdaad om ASP classic. Het geval is dat de query in kwestie slechts 1 record teruggeeft. Dit komt overeen met de standaard waarde van CacheSize. Want die is default 1. Dus ik verwacht dat dit niet het issue is. Ik ga het wel even uittesten.

Bedankt voor het meedenken in ieder geval.

Als ik maar wist waar ik op moest zoeken, dan kon ik gericht dingen proberen.

Signature van nature


  • markvt
  • Registratie: Maart 2001
  • Laatst online: 20-11 23:59

markvt

Peppi Cola

Hoe ziet die for loop eruit dan?

Watvoor metadata haal je eruit, heeft die kolom die uit die scalar komt een alias?

Gebruik je kolomnamen of kolomnummers in je code?

[ Voor 73% gewijzigd door markvt op 12-09-2013 20:35 ]

van-tilburg.info -=- meka (sega emulator) - Proud MEDION fanclub member - KOPPIG VOLHOUDEN !


  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Topicstarter
Pseudo code:

code:
1
2
3
4
5
6
7
8
9
10
11
var rsobj = CreateObject("ADO.RecordSet");
var rs = rsobj.open('query', connection-object, optie readonly, optie forwardonly);

for(var i = 0; i < rs.fields.length; i++)
{
    var colname = rs(i).name;
    var coltype = rs(i).type;
}

rs.close();
db.close()


dus openen van recordset met query gaat heel snel. Op het moment dat je dus de for-loop ingaat op bovenstaande manier, begint de enorme vertraging. Het lijkt er dus op dat de ASP code weer terug gaat naar de database in de FOR-loop. En dat zou ik heel vreemd vinden.

Toevoeging: ik zie dat je je vraag had aangepast. Dus nog even extra info:

de sql functie heeft inderdaad een alias. maar ik gebruik geen kolom namen in de RecordSet. Ik hoop dat je op basis van bovenstaande code een idee hebt van wat ik doe. Het is volgens mij gewoon standaard ASP/SQL code.

[ Voor 20% gewijzigd door Sircuri op 12-09-2013 20:47 ]

Signature van nature


  • markvt
  • Registratie: Maart 2001
  • Laatst online: 20-11 23:59

markvt

Peppi Cola

In theorie kan je dat zien bij je sql server of hij weer connect.

Maar wellicht kan je dit proberen voor je cursortype:

MSDN: Recordset Object (ADO)

Static cursor Provides a static copy of a set of records for you to use to find data or generate reports; always allows bookmarks and therefore allows all types of movement through the Recordset. Additions, changes, or deletions by other users will not be visible. This is the only type of cursor allowed when you open a client-side Recordset object.

code:
1
2
3
                Set recordsetBla = CreateObject("ADODB.Recordset")
                recordsetBla.CursorLocation = adUseClient
                recordsetBla.Open strSQL, CONNECTIONSTRING, adOpenStatic, , adCmdText


In theorie zou het met een getal sneller moeten werken dan met een kolomnaam (leesbaar is anders uiteraard).

[ Voor 20% gewijzigd door markvt op 12-09-2013 20:50 ]

van-tilburg.info -=- meka (sega emulator) - Proud MEDION fanclub member - KOPPIG VOLHOUDEN !


  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Topicstarter
Dat is verdorie wel een heel goed punt!! Ik gebruik nu de adOpenKeyset als cursor type. Ik gebruik momenteel geen options. Dus adCmdText staat niet in mijn aanroep naar "Open". Ook die ga ik eens even uitpluizen.
Bedankt. Ik hoop dat ik hier iets mee kan.

Signature van nature


  • Sircuri
  • Registratie: Oktober 2001
  • Niet online

Sircuri

Volledig Appelig

Topicstarter
@markvt: Als ik kudos zou kunnen geven had ik dat gedaan.

Dit was inderdaad de oplossing. Het gebruik van cursor type adOpenKeyset is niet geschikt voor gebruik in classic ASP pagina's, met bovenstaande resultaat als gevolg.
Bedankt voor de hulp!

Signature van nature

Pagina: 1