Asp.net mvc 执行OrderBy时,升序排序顺序索引与降序排序顺序索引

Asp.net mvc 执行OrderBy时,升序排序顺序索引与降序排序顺序索引,asp.net-mvc,linq,entity-framework,sql-server-2008-r2,indexing,Asp.net Mvc,Linq,Entity Framework,Sql Server 2008 R2,Indexing,我正在开发一个asp.net mvc web应用程序,我正在使用Sql server 2008 R2+实体框架。 现在,在sql server上,我在可能按顺序排列的任何列上添加了唯一索引。例如,我在Sql server上的标记column上创建了一个唯一索引,并定义了索引的排序顺序为升序。现在,我的应用程序中有一些查询将标记按升序排列,而其他查询将标记按降序排列,如下所示:- LatestTechnology = tms.Technologies.Where(a=> !a.IsDelet

我正在开发一个asp.net mvc web应用程序,我正在使用Sql server 2008 R2+实体框架。 现在,在sql server上,我在可能按顺序排列的任何列上添加了唯一索引。例如,我在Sql server上的标记column上创建了一个唯一索引,并定义了索引的排序顺序为升序。现在,我的应用程序中有一些查询将标记按升序排列,而其他查询将标记按降序排列,如下所示:-

LatestTechnology = tms.Technologies.Where(a=> !a.IsDeleted && a.IsCompleted).OrderByDescending(a => a.Tag).Take(pagesize).ToList(),;

TechnologyList = tms.Technologies.Where(a=> !a.IsDeleted && a.IsCompleted).OrderBy (a => a.Tag).Take(pagesize).ToList();
所以我的问题是这两个OrderByDescending(a=>a.Tag)是否OrderBy(a=>a.Tag)可以从标记栏上sql server上的唯一索引中获益吗?或者我应该在sql server上定义两个唯一的索引,一个具有升序排序顺序,另一个具有降序排序顺序? 谢谢

编辑

以下查询:-

LatestTechnology = tms.Technologies.Where(a=> !a.IsDeleted && a.IsCompleted).OrderByDescending(a => a.Tag).Take(pagesize).ToList();
将生成sql server探查器提到的以下sql语句:-

  SELECT TOP (15) 

        [Extent1].[TechnologyID] AS [TechnologyID], 
        [Extent1].[Tag] AS [Tag], 
        [Extent1].[IsDeleted] AS [IsDeleted], 
        [Extent1].[timestamp] AS [timestamp], 
        [Extent1].[TypeID] AS [TypeID], 
        [Extent1].[StartDate] AS [StartDate], 
        [Extent1].[IT360ID] AS [IT360ID], 
        [Extent1].[IsCompleted] AS [IsCompleted]
        FROM [dbo].[Technology] AS [Extent1]
        WHERE ([Extent1].[IsDeleted] <> cast(1 as bit)) AND ([Extent1].[IsCompleted] = 1)
        ORDER BY [Extent1].[Tag] DESC
选择顶部(15)
[Extent1][TechnologyID]作为[TechnologyID],
[Extent1].[Tag]作为[Tag],
[extend1][IsDeleted]作为[IsDeleted],
[Extent1]。[timestamp]作为[timestamp],
[Extent1]。[TypeID]作为[TypeID],
[Extent1][StartDate]作为[StartDate],
[Extent1]。[IT360ID]作为[IT360ID],
[Extent1][IsCompleted]作为[IsCompleted]
从[dbo].[Technology]到[Extent1]
其中([Extent1].[IsDeleted]转换(1作为位))和([Extent1].[IsCompleted]=1)
按[Extent1].[Tag]DESC订购

要回答您的问题:

所以我的问题是这两个OrderByDescending(a=>a.Tag)是否存在差异& OrderBy(a=>a.Tag)可以从 标签栏上的sql server

是的,SQL Server可以从两个方向读取索引:如在索引定义中或在完全相反的方向

然而,从您的介绍中,我怀疑您仍然对
orderby
的索引工作方式有错误的印象。如果您同时拥有一个
where
子句和一个
orderby
子句,则必须确保有一个包含这两个子句的索引!对于
where
子句(比如on
isDeleted
isCompleted
——不管您的示例中是什么),在
标记上有另一个索引是没有帮助的。您需要有一个索引,该索引首先包含
where
子句的列,然后是
orderby
子句的列(多列索引)

要使它正常工作可能很棘手,但值得付出努力,特别是如果您只获取前几行(如示例中所示)

如果无法立即解决,请查看以下内容:

在询问性能建议时,通常最好显示实际的SQL查询,而不是.NET源代码。然后我可以告诉你要创建的索引。目前,我不确定
isDeleted
isCompleted
-这些表列或表达式是对其他列求值的吗

编辑(添加SQL查询后)

有两种方法可以使查询作为索引top-n查询工作:

第一个选项是where子句中的列上的常规索引,后跟order by子句中的列。但是,当查询使用此筛选器时,
IsDeleted cast(1作为位)
它不能以保留顺序的方式使用索引。但是,如果您对查询进行了重新措辞,使其读起来像这样
IsDeleted=cast(0为位)
,那么它就工作了。请看小提琴,我已经准备好了。是的,SQL Server可能足够聪明,可以知道这一点,但它似乎不是

对不起,我不知道如何调整EF以上述方式生成查询

不过,还有第二个选项使用所谓的过滤索引,即只包含表行子集的索引。它也在SQL中。在这里,以与查询中显示的方式相同的方式将where子句添加到索引定义中是很重要的

在这两种情况下,如果将DESC更改为ASC,它仍然有效


重要的一点是执行计划不显示排序操作。您也可以在SQL FIDLE(单击“查看执行计划”)中验证这一点。

IsDeleted和isCompleted是两位列,我已使用SQL server探查器指示的SQL查询编辑了我的原始问题。@johnG在上面添加了建议。