2010-06-21 3 views
2

INFORMIX-SE 7.32:Existe-t-il une méthode meilleure/plus rapide pour localiser une ligne avec la valeur maximale dans une colonne?

J'ai une table de transaction avec environ 5 000 nrows. Transaction.ticket_number [INT] est une colonne qui est mise à jour avec le prochain numéro de ticket séquentiel disponible chaque fois qu'une ligne spécifique est mise à jour. La colonne est unique indexée. J'utilise actuellement la suivante instruction SELECT pour localiser le maximum (transaction.ticket_num):

SELECT MAX(transaction.ticket_number) FROM transaction; 

Depuis la ligne étant mise à jour est regroupée acording au transaction.fk_id [INT], où il est rejoint au client. pk_id [SERIAL], la ligne ne se trouve pas physiquement à la fin de la table de transaction, elle réside plutôt dans le groupe de lignes de transaction appartenant à chaque client particulier. J'ai choisi de regrouper les transactions appartenant à chaque client parce que le temps de réponse est plus rapide lorsque je fais défiler chaque transaction client. Existe-t-il un moyen plus rapide de localiser le max (transaction.ticket_number) avec la requête ci-dessus? Un index unique sur la transaction (ticket_number) descendant améliorerait-il l'accès ou est-il complètement parcouru du début à la fin?

Répondre

1

Sur une table de seulement 5000 lignes sur une machine moderne, il est peu probable que vous puissiez mesurer la différence de performance des différentes techniques, en particulier dans le scénario mono-utilisateur auquel je crois que vous êtes confronté. Même si les 5000 lignes étaient toutes à la taille maximale autorisée (un peu moins de 32 Ko), vous auriez besoin de 160 Mo de données, ce qui pourrait facilement s'intégrer dans les caches de la machine. En pratique, je suis sûr que vos lignes sont beaucoup plus petites, et vous n'auriez jamais besoin de toutes les données dans le cache.

Sauf si vous avez un problème de performances démontrable, accédez à l'index de la colonne du numéro de ticket et faites confiance au serveur (Informix SE) pour faire son travail. Si vous avez un problème démontrable, affichez les plans de requête à partir de la sortie SET EXPLAIN. Cependant, il existe des limites majeures sur la façon dont vous pouvez modifier les performances de SE: il s'agit d'une technologie install-and-go avec des exigences minimales de réglage. Je ne suis pas sûr qu'Informix SE prenne en charge la notation 'FIRST n' (aka 'TOP n') prise en charge par Informix Dynamic Server; Je ne crois pas.

+0

Oui, utilisateur unique, rowsize = 512, pas de support pour FIRST dans SE. Est-ce que ISQL (c.-à-d.effectuer et as) utiliser IDS au lieu de SE? .. Mon application est seul utilisateur, mais avec une> 500K nrows historique table de transaction DSS résidant dans un db séparé, mais on ne sait jamais quand un client peut vouloir une db multi-utilisateurs distribués pour toutes leurs branches de prêteur sur gages. –

+0

@Frank: oui, ISQL fonctionne très bien avec IDS, sous réserve de la mise en garde que Perform ne fonctionnera pas avec des tables fragmentés à moins qu'ils sont créés avec la clause WITH rowids. Mais, pour la migration directe, vous n'avez des tables fragmentées et vous seriez bien. ! Ce –

+0

est génial .. Je comptais « FRAGMENT PAR EXPRESSION customer.date_last_activity

1

En raison de colonnes Nullable et d'autres facteurs, l'utilisation des index, etc, vous pouvez trouver souvent le suivant serait plus rapide, mais normalement negligably ...

SELECT TOP 1 ticket_number FROM transaction ORDER BY ticket_number DESCENDING 

Je suis aussi incertain de savoir si vous avez réellement un index sur [ticket_number]? Ou avez-vous juste une contrainte UNIQUE? Une contrainte n'aidera pas à déterminer un MAX, mais un INDEX le fera.

Dans le cas où un index existe avec ticket_number comme la première colonne indexable:
- Un index recherche/recherche serait probablement utilisé, ne pas avoir besoin de scanner les autres valeurs du tout

Dans le cas où un INDEX existe avec ticket_number pas comme la première colonne indexable:
- dans le cas où il n'existe INDEX utilisable Une analyse d'index se produirait probablement, vérifier chaque entrée unique dans l'index

:
- toute la table serait scanné

+0

Si j'ai plusieurs index sur des colonnes différentes dans la même table, est-ce que cela importe dans quel ordre j'ai créé chacun des index? Dans SE, j'ai remarqué que tous les index appartenant à une table sont stockés dans un fichier IDX, et ce fichier sinle se développe si vous créez plus d'index. –

Questions connexes