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这么多。
此外,它的种类不清楚这个临时表给了什么好处。如果您的目标是阻止用户访问对象/应用程序,那么为什么要添加有关它的部分“仅在此特定数据表页面上才受限制”。从安全的角度来看,这似乎是一种漏洞。
由于它从相同的表中进行选择,所以临时表也可以被消除。
随着方法1中,在临时表中的数据可能与真实数据不一致,即,如果其他会话对真实数据进行更改。如果您只是查看某个特定点上的数据的快照,则这可能是正确的,但如果您还根据对临时副本所做的更改更新了实际表格,则会很危险。
除了陈旧的数据这个例子中,还有什么其他方面的差异? – TimLeung 2008-12-09 15:07:13
这正是我使用寻呼服务器上的方法,
创建一个表变量(为什么招致事务日志的开销?)只需键值。 (使用autonum标识列主键创建表 - 这将是RowNum。)
根据用户排序/过滤标准将键插入到表中。标识列现在是可用于分页的行号。
从表变量选择加入到其它表与需要真实的数据,加入了对键值,
Where RowNum Between ((PageNumber-1) * PageSize) + 1 And PageNumber * PageSize
任何想法为什么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
我已经将它包含在上面的问题 – TimLeung 2008-12-09 15:19:19