aspnet_Users表的排序顺序

时间:2010-03-09 15:05:11

标签: asp.net sql-server asp.net-membership

我想知道aspnet_Users表是否总是按照UserName排序,即使我在两个已经存在的用户之间按字母顺序添加新用户。

我注意到方法Membership.GetAllUsers()似乎总是返回一个已排序的MembershipUsers集合。

当我查看SQL Server Management Studio并运行没有ORDERBY子句的简单SQL查询时......

SELECT [UserName]
  FROM [MyDb].[dbo].[aspnet_Users]

...我总是得到排序结果列表。

我对SQL Server仍然非常不熟悉,但我希望当我向表中添加一个新行时,它会(物理地)附加到表的末尾。当我运行没有ORDERBY的select语句时,将按照它们最初插入数据库的顺序选择行(因此没有任何特定的排序顺序)。

我猜错了。但它是如何运作的呢?它可能是aspnet_Users表中的特殊内容吗?

我很高兴GetAllUsers()返回的MemberShipUserCollection已经排序,但是它总能得到保证吗?

感谢您的信息!

更新

我刚刚注意到数据库包含一个名为aspnet_Membership_GetAllUsers的存储过程。此过程实际上包含ORDER BY的{​​{1}}子句。因此,如果我在代码中使用UserName时确实总是调用此存储过程(至少如果我使用的是SqlMembershipProvider),则说明Membership.GetAllUsers()返回的集合按UserName排序的原因。

仍然是问题:Membership.GetAllUsers()实际上是基于此存储过程吗?

3 个答案:

答案 0 :(得分:3)

UserName上可能存在聚簇索引。这意味着表中的行以UserName顺序存储。 SQL Server通常(但不总是)按照它使用的索引的顺序返回行。

没有order by,就没有保证。因此,如果您依赖于订购的结果,请不要忘记order by:)

答案 1 :(得分:2)

如果没有显式在SQL中指定ORDER BY子句,任何订单都是偶然的,绝对不能以任何方式,形状或形式保证。不要依赖它。

如果您需要特定订单,请使用ORDER BY来定义该订单。

答案 2 :(得分:2)

UserName和ApplicationID上有一个聚簇索引。由于您通常只使用1个applicationID,因此它似乎按UserName排序。表中的数据按其聚簇索引排序。这意味着您通常会按聚簇列的顺序看到未排序的日期返回。但是,它永远不会得到保证。因此,如果希望结果按特定顺序返回,则必须使用ORDER BY。每次将数据插入到具有聚簇索引的表中时,无论物理上属于何处,它都会将其插入到表中。查看分页和聚簇与非群集。它将帮助您了解SQL Server如何存储数据。请查看此http://en.wikipedia.org/wiki/Clustered_index#Architecture以获取概述。