Quale query SQL è più veloce? Filtro sui criteri di partecipazione o clausola Where?

Confronta queste 2 domande. È più veloce inserire il filtro nei criteri di join o nella clausola were. Ho sempre pensato che fosse più veloce nei criteri di join perché riduce il set di risultati nel più breve tempo ansible, ma non ne sono sicuro.

Sto andando a build alcuni test da vedere, ma volevo anche avere opinioni su cui sarebbe più chiaro da leggere.

Query 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? */ 

Query 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 

MODIFICARE

Ho eseguito alcuni test e i risultati mostrano che in realtà è molto vicino, ma la clausola WHERE è in realtà leggermente più veloce! =)

Sono assolutamente d’accordo sul fatto che abbia più senso applicare il filtro sulla clausola WHERE , ero solo curioso di sapere le implicazioni sulla performance.

TEMPO LIBERO DOVE CRITERI: 143016 ms
CRITERI DI ISCRIZIONE DEL TEMPO ELAPSED: 143256 ms

TEST

 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 @aa CROSS JOIN @bb /* 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 @aa INNER JOIN @xx ON a.id = x.aid INNER JOIN @bb 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 @aa INNER JOIN @xx ON a.id = x.aid AND a.id = @aid INNER JOIN @bb 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