全连接的几种方式
/*
CREATE TABLE A(id INT, NAME VARCHAR(30))
CREATE TABLE B(id INT, marks VARCHAR(30))
INSERT INTO A
SELECT 1,'周杰伦' union
SELECT 2,'周星驰' union
SELECT 3,'成龙' union
SELECT 4,'李连杰' union
SELECT 5,'洪金宝' union
SELECT 6,'李嘉诚' union
SELECT 7,'马甲'
INSERT INTO b
SELECT 1,12 union
SELECT 3,55 union
SELECT 5,56 union
SELECT 6,69 union
SELECT 11,28 union
SELECT 16,47 union
SELECT 25,57
*/
/*
DBCC FREEPROCCACHE
DBCC FREESESSIONCACHE
DBCC FREESYSTEMCACHE('All')
DBCC DROPCLEANBUFFERS
exec sp_configure 'max server memory', 0
EXEC ('RECONFIGURE' )
*/
SET STATISTICS IO on
EXEC [seequerytime] ' SELECT * FROM A JOIN B on 1=1'
/*
表 'A'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'B'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
6
*/
EXEC [seequerytime] ' SELECT * FROM A INNER JOIN B on 1=1'
/*
表 'A'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'B'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
6*/
EXEC [seequerytime] ' SELECT * FROM A left JOIN B on 1=1'
/*
表 'B'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'A'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
6
*/
EXEC [seequerytime] 'select * from A LEFT OUTER JOIN B on 1=1'
/*
表 'B'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'A'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
6
*/
EXEC [seequerytime] ' SELECT * FROM A FULL JOIN B on 1=1'
/*
表 'A'。扫描计数 2,逻辑读取 8 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'B'。扫描计数 2,逻辑读取 8 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
10
*/
EXEC [seequerytime] ' select * from A CROSS APPLY B'
/*
表 'A'。扫描计数 1,逻辑读取 7次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'B'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
6
*/
EXEC [seequerytime] ' select * from A outer APPLY B'
/*
表 'A'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'B'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
6
*/
EXEC [seequerytime] ' select * from A cross JOIN B'
/*
表 'A'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'B'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
10
*/
EXEC [seequerytime] ' select * from A, B '
/*
表 'B'。扫描计数 1,逻辑读取 7 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
表 'A'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
6。
*/
/*
DROP TABLE A
DROP TABLE B
*/
/*
alter proc [dbo].[seequerytime] @sql varchar(max)
as
set nocount on
declare @d datetime
set @d = getdate()
/*你的SQL脚本开始*/
exec (@sql)
/*你的SQL脚本结束*/
declare @result int
select @result = datediff(ms, @d, getdate())
select @result
print @result
*/
看见full join的 逻辑读取比其他方式多