Sql server 在sql server中使用表对象的查询或使用临时表的查询,哪个查询执行得更快
我创建了一个存储过程,其中使用了一个表对象并在其中插入了一些列。以下是程序:Sql server 在sql server中使用表对象的查询或使用临时表的查询,哪个查询执行得更快,sql-server,Sql Server,我创建了一个存储过程,其中使用了一个表对象并在其中插入了一些列。以下是程序: CREATE Procedure [dbo].[usp_Security] (@CredentialsList dbo.Type_UserCredentialsList ReadOnly) As Begin Declare @Result Table ( IdentityColumn Int NOT NULL Identity (1
CREATE Procedure [dbo].[usp_Security] (@CredentialsList dbo.Type_UserCredentialsList ReadOnly) As
Begin
Declare
@Result Table
(
IdentityColumn Int NOT NULL Identity (1, 1) PRIMARY KEY,
UserCredentials nVarChar(4000),
UserName nVarChar(100),
UserRole nVarChar(200),
RoleID Int,
Supervisor Char(3),
AcctMaintDecn Char(3),
EditPendInfo Char(3),
ReqInstID Char(3)
)
Insert Into @Result
Select Distinct UserCredentials, 'No', D.RoleName, D.RoleID,'No', 'No', 'No' From @CredentialsList A
Join SecurityRepository.dbo.SecurityUsers B On CharIndex(B.DomainAccount, A.UserCredentials) > 0
Join SecurityRepository.dbo.SecurityUserRoles C On C.UserID = B.UserID
Join SecurityRepository.dbo.SecurityRoles D On D.RoleID = C.RoleID
Where D.RoleName Like 'AOT.%' And B.IsActive = 1 And D.IsActive = 1
Update A
Set A.UserName = B.UserName
From @Result A
Join @CredentialsList B On A.UserCredentials = B.UserCredentials
-- "Supervisor" Column
Update A
Set A.Supervisor = 'Yes'
From @Result A
Join SecurityRepository.dbo.SecurityUsers B On CharIndex(B.DomainAccount, A.UserCredentials) > 0
Join SecurityRepository.dbo.SecurityUserRoles C On C.UserID = B.UserID
Join SecurityRepository.dbo.SecurityRoles D On D.RoleID = C.RoleID
Where D.RoleName In ('AOT.Manager', 'AOT.Deps Ops Admin', 'AOT.Fraud Manager', 'AOT.Fulfillment Manager')
And B.IsActive = 1 And D.IsActive = 1
-- Return Result
Select * From @Result Order By UserName, UserRole
End
在上面的过程中,我使用了表对象,然后在该表对象上创建了聚集索引
但是,如果我创建一个临时表,然后在SP中处理上述信息,它会比使用表对象而不是临时表更快吗。我尝试在表对象中的列上创建单独的聚集索引,但它不允许我创建它,因为我们无法在表对象上创建索引
我想在上面的存储过程中使用临时表,但与使用表对象相比,它会降低成本吗-一如既往,这里有很多因素在起作用 表变量往往最适合于少量行(例如10行、20行),因为它从来没有统计信息,不能有索引,并且SQL Server查询优化器总是假设它只有一行数据。如果表变量中的行太多,这将严重影响正在确定的执行计划 此外,表变量不参与事务处理,这可能是好事,也可能是坏事——因此,如果在事务内的表变量中插入10行,然后回滚该事务,那么这些行仍然在表变量中。请注意这一点 如果您想要有相当多的行,甚至可能需要为某些内容编制索引,那么临时表最有效 临时表的行为也与事务处理中的常规表类似,例如,事务将影响这些临时表
但是再次强调:找到答案的真正方法是尝试并测量它,然后再尝试并测量。表变量也在tempdb中执行。您需要检查两个查询计划,以查看有什么不同。为了找出哪个更快,你需要自己测试。这不是我们能回答的问题。