[SQL] Alternatief voor distinct query *

Pagina: 1
Acties:

  • DukeBox
  • Registratie: April 2000
  • Niet online
Vraagje,

Bij de volgende query "SELECT distinct(date) FROM data" duurt het ruim 8 sec voordat er data uitrolt, is een distinct query altijd traag bij veel data ?

gegevens :
date: type date (0000-00-00)
rows: 2.430.431
index cardinality : 368

Zijn er eventueel alternatieven voor ?

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Zit er een index op die date? Zo niet dan zou je eens moeten overwegen of je idd een index op date aan moet maken :). Zo wel dan vind ik het eigenlijk een beetje raar dat het alsnog zo lang duurt...

Het zal iig niet aan de functie liggen

[ Voor 10% gewijzigd door .oisyn op 21-06-2004 01:48 ]

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

Wat voor een database gebruik je?

Who is John Galt?


Verwijderd

Kan het niet op deze "ranzige" manier?
SQL:
1
SELECT date FROM data GROUP BY date

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 10-05 18:53

Bosmonster

*zucht*

.oisyn schreef op 21 juni 2004 @ 01:48:
Zit er een index op die date? Zo niet dan zou je eens moeten overwegen of je idd een index op date aan moet maken :). Zo wel dan vind ik het eigenlijk een beetje raar dat het alsnog zo lang duurt...

Het zal iig niet aan de functie liggen
Aan zijn startpost te zien heeft ie inderdaad een index erop (index kardinaliteit: 368). Maar het gaat ook om 2.4 miljoen records..

Ik weet niet welke DB hij gebruikt.. maar misschien is die niet zo efficient als het gaat om distincts? De group by zou het proberen waard zijn.

  • DukeBox
  • Registratie: April 2000
  • Niet online
Sorry, gaat om MySQL..

Ben al iets verder gekomen, probleem ligt bij het sorteren

SELECT DISTINCT (date) FROM data ORDER BY date DESC = 8.1221 sec
SELECT DISTINCT (date) FROM data ORDER BY date ASC = 0.2866 sec

Raar....
Verwijderd schreef op 21 juni 2004 @ 15:53:
Kan het niet op deze "ranzige" manier?
SQL:
1
SELECT date FROM data GROUP BY date
Hierdoor gaat het al ee nstuk sneller, maar ik vond het idd niet 'netjes'.

[ Voor 121% gewijzigd door DukeBox op 21-06-2004 17:59 ]


  • bigbeng
  • Registratie: Augustus 2000
  • Laatst online: 26-11-2021
DukeBox schreef op 21 juni 2004 @ 17:52:
Sorry, gaat om MySQL..

Ben al iets verder gekomen, probleem ligt bij het sorteren

SELECT DISTINCT (date) FROM data ORDER BY date DESC = 8.1221 sec
SELECT DISTINCT (date) FROM data ORDER BY date ASC = 0.2866 sec

Raar....


[...]
Niet raar... Je hebt neem ik aan een gewone index erop liggen en niet een omgekeerde index? Kijk hier maar even:
http://dev.mysql.com/doc/mysql/en/CREATE_INDEX.html

  • DukeBox
  • Registratie: April 2000
  • Niet online
bigbeng schreef op 21 juni 2004 @ 18:04:
[...]


Niet raar... Je hebt neem ik aan een gewone index erop liggen en niet een omgekeerde index? Kijk hier maar even:
http://dev.mysql.com/doc/mysql/en/CREATE_INDEX.html
Jah, 'An index_col_name specification can end with ASC or DESC' dat moet het hem doen.. oracle en postgress doen dat zelf al (beide kanten op) wist niet eens dat dat kon met mysql. Super tnx :) namens alle minder wachtende stats freaks in /5

  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

Currently they are parsed but ignored; index values are always stored in ascending order
Heeft weinig zin dus. Overigens is het belangrijkste dat MySQL niet gaat filesorten (kijk met explain). Zorg dus voor een goede index (ook al wordt DESC nog genegeerd) en gebruik evt USE INDEX() om mysql een handje te helpen...

To study and not think is a waste. To think and not study is dangerous.


  • DukeBox
  • Registratie: April 2000
  • Niet online
slm schreef op 21 juni 2004 @ 21:51:
[...]
Heeft weinig zin dus. Overigens is het belangrijkste dat MySQL niet gaat filesorten (kijk met explain). Zorg dus voor een goede index (ook al wordt DESC nog genegeerd) en gebruik evt USE INDEX() om mysql een handje te helpen...
Uit de laatste cvs files zie ik dat er aan gewerkt is, heb het stukje erin gecompileerd, en het werkt (is nu ook 0,16 sec) echter lijkt mij niet geschikt voor productie. Heb nog een andere ingeving, ga het even proberen (ik laat het weten wat en of het iets is)
Ok, dit werkt perfect (totdat DESC indexes opgenomen worden in een prod. release) mits het natuurlijk voor een script taal zoals php/(mod)perl gebruikt wordt..

$query="SELECT distinct(date) FROM data ORDER BY date";
$result=mysql_query($query);
$counter=0;
while ($row=mysql_fetch_row($result))
{
$rev_date[$counter]=$row[0];
$counter++;
}
rsort($rev_date);
while (list ($key, $val) = each ($rev_date))
{
}
0.29 sec nog steeds :)

[ Voor 32% gewijzigd door DukeBox op 21-06-2004 22:47 ]


  • slm
  • Registratie: Januari 2003
  • Laatst online: 12-11-2023

slm

Overigens vind ik het wel vreemd dat mysql zo lang doet over de door jouw genoemde query:
SELECT DISTINCT (date) FROM data ORDER BY date DESC
aangezien je hier alleen een veld retourneert (date) waarop een index (als het goed is) staat en hierop ook sorteert. Normaal gezien moet je dan geen filesort krijgen en dus ook geen 8 seconden duren... Is dit de gehele query die je uitvoert? Is het een echt date veld?

To study and not think is a waste. To think and not study is dangerous.


  • DukeBox
  • Registratie: April 2000
  • Niet online
Ja, het is echt zo. Geloofde het eerst ook niet, maar het heeft te maken met de volgorde waarin de index is opgebouwd.
Pagina: 1