[SQL] Efficiente query-iterator

Pagina: 1
Acties:

  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
Ik wil de performance van mijn SELECT queries op een zeer grote database verbeteren door de resultaten van een query in een interval te omschrijven. Hiervoor denk ik dat het het beste is om de gemiddelde spreiding van ID's uit mijn tables te berekenen (deze zijn niet altijd opeenvolgend) en deze als opeenvolgende limiet te stellen.

het is de bedoeling dat je zoiets krijg als:
code:
1
2
select i.id, i.universalname, i.secondid, i.comments as universe
 from items i WHERE i.id >= LOID AND i.id < HIID ORDER BY i.id

LOID en HIID vervang ik in mijn java-code door de intervalswaarden, ik weet alleen niet hoe ik deze kan berekenen de query zelf kan aangepast worden, werken met stringfuncties heeft in mijn geval helaas geen zin, ik gebruik mysql 4.1 dus misschien kan ik het oplossen dmv subqueries?

Bijvoorbaat dank voor jullie informatie

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • The Eagle
  • Registratie: Januari 2002
  • Laatst online: 21:22

The Eagle

I wear my sunglasses at night

Ik zou als ik jou was het probleem eerst een zoeken in indexen en unieke keys. Dat wil vaak heel veel schelen, ipv de query te optimizen :)

Al is het nieuws nog zo slecht, het wordt leuker als je het op zijn Brabants zegt :)


Verwijderd

Bedoel je dat je record paging wil maken?

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:38
Waarom wil je nu precies die limieten gebruiken? Wil je niet liever een LIMIT clause gebruiken? Dat is minstens net zo efficient en een stuk minder gedoe.

  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
Soultaker schreef op vrijdag 30 september 2005 @ 14:45:
Waarom wil je nu precies die limieten gebruiken? Wil je niet liever een LIMIT clause gebruiken? Dat is minstens net zo efficient en een stuk minder gedoe.
LIMIT of die WHERE clause komen volgens mij op hetzelfde effect neer, echter wil ik dat de queries voldoen aan de SQL standaard, LIMIT(n1, n2) hoort daar niet bij.

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-04 13:16
Hmm, waarom wil je persé dat de queries aan de sql standaard voldoen ?
Zo mis je heel wat functionaliteit....

https://fgheysels.github.io/


  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
Verwijderd schreef op vrijdag 30 september 2005 @ 14:37:
Bedoel je dat je record paging wil maken?
Bedankt voor je tip, ik heb even gegoogle't op deze term en heb inderdaad de oplossing gevonden binnen Java.
code:
1
2
3
4
5
6
7
PreparedStatement StatementrsEvents = connection.prepareStatement(  
queryText, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

StatementrsEvents.setFetchSize(maxNmbrOfQueries);
StatementrsEvents.setMaxRows(maxNmbrOfQueries);

ResultSet resultSet = StatementrsEvents.executeQuery();

Helaas zit ik nu met het probleem dat Java out of HEAP space raakt door het processen van de grote database (1,5 miljoen records).

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • oogapp0ltje
  • Registratie: Januari 2001
  • Niet online
whoami schreef op vrijdag 30 september 2005 @ 15:16:
Hmm, waarom wil je persé dat de queries aan de sql standaard voldoen ?
Zo mis je heel wat functionaliteit....
Om de compatibiliteit met andere DBMSen te vegroten.

| To acknowledge what is known as known and what is not known as known is knowledge. |


  • whoami
  • Registratie: December 2000
  • Laatst online: 29-04 13:16
Ravenof schreef op vrijdag 30 september 2005 @ 15:18:
[...]

Om de compatibiliteit met andere DBMSen te vegroten.
Mja, dan ben je imo op de verkeerde manier bezig.
Als je op deze manier de compatibiliteit wilt verhogen, ben je 'masochistisch' bezig. Je moet je dan idd aan de standaard houden, en dan moet je soms heksentoeren uithalen, terwijl er in iedere implementatie wel een functie voor bestaat.
Je kan dan beter voor ieder DBMS dat je wilt ondersteunen, en andere DAL laag schrijven.

https://fgheysels.github.io/


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:38
Ravenof schreef op vrijdag 30 september 2005 @ 14:47:
[...]
LIMIT of die WHERE clause komen volgens mij op hetzelfde effect neer, echter wil ik dat de queries voldoen aan de SQL standaard, LIMIT(n1, n2) hoort daar niet bij.
Maar LIMIT n toch wel? Als je dan alleen van voren naar achter de lijst wil doorlopen kun je ID > i LIMIT n doen, waarbij n het aantal rijen is dat je wil hebben en i het laatste id van je vorige batch. Je neemt dan steeds de volgende 'n' rijen. (Maar dat werkt niet als je een batch 'uit het midden' wil nemen natuurlijk).

[ Voor 6% gewijzigd door Soultaker op 30-09-2005 16:09 ]


  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Op MySQL en PostgreSQL heb je de LIMIT n functie.
Bij Oracle doe je 'WHERE rowid<n'
Bij DB2 doe je 'FETCH FIRST n ROWS ONLY'

En inderdaad: met een DAL (zoals Hibernate) ben je van al het gelazer af, en werkt je query (in het geval van Hibernate schrijf je dan HQL ipv SQL) op alle ondersteunde databaseplatforms.

Siditamentis astuentis pactum.

Pagina: 1