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 ?
Partager