Avatar billede dnm Nybegynder
15. februar 2005 - 14:03 Der er 12 kommentarer

Med flere forspørgsler bliver siden langsom.

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?

mvh
Lasse
Avatar billede ldanielsen Nybegynder
15. februar 2005 - 14:09 #1
Du skal kende din database og den teknik du benytter til at hente data.

Det vigtigste er at du henter data som "read-only", ellers vil databasen låse indtil du slipper data fri igen.

Dernæst skal databasen indexeres.

Men lad mig se den ASP der henter data, så kan jeg 99% sikkert hjælpe
Avatar billede dnm Nybegynder
15. februar 2005 - 14:27 #2
<%
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)
%>

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Trench Details</title>
<style type="text/css">
<!--
<style type="text/css">
<!--
body,td,th {
    font-family: Tahoma, Verdana;
    font-size: 11px;
}
body {
    margin-left: 0px;
    margin-top: 0px;
    margin-right: 0px;
    margin-bottom: 0px;
    background-color: #e1e1e1;
}
.bdr {
    border: 1px solid #C7C7C7;
}
.style2 {
    font-size: 18px;
    font-weight: bold;
}
.dotted {
    border-bottom: 1px inset #CCCCCC;
}
-->
</style></head>

<body>

<table name="loading" id="loading" width="100%" height="100%"  border="0" cellpadding="10" cellspacing="1" bgcolor="#EAEAEA" style="display:none; ">
  <tr>
    <td><div align="center" style="font-size:14px;"><img src="images/loadingpic.gif"><br><br><strong>Loading new location, please wait. </strong><br><br><script language="javascript">
var bar1=createBar(200,6,'white',1,'grey','#74ACE8',20,20,4,'bar1.togglePause()');
bar1.togglePause();
</script></div></td>
  </tr>
</table>

<table name="main" id="main" width="100%"><tr><td>

<table width="100%"  border="0" cellspacing="5" cellpadding="3">
  <tr>
    <td width="60%" height="63" valign="top" bgcolor="#FFFFFF" class="bdr"><table width="100%"  border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td width="7%" height="55"><img src="Images/bigTrenchIcon.jpg" width="57" height="60"></td>
        <td width="93%" class="style2"><%=UCASE(Request.QueryString("Trench"))%></td>
      </tr>
    </table>
    </td>
  </tr>
</table>



<table name="main" id="main" width="100%"  border="0" cellspacing="5" cellpadding="3">
  <tr>
    <td width="60%" height="20" valign="top" bgcolor="#FFFFFF" class="bdr"><table width="100%"  border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td><table width="100%"  border="0" cellspacing="0" cellpadding="2">
            <tr>
              <td width="110"><strong>Duct</strong></td>
              <td width="65"><div align="right"><strong>Length</strong></div></td>
              <td width="110"><strong>&nbsp;Type</strong></td>
              <td width="20"><div align="center"><strong>#</strong></div></td>
              <td width="110"><strong>From</strong></td>
              <td>&nbsp;</td>
              <td width="110"><strong>To</strong></td>
              <td>&nbsp;</td>
            </tr>
           
<% do while not rs.EOF %>
            <tr>
              <td><%=Rs("name")%></td>
              <td><div align="right"><%=rs("geolen")%></div></td>
              <td>&nbsp;<%=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")
             
              Set des =  Conn.Execute(Sql)
              %>
              <td><%=des("fullname")%> </td>
              <td><%=des("street")%></td>
                            <%
              des.Close
              Set des = Nothing             
              %>
              <!-- To -->
            </tr>
<%
  Rs.MoveNext
  Loop
%>
          </table></td>
        </tr>
    </table></td>
  </tr>
</table>
<table name="main" id="main" width="100%"  border="0" cellspacing="5" cellpadding="3">
  <tr>
    <td width="60%" height="24" valign="top" bgcolor="#FFFFFF" class="bdr"><table width="100%"  border="0" cellspacing="0" cellpadding="0">
        <tr>
          <td><table width="100%"  border="0" cellspacing="0" cellpadding="2">
            <tr>
              <td width="110" height="16"><p>Total Length: </p>
                </td>
              <td width="65"><div align="right"><strong>2344,50m</strong></div></td>
              <td width="110">
                </td>
              <td width="20"><div align="center">
               
             
              </div></td>
              <td width="110">
                </td>
              <td>&nbsp;</td>
              <td width="110">
                </td>
              <td>&nbsp;</td>
            </tr>
          </table></td>
        </tr>
    </table></td>
  </tr>
</table>
</td></tr></table>
</body>
</html>
<%
    Rs.Close
    Set Rs = Nothing
    Conn.Close
    Set Conn = Nothing
%>
Avatar billede ldanielsen Nybegynder
15. februar 2005 - 14:40 #3
OK, se her:

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
Avatar billede ldanielsen Nybegynder
15. februar 2005 - 14:48 #4
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.

Begge dele sparer kræfter.
Avatar billede ldanielsen Nybegynder
15. februar 2005 - 14:54 #5
Endelig ser dine queries jo overvældende ud.

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

Dvs.
cmsys.ard_attr_red.a_value,
cmsys.component.category_id,
cmsys.component.component_name

- igen bare i den første

Hvilken database er det?
Avatar billede dnm Nybegynder
15. februar 2005 - 14:56 #6
Det et en Ingres 2 database
Avatar billede dnm Nybegynder
15. februar 2005 - 15:06 #7
Med indexer mener du indexering i databasen ikke?
Avatar billede ldanielsen Nybegynder
15. februar 2005 - 15:28 #8
Jo det gør jeg!

Men nu kender jeg jo slet ikke Ingres.

Måske er sagen en anden, men det jeg har sagt burde være sandt for alle relationelle databaser
Avatar billede dnm Nybegynder
16. februar 2005 - 08:50 #9
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.
Avatar billede ldanielsen Nybegynder
16. februar 2005 - 11:59 #10
OK så må du jo optimere i koden.

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 ...
Avatar billede dnm Nybegynder
17. februar 2005 - 08:22 #11
Det er fantastisk... Du må undskylde at jeg nævnte det ikke virkede. Men jeg fandt ud af at jeg havde rettet i den forkerte ASP fil.

Det virker FANTASTISK! siden har ændret sig fra 114 sekunder til 5.

Dit telefonnummer ville være rart at have i adressebogen *S*

Tak for hjælpen!
Avatar billede ldanielsen Nybegynder
17. februar 2005 - 10:46 #12
Selv tak

Mener du at det er det med cursortype (adOpenForwardOnly) og locktype (adLockReadOnly) der gjorde det? Bare af nysgerrighed.
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