1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
| -- Employees
CREATE TABLE Employees
(
emp_id int NOT NULL PRIMARY KEY,
empname varchar(25) NOT NULL,
);
GO
-- Ventes
CREATE TABLE ventes
(
vente_id int IDENTITY(1,1) NOT NULL PRIMARY KEY,
emp_id int NOT NULL REFERENCES Employees,
montant MONEY NOT NULL,
date DATETIME NOT NULL
);
GO
-- Index sur foreign key emp_id de la table vente
CREATE INDEX idx_emp_id_ventes
ON dbo.ventes
(
emp_id
);
GO
-- Jeu de données pour les tables Employees et Ventes
INSERT INTO Employees VALUES(1,'Mikedavem');
INSERT INTO Employees VALUES(2,'SergeJack');
INSERT INTO Employees VALUES(3, 'SQLPro');
INSERT INTO Employees VALUES(4,'Elsuket');
INSERT INTO ventes (emp_id, montant, date)
SELECT 1, RAND() * 10.0, DATEADD(dd, -1 * RAND() * 10, GETDATE())
GO 10000
INSERT INTO ventes (emp_id, montant, date)
SELECT 2, RAND() * 10.0, DATEADD(dd, -1 * RAND() * 10, GETDATE())
GO 10000
INSERT INTO ventes (emp_id, montant, date)
SELECT 3, RAND() * 10.0, DATEADD(dd, -1 * RAND() * 10, GETDATE())
GO 10000
INSERT INTO ventes (emp_id, montant, date)
SELECT 4, RAND() * 10.0, DATEADD(dd, -1 * RAND() * 10, GETDATE())
GO 10000
-- Récupération statistiques IO des requêtes
SET STATISTICS IO ON;
GO
-- Test avec CROSS APPLY
SELECT
e.empname,
v.vente_id,
v.montant,
v.date
FROM Employees AS e
CROSS APPLY
(
SELECT TOP(2) vente_id, montant, emp_id, date
FROM ventes
WHERE emp_id = e.emp_id
ORDER BY date DESC
) AS v
GO
-- Test avec ROW_NUMBER() et INNER JOIN
SELECT
e.empname,
v.vente_id,
v.montant,
v.date
FROM Employees AS e
INNER JOIN
(
SELECT
ROW_NUMBER() OVER (PARTITION BY emp_id ORDER BY date DESC) AS num,
vente_id,
emp_id,
montant,
date
FROM Ventes
) AS v
ON v.emp_id = e.emp_id
WHERE v.num <=2
/* Résultat avec CROSS APPLY
(8 ligne(s) affectée(s))
Table 'ventes'. Nombre d'analyses 4, lectures logiques 664, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lectures physiques de données d'objets volumineux 0, lectures anticipées de données d'objets volumineux 0.
Table 'Employees'. Nombre d'analyses 1, lectures logiques 2, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lectures physiques de données d'objets volumineux 0, lectures anticipées de données d'objets volumineux 0.
*/
/* Résultat avec ROW_NUMBER() ET INNER JOIN
(8 ligne(s) affectée(s))
Table 'ventes'. Nombre d'analyses 1, lectures logiques 166, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lectures physiques de données d'objets volumineux 0, lectures anticipées de données d'objets volumineux 0.
Table 'Employees'. Nombre d'analyses 1, lectures logiques 2, lectures physiques 0, lectures anticipées 0, lectures logiques de données d'objets volumineux 0, lectures physiques de données d'objets volumineux 0, lectures anticipées de données d'objets volumineux 0.
*/ |