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

MS SQL Server Discussion :

Création d'index sur une vue


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut Création d'index sur une vue
    Bonjour,

    J'essaie de m'auto-former sur les diverses méthodes pour optimiser une base de données, et je souhaite créer une vue indexée.

    Voici le DDL de la base de test :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    CREATE TABLE dbo.firstname
    (
    	id int NOT NULL primary key,
    	name varchar(20) NOT NULL
    );
     
    CREATE TABLE dbo.lastname
    (
    	id int NOT NULL primary key,
    	name varchar(20) NOT NULL
    );
     
    create view dbo.fullname
    as
    select coalesce(f.id, l.id) id, f.name firstname, l.name lastname
    from dbo.firstname f
    full outer join dbo.lastname l on l.id = f.id;

    Lors j'essaie de créer un index sur ma vue "dbo.fullname", j'obtiens une erreur comme quoi la vue n'est pas liée au schéma.

    J'ai donc ajouté la clause WITH SCHEMABINDING à la déclaration de ma vue :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create view dbo.fullname with schemabindings
    as
    select coalesce(f.id, l.id) id, f.name firstname, l.name lastname
    from dbo.firstname f
    full outer join dbo.lastname l on l.id = f.id;

    Sauf que maintenant SQL Server râle car l'index clustered de ma vue n'est pas unique.

    J'ai donc essayé de créer cet index clusterd :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    create unique clustered index uix_id on dbo.fullname(id);

    Et là, SQL Server râle à cause de la présence d'une clause "outer join" dans ma vue.

    Bon, alors je réécris ma vue sans OUTER JOIN :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    create view dbo.fullname WITH SCHEMABINDING
    as
    select f.id, f.name firstname, l.name lastname
    from dbo.firstname f
    inner join dbo.lastname l on l.id = f.id
    union all
    select f.id, f.name, null
    from dbo.firstname f
    where f.id not in (select l.id from dbo.lastname l)
    union all
    select l.id, null, l.name
    from dbo.lastname l
    where l.id not in (select f.id from dbo.firstname f);

    Et là, il veut toujours pas de l'index car la vue comporte des UNION...

    Euh...

    En fait, on peut faire des vues indexées uniquement si elles sont simple à bouffer de la paille ? Quel intérêt ?

  2. #2
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2008
    Messages
    699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Octobre 2008
    Messages : 699
    Par défaut
    J'étais arrivé à la même conclusion il y a quelques mois.
    C'est déprimant.

    PS: Vous avez essayer avec un index non cluster ?

  3. #3
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Quand je crée un index NONCLUSTER, il me dit que... l'index CLUSTER n'est pas unique (même s'il n'y en a pas de défini explicitement).

  4. #4
    Membre éprouvé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Octobre 2013
    Messages
    74
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Octobre 2013
    Messages : 74
    Par défaut
    Bonjour,
    La liste des contraintes sur la requête à transformer en vue indexée est effectivement longue comme le bras: http://msdn.microsoft.com/fr-fr/libr...x#Restrictions
    Donc pas de jointure externe, pas de UNION (mais a priori pas de problème avec les UNION ALL), et pas de sous requête.

    Je pense que l'idée de la vue indexées est de dramatiquement améliorer les perfs sur des requêtes avec un très grand nombre de jointures (modèle très normalisé) sur des tables de forte volumétrie avec une fréquence de mise à jour très faible (parce que le surcoût à la mise à jour des tables sous jacentes) reste important.

  5. #5
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    En fait, on peut faire des vues indexées uniquement si elles sont simple à bouffer de la paille

    Ne rabaissez pas nos chers amis équidés comme cela!!!

    En effet les vues indexées (vieilles comme le monde au passage...) induisent de nombreuses limitations.

    Au delà d’éviter les jointures elles sont surtout intéressante pour les requêtes mettant en jeu des agrégats afin de drastiquement limiter la volumétrie.

    Attention a bien peser le pour et le contre sur le coût nécessaire à maintenir le ou les indexes de telles vues.

  6. #6
    Expert confirmé
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 197
    Billets dans le blog
    1
    Par défaut
    Faudrait déjà que j'arrive à en créer une

    Ok, donc principalement pour des vues contenant des données agrégées.

    Merci pour ces informations

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête sur une vue indexée
    Par VladTepes dans le forum Développement
    Réponses: 0
    Dernier message: 10/08/2010, 17h37
  2. Création d'index sur une colonne TEXT
    Par AyManoVic dans le forum Requêtes
    Réponses: 2
    Dernier message: 03/08/2010, 00h12
  3. Réponses: 3
    Dernier message: 01/04/2009, 10h47
  4. Création d'un index sur une grosse table
    Par Jester dans le forum SQL Procédural
    Réponses: 5
    Dernier message: 02/04/2008, 12h44
  5. delete sur une vue: rule
    Par Bouboubou dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 18/05/2004, 18h58

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