|
|||||||
| Optimisations Forum de conseils pour les optimisations des performances SGBD |
|
|
Publicité ' | |||||||||||||||||||||||||
|
|
|
Outils de la discussion |
|
|
#41 | ||||||||
|
Expert Confirmé
![]() Inscription : août 2008 Messages : 1 713 ![]() |
Citation:
Citation:
Citation:
Citation:
Code :
Code :
Je suis bien évidemment totalement en accord avec le fond de l'article même si l'exemple des numéros de téléphones semblera quelque peu extremiste pour la plus part des lecteurs. Comme d'habitude tout dépend des besoins ! PS : Tiré d'un autre post que vous avez peut être vu : Donc pas la peine de le basher sur "son" modèle alors qu'il n'y est pour rien (même s'il semble convaincu par le modèle de l'ERP en question alors que moi même après une très rapide lecture je le suis beaucoup moins...) |
||||||||
|
|
00
|
|
|
#42 | |
![]() ![]() |
Citation:
C'est très rapide ainsi ! Attention toutefois, le rowid n'étant pas une valeur immuable, il est interdit d'en coder "en dur" !
__________________
Email : http://scr.im/waldar |
|
|
10
|
|
|
#43 | |
![]() ![]() |
Citation:
Dans ce cas, ce n'est pas une bonne clé !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
|
|
00
|
|
|
#44 |
![]() ![]() |
Tout à fait, c'est pour ça que c'est une pseudocolonne.
Oracle ne laisse pas le choix, elle existe pour toutes les tables !
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#45 | |
|
Membre Expert
![]() Sylvain DevidalChef de projets Générix Inscription : février 2010 Messages : 1 517 ![]() |
Citation:
L'intérêt de cette pseudo colonne, c'est qu'on peut utiliser des clés composites en varchar sans problème comme PK, sans que les performances soient réduites (puisque c'est le ROWID qui est utilisé au final) |
|
|
|
01
|
|
|
#46 | |
|
Expert Confirmé
![]() Inscription : août 2008 Messages : 1 713 ![]() |
Citation:
Une clé fonctionnelle peut être immuable, elle peut alors être une PK. Mais si la clé fonctionnelle immuable est composée de multiples colonnes et également FK dans d'autres tables, alors utiliser une séquence pour auto-incrémentée une clé allège l'écriture des jointures ainsi que la quantité de données à stocker. Le rowid n'a strictement rien à voir avec les clés. |
|
|
|
20
|
|
|
#47 | |
|
Expert Confirmé
![]() |
Citation:
__________________
Prendre conscience, c'est transformer le voile qui recouvre la lumière en miroir. MCTS Database Development |
|
|
|
00
|
|
|
#48 | ||
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 166 ![]() |
Citation:
Idem en DB2 for z/OS (on parle de RID) : Citation:
DB2 Administration Guide Sauf erreur de ma part, il semble que SQL Server ait fait le choix curieux de stocker la clé primaire comme référence à la ligne dans les index secondaires ... |
||
|
|
00
|
|
|
#49 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 163 ![]() |
Pour le ROWID...
Normal à l'origine Oracle et DB2 (héritier de system R) sont basés sur le même moteur. Il existe dans SQL Server mais n'est pas accessible (combinaison de n° de fichier, n° de page dans le fichier et n) de slot de ligne dans la page). Citation:
Effectivement tous les index non cluster reposent sur la valeur de la clef de l'index cluster pour retrouver la ligne originale. Cela permet beaucoup de choses, comme par exemple en cas de défragmentation de la table, ne pas toucher aux index ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
|
00
|
|
|
#50 |
|
Expert Confirmé
![]() Pacman PacmanConsulté Oracle Inscription : juin 2004 Messages : 1 452 ![]() |
Et cela permet donc de devoir toujours faire deux accès index au lieu d'un quand tu ne recherches pas sur la PK ?
Cool !
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
10
|
|
|
#51 | ||
![]() ![]() |
C'est quoi le problème ?
Code :
On s'en fout de savoir que 'pacmann' est dans le fichier 12 page 24 ligne 5 !
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
||
|
00
|
|
|
#52 |
![]() ![]() |
Disons qu'avec un index cluster, la table est dans la PK, l'accès à l'un ou l'autre est équivalent.
Oracle propose la même fonctionnalité depuis la 8i avec les IOT, fonctionnalité malheureusement sous-utilisée, là où SQL-Server le propose quasiment par défaut.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#53 | ||
|
Expert Confirmé
![]() Pacman PacmanConsulté Oracle Inscription : juin 2004 Messages : 1 452 ![]() |
Non Cinephil, tu n'as pas compris !
Faudrait que t'arrêtes vraiment de dire non simplement parce que je ne dis pas "SQLPro, c'est super ton truc". Code :
Cherche pk_pacmann dans IDX_PK_PERSON : récupère pointeur sur la table. Accède à la ligne grâce au pointeur. L'étape 2 est, si j'ai compris, l'ajout induit par le système décrit. Sinon Waldar, Ok c'est dont une IOT ? Mais ça ne change pas grand chose. Si on regarde ça : http://msdn.microsoft.com/fr-fr/library/ms177443.aspx La dernière étape qui accède à la page de données, c'est comme si tu accédais par rowid... l'étape d'au-dessus dans notre cas de recherche : c'est comme si tu avais deux étages d'index, et le troisième étage pour la table. Donc tu as parcouru un arbre pour ton premier index, tu reparcours l'arbre pour choper une adresse que tu pourrais déjà avoir. Après je dis pas, peut-être que ça s'utilise sur des tables petites en tailles, avec un petit b-tree level... [EDIT] Et donc Waldar, sur une IOT, les indexes supplémentaires pointent sur la PK au lieu du ROWID ?
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
||
|
10
|
|
|
#54 | ||||||
![]() ![]() |
Il n'y a plus de rowid avec une IOT car il n'y a plus de table, tout est dans l'index !
La méthode d'accès c'est donc par la PK directement ! Une petite comparaison toute simple : Code :
Code :
--------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | --------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 2 | | 1 | TABLE ACCESS BY INDEX ROWID| PACMANN_HEAP | 1 | 1 | 1 |00:00:00.01 | 2 | |* 2 | INDEX RANGE SCAN | IX_PACMANN_HEAP | 1 | 1 | 1 |00:00:00.01 | 1 | --------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | --------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 1 | |* 1 | INDEX RANGE SCAN| IX_PACMANN_IOT | 1 | 1 | 1 |00:00:00.01 | 1 | --------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | --------------------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 2 | | 1 | TABLE ACCESS BY INDEX ROWID| PACMANN_HEAP | 1 | 1 | 1 |00:00:00.01 | 2 | |* 2 | INDEX UNIQUE SCAN | PK_PACMANN_HEAP | 1 | 1 | 1 |00:00:00.01 | 1 | --------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------- | Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | ---------------------------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | | 1 |00:00:00.01 | 1 | |* 1 | INDEX UNIQUE SCAN| PK_PACMANN_IOT | 1 | 1 | 1 |00:00:00.01 | 1 | ---------------------------------------------------------------------------------------------- Code :
__________________
Email : http://scr.im/waldar |
||||||
|
00
|
|
|
#55 | ||||
|
Expert Confirmé
![]() Pacman PacmanConsulté Oracle Inscription : juin 2004 Messages : 1 452 ![]() |
Ok, je comprends.
Pour montrer ce que je voulais dire, je change un peu ton exemple : Code :
Code :
La différence avec un accès à une table par row_id ? C'est que tu reparcours une arborescence. Ton scan de PK_PACMANN_IOT s'il est sur 3 étage, on pourrait faire le parallèle avec une table normale et une PK normale, où ton index n'est que sur 2 étage, où tu choppes ton ROWID, et tu as une étape supplémentaire qui te conduit au bloc de données. Et il faut faire le test, mais à mon avis quand tu prends une table qui des "grosses" lignes et que tu la mets sous IOT, tu peux te retrouver avec b-tree à pleins d'étages, non ? Sous Oracle, on n'utilise pas tout le temps des IOT... parce que ce n'est toujours optimal je suppose (Même si les principales raisons sont peut être ailleurs ? Sur les FTS ?)
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
||||
|
10
|
|
|
#56 |
|
Expert Confirmé
![]() Pacman PacmanConsulté Oracle Inscription : juin 2004 Messages : 1 452 ![]() |
Juste une petite précision que j'ai lue en googlant, s'il n'y a pas accès par ROWID, c'est certes parce qu'il n'y a pas de table.
C'est surtout parce que l'index est soumis à trop "d'opérations de maintenance" dans la mesure où c'est un balanced b-tree index, et qu'il faudrait maintenir la modification de ce rowid... Du coup il y a un urowid immuable, mais qui ne permet pas d'accès direct.
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
10
|
|
|
#57 |
![]() ![]() |
Ton exemple est meilleur que le mien, tu as raison de rajouter une colonne.
J'aurai du y penser en voyant le plan. Tu as raison, si le B*Tree de la PK comporte beaucoup d'étage ça augmente le nombre de scans... Et on revient directement en relation avec l'article de SQLPro : beaucoup de petites tables limitent justement cet effet !
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#58 | |||
![]() ![]() |
Keep cool (pac)man !
Citation:
Citation:
Je n'ai pas tout compris à vos explications mais apparemment je n'ai pas encore assimilé tout le mécanisme interne des index. Il est vrai que je n'ai jamais eu besoin de le faire. Enfin l'essentiel, dans le cadre de cette discussion, est là : Citation:
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique. Autoentrepreneur. Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework... « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau) À la maison comme au bureau, j'utilise la suite Linux Mageïa ! |
|||
|
00
|
|
|
#59 |
|
Membre Expert
![]() ![]() François DurandSpécialiste Delivery Mainframe IBM Inscription : octobre 2005 Messages : 1 166 ![]() |
Et c'est encore pire avec SQL Server ... Seulement, DB2 (for z/OS et les autres sans doute ... ) ne travaillent pas comme cela et donc l'argument sur les performances (sans être totalement irrecevable) est moins percutant ...
|
|
|
10
|
|
|
#60 | |
|
Expert Confirmé
![]() Pacman PacmanConsulté Oracle Inscription : juin 2004 Messages : 1 452 ![]() |
Ok, désolé, j'ai peut-être un peu sur-réagi notamment sur :
Citation:
Bref, je suis de toutes façons d'accord sur les bienfaits possibles de "petites" lignes (après à vue d'oeil, je ne serais pas non plus catégorique et accepterais qu'il puisse y avoir des configuration où la "dénormalisation" puisse se justifier). Par contre, je maintiens que c'est quand mieux de pouvoir choisir si ta table est index organised ou non (Je vais faire quelques tests sur des tables pas trop grosse mais quand même un peu) [EDIT] tout à fait d'accord Luc, ça fait un peu l'oeuf et la poule sur le coup
__________________
(c'est ma photo) Paku, Paku ! Pour les jeunes incultes : non, je ne suis pas un pokémon... Le pacblog : http://pacmann.over-blog.com/ |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com