2010-03-09 101 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來定義該訂單。