SQL - 临时表:将临时表中的所有列与只存储主键

SQL - 临时表:将临时表中的所有列与只存储主键

问题描述:

我需要为分页目的创建临时表。我将选择所有记录到临时表中,然后对其进行进一步处理。SQL - 临时表:将临时表中的所有列与只存储主键

我想知道以下哪些是更好的方法:

1)选择我的主表的所有列到临时表,然后能够选择的行,我需要

OR

2)只选择主表的主键到临时表中,然后再与主表进行连接?

在处理方法1和方法2时是否有任何大小的考虑因素?

[编辑]

我问,因为我会做第一种方法,但看着PROCEDURE [DBO]。[aspnet_Membership_FindUsersByName],所包含的ASP.NET成员,他们正在做的方法2

[EDIT2]

随着人们不访问存储过程:

-- Insert into our temp table 
INSERT INTO #PageIndexForUsers (UserId) 
    SELECT u.UserId 
    FROM dbo.aspnet_Users u, dbo.aspnet_Membership m 
    WHERE u.ApplicationId = @ApplicationId AND m.UserId = u.UserId AND u.LoweredUserName LIKE LOWER(@UserNameToMatch) 
    ORDER BY u.UserName 


SELECT u.UserName, m.Email, m.PasswordQuestion, m.Comment, m.IsApproved, 
     m.CreateDate, 
     m.LastLoginDate, 
     u.LastActivityDate, 
     m.LastPasswordChangedDate, 
     u.UserId, m.IsLockedOut, 
     m.LastLockoutDate 
FROM dbo.aspnet_Membership m, dbo.aspnet_Users u, #PageIndexForUsers p 
WHERE u.UserId = p.UserId AND u.UserId = m.UserId AND 
     p.IndexId >= @PageLowerBound AND p.IndexId <= @PageUpperBound 
ORDER BY u.UserName 

如果表格变量在您的约束范围内,则优先于临时表格。

选项2将使用较少的资源,因为数据重复较少。

托尼关于这是一个肮脏阅读的观点是你应该考虑的事情。

你能解释你是如何用临时表“分页”吗?它不是我熟悉的分页方法。

编辑: 在看你的文章编辑后,你应该在这种情况下明确使用表变量。它更少清理,你不会吹出tempdb这么多。

此外,它的种类不清楚这个临时表给了什么好处。如果您的目标是阻止用户访问对象/应用程序,那么为什么要添加有关它的部分“仅在此特定数据表页面上才受限制”。从安全的角度来看,这似乎是一种漏洞。

由于它从相同的表中进行选择,所以临时表也可以被消除。

+0

我已经将它包含在上面的问题 – TimLeung 2008-12-09 15:19:19

随着方法1中,在临时表中的数据可能与真实数据不一致,即,如果其他会话对真实数据进行更改。如果您只是查看某个特定点上的数据的快照,则这可能是正确的,但如果您还根据对临时副本所做的更改更新了实际表格,则会很危险。

+0

除了陈旧的数据这个例子中,还有什么其他方面的差异? – TimLeung 2008-12-09 15:07:13

这正是我使用寻呼服务器上的方法,

创建一个表变量(为什么招致事务日志的开销?)只需键值。 (使用autonum标识列主键创建表 - 这将是RowNum。)

根据用户排序/过滤标准将键插入到表中。标识列现在是可用于分页的行号。

从表变量选择加入到其它表与需要真实的数据,加入了对键值,

Where RowNum Between ((PageNumber-1) * PageSize) + 1 And PageNumber * PageSize 
+0

任何想法为什么ASP.Net会员利用临时表与表变量...可能是另一个问题... – TimLeung 2008-12-09 15:47:31

想想这样。假设您的查询将返回足够的记录来填充1000个页面。你认为有多少用户会看到所有这些页面?通过仅返回ID,您不会返回许多您可能需要或可能不需要看到的信息。所以它应该节省网络和服务器资源。如果他们确实经历了大量页面,则需要足够的时间才能确实需要刷新数据细节。

寻呼的替代方式(我公司的做法)是使用CTE。

退房从http://softscenario.blogspot.com/2007/11/sql-2005-server-side-paging-using-cte.html

CREATE PROC GetPagedEmployees (@NumbersOnPage INT=25,@PageNumb INT = 1) 
AS BEGIN 

WITH AllEmployees AS 
(SELECT ROW_NUMBER() OVER (Order by [Person].[Contact].[LastName]) AS RowID, 
[FirstName],[MiddleName],[LastName],[EmailAddress] FROM [Person].[Contact]) 

SELECT [FirstName],[MiddleName],[LastName],[EmailAddress] 
FROM AllEmployees WHERE RowID BETWEEN 
((@PageNumb - 1) * @NumbersOnPage) + 1 AND @PageNumb * NumbersOnPage 
ORDER BY RowID