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