Jeg bliver nød til at benytte mig af flere sql queries på samme ASP side for at hive alle de data ud jeg ønsker.
1. Henter jeg alle "vejene" 2. Finde jeg ud af hvormange ( COUNT() ) "veje" der har samme fra og til destination. 3. Henter jeg Krydsene vej fra en anden tabel.
Ved den første forespørgsel køre siden meget hurtigt. Men allerede da jeg udføre den anden forespørgsel så begynder siden at gå helt i knæ. ved alle 3 forespørgsler tager det siden. 114 sek at loade.
Er der på nogen måde at jeg kan speede min IIS op. Eller er det i ASP koden jeg kan gøre et eller andet?
<% Dim Conn Set Conn = Server.CreateObject("ADODB.Connection") Conn.Open "DRIVER={Ingres};SERVER=GC-CM1;DATABASE=cm_gc;SERVERTYPE=INGRES;ROLENAME=cmselect" Sql = "SELECT cmsys.component.component_name As Name, cmsys.component.geolen, cmsys.component_type.component_type_name As Type, cmsys.component.designation_id AS des_from, cmsys.component.designation_id_to AS des_to FROM cmsys.component, cmsys.ard_attr_red, cmsys.component_type, cmsys.dfn_desig_fullname WHERE (cmsys.component_type.component_type_id = cmsys.component.component_type_id AND cmsys.dfn_desig_fullname.designation_id = cmsys.component.designation_id AND cmsys.ard_attr_red.link_id = cmsys.component.component_id) AND (((cmsys.ard_attr_red.a_value = '" & Request.QueryString("Trench") & "') AND (cmsys.component.category_id = 9) AND (cmsys.component.component_name LIKE '%a-%')))" Set rs = Conn.Execute(Sql) %>
<% do while not rs.EOF %> <tr> <td><%=Rs("name")%></td> <td><div align="right"><%=rs("geolen")%></div></td> <td> <%=Rs("type")%> </td>
<!-- Antal Rør --> <td><div align="center">
<% Sql = "SELECT COUNT(*) As Total FROM cmsys.component WHERE designation_id = " & Rs("des_from") & " AND designation_id_to = " & Rs("des_to") Set cnt = Conn.Execute(Sql) Response.write(cnt("Total")) Cnt.Close Set Cnt = Nothing %>
</div></td> <!-- Antal Rør -->
<!-- From -->
<% Sql = "SELECT dfn_desig_fullname.designation_id, dfn_desig_fullname.fullname, adr_object.street " & _ "FROM (cmsys.dfn_desig_fullname dfn_desig_fullname LEFT OUTER JOIN cmsys.adr_link adr_link ON dfn_desig_fullname.designation_id=adr_link.object_id) LEFT OUTER JOIN cmsys.adr_object adr_object ON adr_link.adr_id=adr_object.adr_id " & _ "WHERE dfn_desig_fullname.designation_id=" & Rs("des_from")
Set des = Conn.Execute(Sql) %> <td><%=des("fullname")%> </td> <td><%=des("street")%></td> <% des.Close Set des = Nothing %> <!-- From -->
<!-- To --> <% Sql = "SELECT dfn_desig_fullname.designation_id, dfn_desig_fullname.fullname, adr_object.street " & _ "FROM (cmsys.dfn_desig_fullname dfn_desig_fullname LEFT OUTER JOIN cmsys.adr_link adr_link ON dfn_desig_fullname.designation_id=adr_link.object_id) LEFT OUTER JOIN cmsys.adr_object adr_object ON adr_link.adr_id=adr_object.adr_id " & _ "WHERE dfn_desig_fullname.designation_id=" & Rs("des_to")
Dim Conn, Com Set Conn = Server.CreateObject("ADODB.Connection") Set Com = Server.CreateObject("ADODB.Command") Conn.Open "DRIVER={Ingres};SERVER=GC-CM1;DATABASE=cm_gc;SERVERTYPE=INGRES;ROLENAME=cmselect" Com.ActiveConnection = Conn 'Nu er databassen åben
'Nu hælder jeg SQL i Command-objectet Com.CommandText = "SELECT cmsys.component.component_name As Name, cmsys.component.geolen, cmsys.component_type.component_type_name As Type, cmsys.component.designation_id AS des_from, cmsys.component.designation_id_to AS des_to FROM cmsys.component, cmsys.ard_attr_red, cmsys.component_type, cmsys.dfn_desig_fullname WHERE (cmsys.component_type.component_type_id = cmsys.component.component_type_id AND cmsys.dfn_desig_fullname.designation_id = cmsys.component.designation_id AND cmsys.ard_attr_red.link_id = cmsys.component.component_id) AND (((cmsys.ard_attr_red.a_value = '" & Request.QueryString("Trench") & "') AND (cmsys.component.category_id = 9) AND (cmsys.component.component_name LIKE '%a-%')))"
'Nu laver jeg mit Recordset, og Åbner det skrivebeskyttet Dim Rs Set Rs = Server.CreateObject("ADODB.RecordSet") Rs.Open Com, , 0, 1
' Så snart jeg er færdig med mit recordset: Rs.Close
'Hvis der er brug for det kan du nu åbne Rs igen, med noget andet SQL som Com.CommandText 'Ellers skal du fjerne det: Set Rs = Nothing
'Og til slut: Conn.Close Set Conn = Nothing Set Com = Nothing
Fidusen er IKKE at bruge Conn.Execute. Du får nemlig ikke angivet om du vil læse data eller du vil skrive data til databasen. Resultatet er et recordset med en masse faciliteter som du ikke bruger.
Hvis du laver et Command object og bruger syntaksen Rs.Open Com, , 0, 1
så får du et recordset med et minimum af faciliteter.
0 betyder at du får en cursortype der hedder adOpenForwardOnly. Du vil ikke kunne sige Rs.MovePrevious, og du vil heller ikke kunne sige Rs.RecordCount
1 betyder at du får en locktype der hedder adLockReadOnly. Databasen regner med at data ikke bliver ændret. Hvis en anden bruger vil ændre data, mens du stadig "har" dem, så får han lov til det.
De skal være indexer på alle de kolonner der er involverede i at joine. Dvs bl. a. cmsys.component_type.component_type_id, cmsys.component.component_type_id, cmsys.dfn_desig_fullname.designation_id, cmsys.component.designation_id, cmsys.ard_attr_red.link_id og cmsys.component.component_id
- bare i den føørste query
De skal også (helst) være index på felter som bruges i WHERE
Jeg har forsøgt mig med din alternative løsning til hvordan jeg hiver recordsettet ud og det lader ikke til at have hjulpet. Selve databasen er en tilhøre en applikation og er ikke en database jeg selv har lavet, derfor kan jeg ikke ændre i den.
1: Man skal aldrig hente mere end der er brug for. Og da det ikke lader til at der skal returneres mere end en række vil jeg foreslå at du i alle 3 tilfælde siger
SELECT TOP 1 SELECT cmsys ... osv
2: Alle dine WHERE, overvej om de alle er nødvendige.
3: Det første recordset lader du være åbent, og det er fordi du skal bruge nogle værdier fra det senere. Du kan i stedet hente disse værdier ud med det samme og gemme dem i variabler, og så lukke recordsettet igen.
Dim des_form des_form = Rs("des_from")
og senere bruger du så : ... WHERE designation_id = " & des_from & " AND ...
Mener du at det er det med cursortype (adOpenForwardOnly) og locktype (adLockReadOnly) der gjorde det? Bare af nysgerrighed.
Synes godt om
Ny brugerNybegynder
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.