/ Forside / Teknologi / Udvikling / Java / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Java
#NavnPoint
molokyle 3688
Klaudi 855
strarup 740
Forvirret 660
gøgeungen 500
Teil 373
Stouenberg 360
vnc 360
pmbruun 341
10  mccracken 320
Hvorfor kører det her langsomt
Fra : Thomas Mouritsen


Dato : 24-05-01 08:30

Hvis du behøver nogle kommentarer så skriv igen...

Mvh
Thomas Mouritsen


private static ListTavle find(ListTavleKomponent indListTavleKomponent,
boolean erSkabelon)
// private static ListTavle find()
{
ListTavle ud = new ListTavle();
boolean ok = false;

String query = "SELECT Tavle.Id , Tavle.TavleNr FROM Tavle WHERE
Tavle.ErSkabelon = " + erSkabelon;
ResultSet rs = executeQuery(query);
try
{
while (rs.next())
{
int tavleId = rs.getInt(1);
String tavleNr = rs.getString(2);

String query1 = "SELECT Count(TavleKomponent.KomponentId) FROM
TavleKomponent";
query1 += " WHERE TavleKomponent.TavleId = " + tavleId;
opfylder kriterierne
if (indListTavleKomponent.size() > 0)
query1 += " AND (";
boolean firstOr = true;

for (int i=0; i<indListTavleKomponent.size(); i++)
{
GUIFindTavle.FindTavleKomponent tempFindTavleKomponent =
(GUIFindTavle.FindTavleKomponent) indListTavleKomponent.inspect(i);
Komponent tempKomponent = tempFindTavleKomponent.getKomponent();
if (!(tempFindTavleKomponent.getValg().equalsIgnoreCase("0")))
{
if (firstOr)
firstOr = false;
else
query1 += " OR";

query1 += " ( TavleKomponent.KomponentId = " +
tempKomponent.getId() + " AND";
if (tempKomponent.getType() == 1)
{
if (tempFindTavleKomponent.getTolerance() == 0)
{
query1 += " Val(TavleKomponent.Valg) = " +
tempFindTavleKomponent.getValg();
}
else
{
// query1 += " (";
query1 += " Val(TavleKomponent.Valg) >= " +
tempFindTavleKomponent.getValg();
query1 += " AND";
float divident =
((Float.parseFloat(tempFindTavleKomponent.getTolerance()+"")/100f)+1f);
query1 += " Val(TavleKomponent.Valg) <= " + (int)
(Integer.parseInt(tempFindTavleKomponent.getValg()) * divident);
// System.out.println("Tolerance "+divident);
// query1 += " )";
}
}
else
{
query1 += " TavleKomponent.Valg = '" +
tempFindTavleKomponent.getValg() + "'";
}
query1 += " )";
}
}

if (indListTavleKomponent.size() > 0)
query1 += " )";
ResultSet rs1 = executeQuery(query1);
int count = 0;
while (rs1.next())
count = rs1.getInt(1);


String query3 = "SELECT Count(TavleKomponent.KomponentId) FROM
TavleKomponent";
query3 += " WHERE TavleKomponent.TavleId = " + tavleId;

int komponentAntal = -1;
ResultSet rs3 = executeQuery(query3);
if (rs3.next())
komponentAntal = rs3.getInt(1);

System.out.println(count + "/" + indListTavleKomponent.size() + "/" +
komponentAntal);

if (count == indListTavleKomponent.size() && count == komponentAntal)
ud.add(DBTavle.hent(tavleNr));
}
} catch (SQLException e)
{
e.printStackTrace();
}

return ud;
}





 
 
Niels Ull Harremoës (27-05-2001)
Kommentar
Fra : Niels Ull Harremoës


Dato : 27-05-01 21:44

Uden at gå i detaljer, ser det jo ud som om dinkode er noget a la

ResultSet rs = executeQuery("Select ....")
while (rs.next() ) {

ResultSet rs2 = executeQuery("Select ....")
while (rs2.next() ) {
...
ResultSet rs3 = executeQuery("Select ....")
... print en linie af resultatet ...
}
}

Det er ret dyrt at lave en SQL query. Desuden bruger du nok en del til på at
bygge søgeudtrykket hver gang - det afhænger jo stort set ikke af tavleid.
Prøv at finde en måde, hvor du først opbygge een query, der sammenskriver
det hele, fx noget a la

SELECT Tavle.Id , Tavle.TavleNr, Count(TavleKomponent.KomponentId) as
KompCount, Count(TK2.KomponentId) as KompTotal
FROM Tavle, TavleKomponent, TavleKomponent TK2
WHERE Tavle.ErSkabelon = true
and TavleKomponent.TavleId = Tavle.Id
and TK2.TavleId = Tavle.id
and ( ( TavleKomponent.KomponentId = 14 AND Val(TavleKomponent.Valg) =
300) OR
( TavleKomponent.KomponentId = 15 AND Val(TavleKomponent.Valg)
>= 500 and Val(TavleKomponent.Valg) <= 700)
)

og så kan du køre den i eet hug og lade databasen gøre alt arbejdet.

God fornøjelse
Niels Harremoës



Thomas Mouritsen (27-05-2001)
Kommentar
Fra : Thomas Mouritsen


Dato : 27-05-01 22:17

Jeg ret grøn i det med SQL. Jeg har ved et tilfælde sat bufferen til 8 MB i
stedet for de 2 MB den er som standard i ODBC driveren. Det speedede
søgningen noget op.

Ang det du skriver med at det er dyrt at lave en forespørgsel har jeg i
mellemtiden arbejdet noget på og er kommet frem til følgende 2
forespørgsler:
SELECT TavleKomponent.TavleId FROM Komponent INNER JOIN TavleKomponent ON
Komponent.Id=TavleKomponent.KomponentId WHERE ( ( TavleKomponent.KomponentId
= 125 AND TavleKomponent.Valg = 'J' ) OR ( TavleKomponent.KomponentId = 126
AND TavleKomponent.Valg = 'F' ) OR ( TavleKomponent.KomponentId = 127 AND
Val(TavleKomponent.Valg) = 1 ) OR ( TavleKomponent.KomponentId = 128 AND
Val(TavleKomponent.Valg) = 1 ) ) GROUP BY TavleKomponent.TavleId HAVING
(((Count(Komponent.Id))>=4 )) ORDER BY Count(TavleKomponent.KomponentId)
DESC

SELECT Tavle.TavleNr FROM Tavle INNER JOIN (Komponent INNER JOIN
TavleKomponent ON Komponent.Id = TavleKomponent.KomponentId) ON Tavle.Id =
TavleKomponent.TavleId WHERE (((Komponent.DIN)=0) AND Tavle.DINPlads >= 0.0
AND ( (TavleId) = 49 OR (TavleId) = 48 OR (TavleId) = 44 OR (TavleId) = 43
OR (TavleId) = 42 OR (TavleId) = 41 OR (TavleId) = 40) ) AND
(Tavle.erSkabelon = false) GROUP BY Tavle.TavleNr HAVING
(((Count(Komponent.DIN))=4 ))

Forespørgslerne er nogle eksempler - det er selvfølgelig ikke de samme
Komponent.Id og Komponent.Valg der bliver brugt hver gang - og antaller er
også ubestemt. TavleId'erne i 2. forespørgsel er resultaterne fra den
første.

Jeg er ganske sikker på at det kan lade sig gøre at lave dem til 1
forespørgsel. Men det er et tilfredsstillende resultat jeg er kommet frem
til. Sådan som det var bygget op før skulle jeg foretage forespørgsler for
hver tavle - nu inkluderer forespørgslerne alle tavlerne. Jeg tror at det er
lidt den samme ide vi begge har.

Jeg siger mange tak for hjælpen - hvis du har lyst må du gerne kommentere
mine nye forespørgsler.

Thomas Mouritsen

"Niels Ull Harremoës" <nielsull@mail.dk> skrev i en meddelelse
news:9erokr$9k7$1@news.inet.tele.dk...
> Uden at gå i detaljer, ser det jo ud som om dinkode er noget a la
>
> ResultSet rs = executeQuery("Select ....")
> while (rs.next() ) {
>
> ResultSet rs2 = executeQuery("Select ....")
> while (rs2.next() ) {
> ...
> ResultSet rs3 = executeQuery("Select ....")
> ... print en linie af resultatet ...
> }
> }
>
> Det er ret dyrt at lave en SQL query. Desuden bruger du nok en del til på
at
> bygge søgeudtrykket hver gang - det afhænger jo stort set ikke af tavleid.
> Prøv at finde en måde, hvor du først opbygge een query, der sammenskriver
> det hele, fx noget a la
>
> SELECT Tavle.Id , Tavle.TavleNr, Count(TavleKomponent.KomponentId) as
> KompCount, Count(TK2.KomponentId) as KompTotal
> FROM Tavle, TavleKomponent, TavleKomponent TK2
> WHERE Tavle.ErSkabelon = true
> and TavleKomponent.TavleId = Tavle.Id
> and TK2.TavleId = Tavle.id
> and ( ( TavleKomponent.KomponentId = 14 AND Val(TavleKomponent.Valg) =
> 300) OR
> ( TavleKomponent.KomponentId = 15 AND Val(TavleKomponent.Valg)
> >= 500 and Val(TavleKomponent.Valg) <= 700)
> )
>
> og så kan du køre den i eet hug og lade databasen gøre alt arbejdet.
>
> God fornøjelse
> Niels Harremoës
>
>



Søg
Reklame
Statistik
Spørgsmål : 177552
Tips : 31968
Nyheder : 719565
Indlæg : 6408849
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste