So sánh 2 truy vấn này. Đặt bộ lọc vào tiêu chí nối hoặc trong WHERE
mệnh đề có nhanh hơn không. Tôi luôn cảm thấy rằng nó nhanh hơn trên các tiêu chí tham gia vì nó làm giảm kết quả được đặt vào thời điểm sớm nhất có thể, nhưng tôi không biết chắc.
Tôi sẽ xây dựng một số bài kiểm tra để xem, nhưng tôi cũng muốn lấy ý kiến về cái nào sẽ rõ ràng hơn để đọc.
Truy vấn 1
SELECT *
FROM TableA a
INNER JOIN TableXRef x
ON a.ID = x.TableAID
INNER JOIN TableB b
ON x.TableBID = b.ID
WHERE a.ID = 1 /* <-- Filter here? */
Truy vấn 2
SELECT *
FROM TableA a
INNER JOIN TableXRef x
ON a.ID = x.TableAID
AND a.ID = 1 /* <-- Or filter here? */
INNER JOIN TableB b
ON x.TableBID = b.ID
BIÊN TẬP
Tôi đã chạy một số bài kiểm tra và kết quả cho thấy rằng nó thực sự rất gần, nhưng WHERE
mệnh đề thực sự nhanh hơn một chút! =)
Tôi hoàn toàn đồng ý rằng việc áp dụng bộ lọc vào WHERE
mệnh đề sẽ hợp lý hơn, tôi chỉ tò mò về các hàm ý hiệu suất.
THỜI GIAN BỊ BỎ LỠ TRONG ĐÓ TIÊU CHÍ: 143016 mili giây
THỜI GIAN BỊ BỎ LỠ THỜI GIAN THAM GIA TIÊU CHÍ: 143256 mili giây
KIỂM TRA
SET NOCOUNT ON;
DECLARE @num INT,
@iter INT
SELECT @num = 1000, -- Number of records in TableA and TableB, the cross table is populated with a CROSS JOIN from A to B
@iter = 1000 -- Number of select iterations to perform
DECLARE @a TABLE (
id INT
)
DECLARE @b TABLE (
id INT
)
DECLARE @x TABLE (
aid INT,
bid INT
)
DECLARE @num_curr INT
SELECT @num_curr = 1
WHILE (@num_curr <= @num)
BEGIN
INSERT @a (id) SELECT @num_curr
INSERT @b (id) SELECT @num_curr
SELECT @num_curr = @num_curr + 1
END
INSERT @x (aid, bid)
SELECT a.id,
b.id
FROM @a a
CROSS JOIN @b b
/*
TEST
*/
DECLARE @begin_where DATETIME,
@end_where DATETIME,
@count_where INT,
@begin_join DATETIME,
@end_join DATETIME,
@count_join INT,
@curr INT,
@aid INT
DECLARE @temp TABLE (
curr INT,
aid INT,
bid INT
)
DELETE FROM @temp
SELECT @curr = 0,
@aid = 50
SELECT @begin_where = CURRENT_TIMESTAMP
WHILE (@curr < @iter)
BEGIN
INSERT @temp (curr, aid, bid)
SELECT @curr,
aid,
bid
FROM @a a
INNER JOIN @x x
ON a.id = x.aid
INNER JOIN @b b
ON x.bid = b.id
WHERE a.id = @aid
SELECT @curr = @curr + 1
END
SELECT @end_where = CURRENT_TIMESTAMP
SELECT @count_where = COUNT(1) FROM @temp
DELETE FROM @temp
SELECT @curr = 0
SELECT @begin_join = CURRENT_TIMESTAMP
WHILE (@curr < @iter)
BEGIN
INSERT @temp (curr, aid, bid)
SELECT @curr,
aid,
bid
FROM @a a
INNER JOIN @x x
ON a.id = x.aid
AND a.id = @aid
INNER JOIN @b b
ON x.bid = b.id
SELECT @curr = @curr + 1
END
SELECT @end_join = CURRENT_TIMESTAMP
SELECT @count_join = COUNT(1) FROM @temp
DELETE FROM @temp
SELECT @count_where AS count_where,
@count_join AS count_join,
DATEDIFF(millisecond, @begin_where, @end_where) AS elapsed_where,
DATEDIFF(millisecond, @begin_join, @end_join) AS elapsed_join