इन 2 प्रश्नों की तुलना करें। क्या फिल्टर को जॉइन मानदंड पर या WHERE
क्लॉज में डालना ज्यादा तेज है । मैंने हमेशा महसूस किया है कि यह शामिल होने के मानदंडों पर तेज़ है क्योंकि यह परिणाम को जल्द से जल्द निर्धारित करता है, लेकिन मुझे यकीन नहीं है।
मैं देखने के लिए कुछ परीक्षण बनाने जा रहा हूं, लेकिन मैं भी ऐसी राय प्राप्त करना चाहता था जिस पर पढ़ने के लिए स्पष्ट हो।
प्रश्न 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? */
प्रश्न २
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
संपादित करें
मैंने कुछ परीक्षण चलाए और परिणाम बताते हैं कि यह वास्तव में बहुत करीब है, लेकिन WHERE
खंड वास्तव में थोड़ा तेज है! =)
मैं इस बात से पूरी तरह सहमत हूं कि WHERE
क्लॉज़ पर फ़िल्टर को लागू करने के लिए यह अधिक समझ में आता है , मैं प्रदर्शन के निहितार्थ के लिए उत्सुक था।
बीता हुआ समय कहां मानदंड: 143,016 एमएस
बीता हुआ समय में शामिल हों मानदंड: 143,256 एमएस
परीक्षा
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