Énorme différence de performances lors de l'utilisation de group by vs distinctes

Je suis d'effectuer quelques tests sur un HSQLDB serveur avec une table contenant plus de 500 000 entrées. La table n'a pas d'indices. Il y a 5000 distinctes d'affaires clés. J'ai besoin d'une liste d'entre eux. Naturellement, j'ai commencé avec un DISTINCT requête:

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

Il faut environ 90 secondes!!!

Puis j'ai essayé d'utiliser GROUP BY:

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

Et il prend 1 seconde!!!

À essayer de comprendre la différence, j'ai couru EXLAIN PLAN FOR mais il semble donner les mêmes informations pour les deux requêtes.

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

MODIFIER:
J'ai fait des tests supplémentaires. Avec 500 000 enregistrements dans HSQLDB avec tous distincts les clés d'entreprise, la performance de DISTINCT est maintenant mieux 3 secondes, vs GROUP BY qui a pris environ 9 secondes.

Dans MySQL les deux requêtes de préformation le même:

MySQL: 500 000 lignes - 5 000 affaires distinctes clés:
Les deux requêtes: 0,5 seconde
MySQL: 500 000 lignes - tous distincts les clés d'entreprise:
SELECT DISTINCT ... - 11 secondes
SELECT ... GROUP BY business_key - 13 secondes

De sorte que le problème est uniquement lié à HSQLDB.

Je serai très reconnaissant si quelqu'un peut expliquer pourquoi il existe une différence radicale.

  • s'il vous plaît montrer le résultat de EXPLAIN PLAN ET essayez de lancer le DISTINCTrequête APRÈS l'exécution de la GROUP BY pour voir si peut-être certains de la mise en cache est de biaiser le moment...
  • Étant donné que vous obtenez le même plan pour chaque requête, il semble que ce soit les données de la table ou le résultat a été mis en cache.
  • J'ai couru tant de fois qui croient que la mise en cache n'est pas un problème. Je suis annonce la EXLAIN PLAN FOR de sortie.
  • J'ai une idée, mais je suis vraiment pas sûr - s'il vous plaît essayer SELECT DISTINCT business_key FROM (SELECT business_key FROM memory WHERE concept <> 'case' or attrib <> 'status' or value <> 'closed') - ce qui devrait montrer le même niveau de performance que vous voyez avec le GROUP BY SI mon idée est la bonne.
  • toujours très lent - 94 secondes. Je vais courir les mêmes requêtes MySQL pour voir ce que va montrer
  • Ce n'est pas ce pinal dave dit. blog.sqlauthority.com/2007/03/29/...