vendredi 12 juin 2026

SQL - 2

 Différence entre Clustered et Non-Clustered Index ? 

Index Seek vs Index Scan ? 

CTE vs Temp Table ? 

ROW_NUMBER vs RANK vs DENSE_RANK ?

 Que sont les Deadlocks ?

 Comment optimiser une requête lente ? 

ACID ? 

Isolation Levels ? 

Pourquoi éviter SELECT * ? 

Comment trouver le 2e ou 3e salaire le plus élevé ? 

Différence EXISTS vs IN ? 

Comment analyser un Execution Plan ?

1. Différence entre Clustered et Non-Clustered Index

Clustered Index

Les données de la table sont physiquement triées selon l'index.

Table Orders

1
2
3
4
5

L'ordre du stockage correspond à l'index.

Une seule fois par table.

Avantages

  • Très rapide pour les recherches par plage
WHERE OrderDate BETWEEN ...

Non-Clustered Index

Structure séparée contenant :

Valeur indexée
|
+--> Pointeur vers la ligne

Exemple :

CREATE INDEX IX_CustomerId
ON Orders(CustomerId)

Plusieurs par table.


Réponse entretien

Le Clustered Index définit l'ordre physique des données dans la table et il n'en existe qu'un seul. Le Non-Clustered Index est une structure séparée contenant des pointeurs vers les données et une table peut en posséder plusieurs.


2. Index Seek vs Index Scan

Index Seek

SQL Server va directement à la valeur recherchée.

SELECT *
FROM Orders
WHERE Id = 100
Index Seek

Complexité proche :

O(log n)

Très performant.


Index Scan

SQL Server parcourt tout l'index.

SELECT *
FROM Orders
WHERE YEAR(OrderDate)=2026
Index Scan

ou

Table Scan

Plus coûteux.


Réponse entretien

Index Seek signifie que SQL Server utilise efficacement l'index pour accéder directement aux lignes recherchées. Index Scan signifie qu'il parcourt une grande partie ou la totalité de l'index.


3. CTE vs Temp Table

CTE

WITH Sales AS
(
SELECT *
FROM Orders
)
SELECT *
FROM Sales

Caractéristiques :

Temporaire
Non matérialisée
Lisibilité
Requêtes récursives

Temp Table

SELECT *
INTO #Orders
FROM Orders

ou

CREATE TABLE #Orders (...)

Caractéristiques :

Stockée dans tempdb
Peut être indexée
Réutilisable plusieurs fois

Réponse entretien

Une CTE améliore la lisibilité et est généralement utilisée dans une seule requête. Une Temp Table est physiquement stockée dans tempdb et devient intéressante lorsqu'on doit réutiliser les données plusieurs fois ou créer des index intermédiaires.


4. ROW_NUMBER vs RANK vs DENSE_RANK

Données :

1000
1000
900
800

ROW_NUMBER

ROW_NUMBER()

Résultat :

1
2
3
4

Toujours unique.


RANK

RANK()

Résultat :

1
1
3
4

Trou dans la numérotation.


DENSE_RANK

DENSE_RANK()

Résultat :

1
1
2
3

Pas de trou.


Réponse entretien

ROW_NUMBER attribue un numéro unique à chaque ligne. RANK gère les ex-aequo mais laisse des trous. DENSE_RANK gère les ex-aequo sans laisser de trous.


5. Que sont les Deadlocks ?

Transaction A :

Lock TableA
Attend TableB

Transaction B :

Lock TableB
Attend TableA

Résultat :

Deadlock

SQL Server choisit une victime :

Deadlock Victim

et annule sa transaction.


Prévention

Même ordre d'accès aux tables
Transactions courtes
Index adaptés
Retry automatique

Réponse entretien

Un deadlock survient lorsque deux transactions se bloquent mutuellement en attendant des ressources détenues par l'autre. SQL Server détecte la situation et annule l'une des transactions.


6. Comment optimiser une requête lente ?

Checklist classique :

1. Execution Plan

Chercher :

Table Scan
Index Scan
Sort coûteux
Hash Match coûteux

2. Vérifier les index

WHERE
JOIN
ORDER BY
GROUP BY

3. Éviter

SELECT *

4. Réduire les données

TOP
Pagination

5. Vérifier statistiques

UPDATE STATISTICS

Réponse entretien

Je commence toujours par analyser l'Execution Plan afin d'identifier les scans, tris ou jointures coûteuses. Ensuite je vérifie les index, les statistiques et le volume de données traité.


7. ACID

Atomicity

Tout ou rien.

Commit ou Rollback

Consistency

Les règles métier restent valides.


Isolation

Les transactions ne se perturbent pas.


Durability

Après Commit :

Les données survivent à un crash

Réponse entretien

ACID garantit la fiabilité des transactions : Atomicité, Cohérence, Isolation et Durabilité.


8. Isolation Levels

Read Uncommitted

Dirty Reads possibles

Read Committed

Défaut SQL Server.

Pas de Dirty Read

Repeatable Read

Empêche la modification des lignes lues.


Serializable

Isolation maximale.


Snapshot

Très utilisé.

Versioning
Moins de blocages

Résumé

Read Uncommitted < Read Committed < Repeatable Read < Serializable

9. Pourquoi éviter SELECT * ?

Mauvais :

SELECT *
FROM Customers

Problèmes :

Lecture inutile
Plus d'I/O
Plus de réseau
Moins d'utilisation d'index couvrants
Maintenance compliquée

Préférer :

SELECT Id, Name
FROM Customers

Réponse entretien

SELECT * augmente les I/O, le trafic réseau et empêche parfois SQL Server d'utiliser des index couvrants. Je sélectionne uniquement les colonnes nécessaires.


10. Trouver le 2e ou 3e salaire le plus élevé

Avec DENSE_RANK

WITH Ranked AS
(
SELECT
Salary,
DENSE_RANK()
OVER(ORDER BY Salary DESC) AS Rnk
FROM Employees
)
SELECT *
FROM Ranked
WHERE Rnk = 2

2e salaire.


WHERE Rnk = 3

3e salaire.


11. EXISTS vs IN

IN

SELECT *
FROM Orders
WHERE CustomerId IN
(
SELECT Id
FROM Customers
)

EXISTS

SELECT *
FROM Orders o
WHERE EXISTS
(
SELECT 1
FROM Customers c
WHERE c.Id = o.CustomerId
)

Différence

EXISTS

S'arrête dès qu'il trouve une correspondance

IN

Peut nécessiter davantage de traitement

sur gros ensembles.


Réponse entretien

EXISTS est souvent plus performant sur de gros volumes car SQL Server s'arrête dès qu'une correspondance est trouvée. IN est généralement plus lisible pour les petites listes.


12. Comment analyser un Execution Plan ?

Les opérateurs à surveiller :

OpérateurBon/Mauvais
Index Seek✅ Bon
Clustered Index Seek✅ Bon
Index Scan⚠️ Moyen
Table Scan❌ Mauvais
Nested Loop✅ Souvent bon
Hash Match⚠️ Peut être coûteux
Sort⚠️ Coûteux
Key Lookup⚠️ À surveiller

Méthode d'analyse

  1. Activer Actual Execution Plan.
  2. Identifier l'opérateur le plus coûteux.
  3. Chercher :
Table Scan
Index Scan
Sort
Hash Match
Key Lookup
  1. Vérifier les index.
  2. Contrôler le nombre de lignes estimées vs réelles.

Réponse entretien

J'analyse d'abord l'Execution Plan réel, je repère les opérateurs les plus coûteux, puis je vérifie la présence de scans, de key lookups et la cohérence entre les lignes estimées et réelles. Cela permet d'identifier rapidement les problèmes d'indexation ou de cardinalité.

Aucun commentaire:

Enregistrer un commentaire

SQL - 2 Lượt xem: