এই 2 টি প্রশ্নের তুলনা করুন। যোগদানের মানদণ্ডে বা এর মধ্যে ফিল্টার স্থাপন করা কি দ্রুতWHERE
? আমি সবসময় অনুভব করেছি যে এটি যোগদানের মানদণ্ডে দ্রুততর কারণ এটি শীঘ্রই সম্ভাব্য মুহুর্তে ফলাফল সেটটিকে হ্রাস করে, তবে আমি নিশ্চিতভাবে জানি না।
আমি দেখতে কিছু পরীক্ষা তৈরি করতে যাচ্ছি, তবে আমি মতামতও পেতে চেয়েছিলাম যার বিষয়ে পড়ার বিষয়টি আরও পরিষ্কার হবে।
প্রশ্ন ঘ
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? */
প্রশ্ন 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
সম্পাদনা
আমি কিছু পরীক্ষা চালিয়েছি এবং ফলাফলগুলি দেখায় যে এটি আসলে খুব কাছাকাছি, তবে WHERE
ক্লজটি আসলে কিছুটা দ্রুত! =)
আমি সম্পূর্ণরূপে সম্মত হই যে এটির উপর ফিল্টার প্রয়োগ করা আরও বোধগম্য WHERE
অর্থবোধ করে, আমি পারফরম্যান্সের প্রভাব সম্পর্কে কেবল কৌতূহলী ছিলাম।
বিপজ্জনক সময় যেখানে ক্রিটরিয়া : 143016
মিমি সময়সীমার সাথে সময় কাটাও: ক্রিটরিয়া 143256 এমএস
পরীক্ষা
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