|
| 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
>
>
| |
|
|