Grande differenza di prestazioni quando si utilizza il gruppo per il vs distinto

Sto eseguendo alcuni test su un server HSQLDB con una tabella contenente 500.000 voci. La tabella non ha indici. Ci sono 5000 chiavi aziendali distinte. Ho bisogno di una lista di loro. Naturalmente ho iniziato con una query DISTINCT :

 SELECT DISTINCT business_key FROM memory WHERE concept  'case' or attrib  'status' or value  'closed' 

Ci vogliono circa 90 secondi !!!

Poi ho provato a utilizzare GROUP BY :

 SELECT business_key FROM memory WHERE concept  'case' or attrib  'status' or value  'closed' GROUP BY business_key 

E ci vuole 1 secondo !!!

Cercando di capire la differenza, ho eseguito EXLAIN PLAN FOR ma sembra fornire le stesse informazioni per entrambe le query.

EXLAIN PLAN FOR DISTINCT ...

 isAggregated=[false] columns=[ COLUMN: PUBLIC.MEMORY.BUSINESS_KEY ] [range variable 1 join type=INNER table=MEMORY alias=M access=FULL SCAN condition = [ index=SYS_IDX_SYS_PK_10057_10058 other condition=[ OR arg_left=[ OR arg_left=[ NOT_EQUAL arg_left=[ COLUMN: PUBLIC.MEMORY.CONCEPT] arg_right=[ VALUE = case, TYPE = CHARACTER]] arg_right=[ NOT_EQUAL arg_left=[ COLUMN: PUBLIC.MEMORY.ATTRIB] arg_right=[ VALUE = status, TYPE = CHARACTER]]] arg_right=[ NOT_EQUAL arg_left=[ COLUMN: PUBLIC.MEMORY.VALUE] arg_right=[ VALUE = closed, TYPE = CHARACTER]]] ] ]] PARAMETERS=[] SUBQUERIES[] Object References PUBLIC.MEMORY PUBLIC.MEMORY.CONCEPT PUBLIC.MEMORY.ATTRIB PUBLIC.MEMORY.VALUE PUBLIC.MEMORY.BUSINESS_KEY Read Locks PUBLIC.MEMORY WriteLocks 

EXLAIN PLAN FOR SELECT ... GROUP BY ...

 isDistinctSelect=[false] isGrouped=[true] isAggregated=[false] columns=[ COLUMN: PUBLIC.MEMORY.BUSINESS_KEY ] [range variable 1 join type=INNER table=MEMORY alias=M access=FULL SCAN condition = [ index=SYS_IDX_SYS_PK_10057_10058 other condition=[ OR arg_left=[ OR arg_left=[ NOT_EQUAL arg_left=[ COLUMN: PUBLIC.MEMORY.CONCEPT] arg_right=[ VALUE = case, TYPE = CHARACTER]] arg_right=[ NOT_EQUAL arg_left=[ COLUMN: PUBLIC.MEMORY.ATTRIB] arg_right=[ VALUE = status, TYPE = CHARACTER]]] arg_right=[ NOT_EQUAL arg_left=[ COLUMN: PUBLIC.MEMORY.VALUE] arg_right=[ VALUE = closed, TYPE = CHARACTER]]] ] ]] groupColumns=[ COLUMN: PUBLIC.MEMORY.BUSINESS_KEY] PARAMETERS=[] SUBQUERIES[] Object References PUBLIC.MEMORY PUBLIC.MEMORY.CONCEPT PUBLIC.MEMORY.ATTRIB PUBLIC.MEMORY.VALUE PUBLIC.MEMORY.BUSINESS_KEY Read Locks PUBLIC.MEMORY WriteLocks 

EDIT : ho fatto ulteriori test. Con 500.000 record in HSQLDB con tutte le chiavi aziendali distinte, le prestazioni di DISTINCT ora sono migliori – 3 secondi, rispetto a GROUP BY che ha richiesto circa 9 secondi.

In MySQL entrambe le query preformano la stessa cosa:

MySQL: 500 000 righe – 5 000 chiavi aziendali distinte: entrambe le query: 0,5 secondi MySQL: 500 000 righe: tutte le chiavi aziendali distinte: SELECT DISTINCT ... – 11 secondi SELECT ... GROUP BY business_key – 13 secondi

Quindi il problema riguarda solo HSQLDB .

Sarò molto grato se qualcuno possa spiegare perché c’è una differenza così drastica.