2009-08-22 7 views
0

L'application de la requête a été modifiée, mais la théorie est la même.sybase - showplan réduit grandement les E/S estimées en ajoutant une autre table à la requête

4 tables:

états - liste des états (index sur l'état) magasins - magasins, et l'état où ils sont dans (index séparés sur l'état, magasin) store_orders - TIES un ordre dans un magasin (index séparés sur magasin, commande) order_statuses - a ordre et statut (index séparés sur commande, statut)

Je veux compter combien d'ordres sont dans chaque état pour un état particulier.

Une requête:

select os.order_status, compter (os.order_status) des magasins sto, store_order donc, order_statuses os où sto.state = 'PA' et sto.store = so.store et so.order = os.order groupe par os.order_status

dans l'application réelle, un showplan vient ici de retour avec environ E/S d'environ 500 000

Mais si je fais:

select os.order_status, compter (os.order_status) des Etats sta, sto magasins, store_order donc, order_statuses os où sta.state = 'PA' où sto.state = sta.state et sto.store = so.store et so.order = os.order groupe par os.order_status

le E/S est estimé à environ 2000, et tout ce que je l'ai fait changer la requête était joindre à la table des états à la table des magasins , et spécifiez la valeur exacte dans les états au lieu des magasins.

Le DBM n'aura-t-il pas encore à faire la même recherche de magasins, que je spécifie une valeur explicite ou que je rejoins une autre table avec cette valeur explicite? J'essaie de comprendre pourquoi les E/S estimées sont tellement plus élevées.

Je ne suis pas un administrateur de bases de données, mais j'essaie d'en apprendre le plus possible, parce que je ne cesse de parler de ce genre de choses, et je ne sais jamais pourquoi.

+0

Le showplan donnera les détails de ce qu'il fait qu'ils ne le font pas expliquer pourquoi l'IO diffère? – Mark

+0

Je suis allé à travers les deux showplans, et tous les mêmes index sont utilisés, les tailles de page étaient les mêmes, etc.La seule différence que j'ai vu était la table additionnelle, et l'E/S totale. Le showplan sybase ne montre que les E/S totales, pas les individus d'une table ou d'une autre. –

Répondre

3

Lazy Bob, pouvez-vous tourner également des statistiques d'entrées-sorties sur et puis ajoutez les résultats à la question:

set statistics io on

showplan par lui-même ne donnera pas cette information comme vous signalé dans les commentaires

également, s'il vous plaît envoyer une requête de travail exacte - idéalement, formaté correctement.

Votre requête dit « où sta.state = « PA » où sto.state = sta.state » et évidemment pas quelque chose que vous auriez pu courir

+0

Merci DVK ... c'était exactement la commande dont j'avais besoin. Après avoir examiné les statistiques d'E/S * réelles *, il s'avère, comme prévu, que l'ajout de la table supplémentaire entraîne en réalité un coût d'E/S plus élevé. –

+0

OK, pouvez-vous s'il vous plaît imprimer la sortie exacte des résultats des IO des requêtes et des plans de requête pour aider à comprendre pourquoi IO tombe en ajoutant une table? (le plus probable, il y a moins de scans d'une grande table) – DVK

Questions connexes