联结表查询比较
1、先找出该用户的信息(存放在#临时表),再联接表查询
DECLARE @fCompantId INT = 36052 DECLARE @fAccountID INT = 43672 DECLARE @time DATETIME = GETDATE() DECLARE @ms INT IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE id = object_id(N'tempdb..#tempRestlt') AND type='U') DROP TABLE #tempRestlt --先查出符合条件的数据放在#临时表 SELECT FID,FAccountID,FCompanyID,FApplyTime,FUpdateTime,FBankCardId,FApplyAmount,FStatus,FRiskStatus,FRemark,FRiskRemark INTO #tempRestlt FROM dbo.TEncashment WHERE FCompanyID = @fCompantId AND FAccountID = @fAccountID SELECT a.FAccountID,b.FAccount, a.FApplyTime,a.FUpdateTime, a.FBankCardId,c.FBankName,c.FHolders,c.FCardNo, a.FApplyAmount,a.FStatus,a.FRiskStatus,a.FRemark,a.FRiskRemark
FROM #tempRestlt AS a --临时表 LEFT JOIN dbo.TAccounts AS b ON b.FID = a.FAccountID LEFT JOIN dbo.TBankCards AS c ON c.FID = a.FBankCardId ORDER BY a.FID DESC
--清理临时表 IF EXISTS (SELECT * FROM tempdb.dbo.sysobjects WHERE id = object_id(N'tempdb..#tempRestlt') AND type='U') BEGIN TRUNCATE TABLE #tempRestlt DROP TABLE #tempRestlt END SET @ms=DATEDIFF(ms,@time,GETDATE()) SELECT @ms --毫秒数
/* @ms 第一次 : 13
第二次 : 10
第三次 : 20
第四次 : 16
第五次 : 26
*/
SET STATISTICS TIME ON
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 4 毫秒。
(39 行受影响)
SQL Server 分析和编译时间:
CPU 时间 = 10 毫秒,占用时间 = 10 毫秒。
(39 行受影响)
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 19 毫秒。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 1 毫秒。
SET STATISTICS IO ON 表 'sysschobjs'。扫描计数 0,逻辑读取 0 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'TEncashment'。扫描计数 1,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 (39 行受影响) (39 行受影响) 表 'TBankCards'。扫描计数 0,逻辑读取 78 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'TAccounts'。扫描计数 0,逻辑读取 89 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 '#tempRestlt_________________________________________________________________________________________________________000000000036'。扫描计数 1,逻辑读取 1 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'sysschobjs'。扫描计数 0,逻辑读取 2 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

2、一次性联结表查询(不把数据存放在#临时表)
DECLARE @fCompantId INT = 36052 DECLARE @fAccountID INT = 43672 DECLARE @time DATETIME = GETDATE() DECLARE @ms INT SELECT a.FID, a.FAccountID,b.FAccount, a.FApplyTime,a.FUpdateTime, a.FBankCardId,c.FBankName,c.FHolders,c.FCardNo, a.FApplyAmount,a.FStatus,a.FRiskStatus,a.FRemark,a.FRiskRemark
FROM TEncashment AS a LEFT JOIN dbo.TAccounts AS b ON b.FID = a.FAccountID LEFT JOIN dbo.TBankCards AS c ON c.FID = a.FBankCardId WHERE a.FCompanyID=@fCompantId AND a.FAccountID=@fAccountID ORDER BY a.FID DESC SET @ms=DATEDIFF(ms,@time,GETDATE()) SELECT @ms --毫秒数 /* @ms
第一次 : 3
第二次 : 0
第三次 : 0
第四次 : 3
第五次 : 0
*/
SET STATISTICS TIME ON
(39 行受影响)
SQL Server 执行时间:
CPU 时间 = 0 毫秒,占用时间 = 0 毫秒。
SET STATISTICS IO ON (39 行受影响) 表 'TBankCards'。扫描计数 0,逻辑读取 78 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'TAccounts'。扫描计数 0,逻辑读取 78 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。 表 'TEncashment'。扫描计数 1,逻辑读取 6 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。


总结:
1、如果不是多处要使用的一部分数据(例如:账户信息),没有必要先存放在临时表再去关联查询。
2、能一次性查询的,不要分两次或多次查询。盲目使用#临时表(或 @表变量),这样还增加了tempdb数据库的压力。

浙公网安备 33010602011771号