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 ?