IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Affichage des résultats du sondage: Combien votre base de données contient-elle de tables avec plus de 20 colonnes ? (une seul choix pos

Votants
40. Vous ne pouvez pas participer à ce sondage.
  • Moins de 5%

    24 60,00%
  • Moins de 10%

    4 10,00%
  • Moins de 20%

    5 12,50%
  • PLUS de 20%

    7 17,50%
Optimisations SGBD Discussion :

Petites tables ou grandes tables. . . Quelles conséquences sur les performances ?


Sujet :

Optimisations SGBD

  1. #81
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 543
    Points
    52 543
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par fsmrel Voir le message
    Bonsoir,

    Qui détermine la préférence ? Le DBA ? SQL Server ?
    Si le granule de verrouillage est la page, et s’il y a de la concurrence en mise à jour, SQL Server prend-il dynamiquement l’initiative de passer au verrouillage au niveau de la ligne, quitte à revenir plus tard à la page (en supposant qu'il sache inférer que ça vaut le coup) ?

    D'après ce que je lis dans la doc, le SGBD se baserait plutôt sur les caractéristiques du schéma et des requêtes :
    The Database Engine automatically determines what locks are most appropriate when the query is executed, based on the characteristics of the schema and query.
    Par défaut niveau ligne. Si plusieurs lignes mise à jour et en fonction du nombre de ligne par page et de la distribution, alors niveau page.
    Le DBA peut forcer/interdire les verrous de page et ligne dans chaque index et chaque table.

    Citation Envoyé par fadace Voir le message
    Il y a une notion d'escalade de verrouillage, faite par le moteur.

    A un certain seuil (à l'époque éculée de mes derniers cours Internals, c'était 200 pages), le verrouillage page passe à un verrouillage table.

    Visiblement, [source], les seuils ont changé mais le principe est resté au travers des ans...

    On peut bien sûr forcer cela, si l'on se croit plus malin que lui .
    L'escalade se fait :
    de la ligne ou la page vers la partition, puis vers la table. Le seuil est d'environ 5000.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  2. #82
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 131
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 131
    Points : 38 546
    Points
    38 546
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Par défaut niveau ligne. Si plusieurs lignes mise à jour et en fonction du nombre de ligne par page et de la distribution, alors niveau page.
    Le DBA peut forcer/interdire les verrous de page et ligne dans chaque index et chaque table.
    L'escalade se fait :
    de la ligne ou la page vers la partition, puis vers la table. Le seuil est d'environ 5000.
    A +
    Avec DB2 for Z/OS, le seuil est paramétrable via le mot clef "LOCKMAX"

    Extrait de la doc DB2V11 (mais c'était déjà vrai avec les versions précédentes ):

    LOCKMAX
    Specifies the maximum number of page, row, or LOB locks an application
    process can hold simultaneously in the table space. If a program requests more
    than that number, locks are escalated. The page, row, or LOB locks are released
    and the intent lock on the table space or segmented table is promoted to S or X
    mode. If you specify LOCKMAX a for table space in a work file database, DB2
    ignores the value because these types of locks are not used.
    integer
    Specifies the number of locks allowed before escalating, in the range 0 to
    2 147 483 647.


    Sur le site où j'interviens actuellement, il y a environ 16% des tables avec plus de 20 colonnes (toutes bases de données confondues)
    Mais si on élimine les clefs étrangères et les colonnes mouchard (date, heure, traitement et user de création, date, heure, traitement et user de dernière modif), cette proportion diminue au moins de moitié

  3. #83
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 543
    Points
    52 543
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    ...
    Sur le site où j'interviens actuellement, il y a environ 16% des tables avec plus de 20 colonnes (toutes bases de données confondues)
    Mais si on élimine les clefs étrangères et les colonnes mouchard (date, heure, traitement et user de création, date, heure, traitement et user de dernière modif), cette proportion diminue au moins de moitié
    Tu as parfaitement raison de le préciser :
    ne pas prendre en compte les FK (elle n'apparaissent d'ailleurs pas dans le MCD)
    ne pas prendre les données "administratives" (métadonnées du DML de mise à jour)

    8% c'est pas énorme... Mais si tu corrèle les tables les plus utilisées par les tables les plus longues en nombre de colonne, je pense que tu devrait être à plus de 50% !!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #84
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 506
    Points : 1 289
    Points
    1 289
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Si cela a été fait, c'est que la syntaxe explicite est meilleure que la syntaxe implicite
    Absolument pas, c'est uniquement par symétrie avec le left outer join.

    Et de toute fçon c'est un débat qui n'a AUCUN lien avec le design des tables pour la performance

  5. #85
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 506
    Points : 1 289
    Points
    1 289
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    En effet, si vous ne faite que des index classiques, alors une colonne ne figurant pas dans la clef (à l'exception de celle(s) concernant la clef de l'index clustered) oblige à une double lecture.
    MAIS...
    SQL Server propose depuis 10 ans, la clause INCLUDE qui permet de rajouter dans l'index non clustered, toutes les colonnes que l'on souhaite afin de rendre l'index couvrant pour la requête...
    Dans ce cas, SQL Server sera encore plus rapide que Oracle ou DB2 puisqu'une seule recherche dans l'index donne l'intégralité des informations nécessaire à la requête.
    J'allais le dire ;-)

  6. #86
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par frfancha Voir le message
    Citation Envoyé par CinéPhil
    Si cela a été fait, c'est que la syntaxe explicite est meilleure que la syntaxe implicite
    Absolument pas, c'est uniquement par symétrie avec le left outer join.

    Et de toute fçon c'est un débat qui n'a AUCUN lien avec le design des tables pour la performance
    Sur une discussion de 5 pages étalée sur 5 ans, ce serait bien de préciser à quel message vous répondez.
    Je viens de parcourir ces 5 pages en cherchant mes messages mais je n'ai pas trouvé votre citation.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 !

  7. #87
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 506
    Points : 1 289
    Points
    1 289
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Sur une discussion de 5 pages étalée sur 5 ans, ce serait bien de préciser à quel message vous répondez.
    Vous avez tout-à-fait raison, je n'ai vu qu'après que c'était un ancien message, c'était resorti chez moi à cause de la mise à jour de la liste des tutoriels SQL Server.
    Il s'agit de ce message 02/08/2011, 22h49:
    Citation Envoyé par CinePhil Voir le message
    Peut-être, je ne connais pas la norme par coeur.
    Mais je ne compte plus le nombre de requêtes que j'ai débugguées dans nos forums rien qu'en récrivant les jointures avec la syntaxe explicite. C'est pas pour rien qu'on est passé du mélange des conditions de jointures et des conditions de restriction à leur séparation je pense ? Si cela a été fait, c'est que la syntaxe explicite est meilleure que la syntaxe implicite et c'est pour ça que je rappelle cette meilleure syntaxe et que j'encourage vivement tout le monde à l'utiliser et à bannir la vieille syntaxe qui présente tant de défauts.
    Citation Envoyé par CinePhil Voir le message
    Je viens de parcourir ces 5 pages en cherchant mes messages mais je n'ai pas trouvé votre citation.
    CTRL-F le trouve instanément (en étant sur la bonne page bien sûr donc potentiellement 5 ctrl-F)

  8. #88
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    OK alors je réponds à ça :
    Absolument pas, c'est uniquement par symétrie avec le left outer join.
    Avez-vous une source qui corrobore votre écrit ?

    Chez Oracle (je ne sais pas si c'était le cas avec d'autres SGBD), la jointure externe pouvait s'écrire avec un (+) à côté de la table externe de la jointure. Votre argument me semble donc ne pas tenir.
    Et il n'est pas question de symétrie puisque la jointure interne (INNER JOIN) n'est pas symétrique de la jointure externe.

    Ceci dit, vous avez raison sur un point :
    Et de toute fçon c'est un débat qui n'a AUCUN lien avec le design des tables pour la performance
    Il arrive que les débats dérivent ; ce n'est pas bien grave. Depuis 4 ans, le sujet a quand même été largement traité dans cette discussion.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 !

  9. #89
    Membre éprouvé

    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    506
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 506
    Points : 1 289
    Points
    1 289
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Avez-vous une source qui corrobore votre écrit ?
    "To allow a consistent coding style for the different types of joins, the SQL-92 standard also added support for a similar JOIN-keyword-based syntax for cross and inner joins. That's the history explaining why you have two standard syntaxes for cross and inner joins and only one standard syntax for outer joins."

    T-SQL Querying Itzik Ben-Gan, page 225

  10. #90
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    OK merci.
    N'empêche que je persiste à dire que c'est quand même bien mieux d'écrire les jointures avec JOIN.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « 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 !

  11. #91
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut chargement dans une page d'une ligne peu remplie
    une ligne d’une table doit impérativement tenir intégralement dans une page
    Et donc "8060 octets dans SQL Server"

    Si ma table est composée de 8 colonnes varchar(1000) elle fait donc potentiellement 8000 octets.
    Cependant, si ces 8 colonnes ne sont remplies qu'avec 50 caractères chacune,
    est-ce SQL Server va estimer la ligne à 8000 octets (taille de la structure) ou bien à 50 X 8 = 400 octets (taille réelle) ;
    auquel cas il pourrait charger 20 lignes ...
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

  12. #92
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 760
    Points : 52 543
    Points
    52 543
    Billets dans le blog
    5
    Par défaut
    La barrière de 8060 octets a été levée avec SQL Server 2005 ou 2008 (je ne me souviens plus) mais cela reste immonde car cela engendre du row overflow et donc une fragmentation irréfragable !!!
    Avec un VARCHAR(n) la données représentée est la longueur réelle des caractères stockés + 2 octets, soit n + 2. En NVARCHAR(n) c'est 2 *n + 2. Les deux octets supplémentaires servant à indiquer la longueur de la donnée stockée.

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  13. #93
    Modérateur

    Homme Profil pro
    Développeur java, access, sql server
    Inscrit en
    Octobre 2005
    Messages
    2 710
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur java, access, sql server
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 710
    Points : 4 791
    Points
    4 791
    Par défaut
    Merci de cette précision !
    Labor improbus omnia vincit un travail acharné vient à bout de tout - Ambroise Paré (1510-1590)

    Consulter sans modération la FAQ ainsi que les bons ouvrages : http://jmdoudoux.developpez.com/cours/developpons/java/

Discussions similaires

  1. Impact sur les performances avec un grand nombre de tables
    Par enila dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 04/08/2011, 15h40
  2. Une grande table VS 2 tables de taille correcte
    Par mikaeru dans le forum Optimisations
    Réponses: 3
    Dernier message: 11/06/2011, 16h17
  3. [AC-2003] séparer une grande table en sous table par année
    Par MatAir dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 25/03/2011, 19h24
  4. Réponses: 3
    Dernier message: 04/01/2011, 15h05
  5. Impact sur les performances d'un grand nombre de tables
    Par thechief dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 16/07/2010, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo