2010-03-09 125 views
1

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

我注意到方法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的存储过程。该过程实际上包含UserNameORDER BY子句。因此,如果在我的代码中使用Membership.GetAllUsers()时总是调用此存储过程(至少如果我使用的是SqlMembershipProvider),它解释了为什么Membership.GetAllUsers()返回的集合按UserName排序。

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

回答

2

UserName和ApplicationID上有一个聚集索引。由于您通常只使用1个applicationID,因此它将显示为按UserName排序。表格中的数据按其聚簇索引进行排序。这意味着您通常会按照群集列的顺序看到未分类的日期返回。但是,它从来没有保证。所以如果你想让结果以特定的顺序回来,你必须使用ORDER BY。无论何时将数据插入到具有聚集索引的表格中,只要物理属于,就会将其插入到表格中。看看分页和聚簇与非聚簇。它将帮助您了解SQL Server如何存储数据。请查看http://en.wikipedia.org/wiki/Clustered_index#Architecture以获得总览。

3

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

没有order by,没有保证。所以,如果你依赖的结果被排序,不要忘了order by :)

2

没有明确在你的SQL指定ORDER BY条款,任何顺序是偶然的,肯定以任何方式,形状或形式不能保证。不要依赖它。

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