联结表查询比较

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数据库的压力。

 

 

posted @ 2017-03-28 00:05  茗::流  阅读(497)  评论(0)    收藏  举报
如有雷同,纯属参考。如有侵犯你的版权,请联系我。