Bonjour,
Ma question n'est pas faut-il ou non mettre des FK dans les bases. Je sais qu'il faut les mettre. Je ne veux pas argumenter cela ici.
Ce qui m’intéresse c'est :

1.) ce que SQL Server fait en coulisse (en arrière plan) lors des opérations INSERT, DELETE et UPDATE sur une table FILLE ayant une colonne FK.
Je me demande si ce que SQL SERVER fait en arrière plan n'est pas semblable au comportement d'un TRIGGER ? [le profiler ne m'a rien montré ]

2.) Dans quel cas la contrainte d'intégrité référentielle boost une requête ? (en dehors de l'argument des lignes orphelines dans la table FILLE)

Pour examiner ces questions je dispose de 2 paires de tables :

--> Tables avec FK
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
CREATE TABLE [dbo].[T1](
	id1 int PRIMARY KEY,
	val1 char(10)
) 
CREATE TABLE [dbo].[T2](
	id2 int PRIMARY KEY,
	id1 int CONSTRAINT FK_ID1 FOREIGN KEY REFERENCES T1(id1),
	val2 char(10)
)
--> Tables sans FK
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
CREATE TABLE [dbo].[T1_BIS](
	id1 int PRIMARY KEY,
	val1 char(10)
) 
CREATE TABLE [dbo].[T2_BIS](
	id2 int PRIMARY KEY,
	id1 int,
	val2 char(10)
)

--> Chargement des tables

Code : 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
19
INSERT INTO T1 VALUES (1,'a1')
INSERT INTO T1 VALUES (2,'b1')
INSERT INTO T1 VALUES (3,'c1')
INSERT INTO T1 VALUES (4,'d1')
INSERT INTO T1 VALUES (5,'e1')
 
INSERT INTO T2 VALUES (1,1,'a2')
INSERT INTO T2 VALUES (2,2,'b2')
INSERT INTO T2 VALUES (3,3,'c2')
 
INSERT INTO T1_BIS VALUES (1,'a1')
INSERT INTO T1_BIS VALUES (2,'b1')
INSERT INTO T1_BIS VALUES (3,'c1')
INSERT INTO T1_BIS VALUES (4,'d1')
INSERT INTO T1_BIS VALUES (5,'e1')
 
INSERT INTO T2_BIS VALUES (1,1,'a2')
INSERT INTO T2_BIS VALUES (2,2,'b2')
INSERT INTO T2_BIS VALUES (3,3,'c2')

Avec ce jeu de données (qui n'est pas significatif) et l'analyse des plans d'exécutions je constate que :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Update T2 SET id2 = 10 
WHERE id1 =1
est moins performant que

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
Update T2_BIS SET id2 = 10 
WHERE id1 =1
Par contre en posant les index sur les colonnes suivantes on a des résultats similaires (d'où l'importance des index sur les FK)

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
CREATE INDEX IX_ID1 ON T2 (id1)
CREATE INDEX IX_ID1 ON T2_BIS (id1)
Je souhaite donc examiner l'avantage de la FK (T1 et T2) sur la non FK (T1_BIS et T2_BIS) concernant l'accélération de requêtes.

Pouvez-vous me montrer un exemple de requête où la FK (T1 et T2) est plus performant que la non FK (T1_BIS et T2_BIS) ?

Merci de m'éclairer