C# 如何在ASP.NET MVC中提高从SQL Server数据库获取数据的速度

C# 如何在ASP.NET MVC中提高从SQL Server数据库获取数据的速度,c#,sql,asp.net,sql-server,azure,C#,Sql,Asp.net,Sql Server,Azure,我是asp.NETMVC5新手。我有一个模型Shipping,我的dbo.Shippings.sql如下: CREATE TABLE [dbo].[Shippings] ( [Id] INT IDENTITY (1, 1) NOT NULL, [TruckerId] NVARCHAR (MAX) NULL, .........more there... CONSTRAINT [PK_dbo.Shi

我是asp.NETMVC5新手。我有一个模型
Shipping
,我的
dbo.Shippings.sql
如下:

CREATE TABLE [dbo].[Shippings] 
(
    [Id]                INT             IDENTITY (1, 1) NOT NULL,
    [TruckerId]         NVARCHAR (MAX)  NULL,
.........more there...

    CONSTRAINT [PK_dbo.Shippings] 
        PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [FK_dbo.Shippings_dbo.AspNetUsers_ApplicationUserId] 
        FOREIGN KEY ([ApplicationUserId]) REFERENCES [dbo].[AspNetUsers] ([Id]) ON DELETE CASCADE
);

CREATE NONCLUSTERED INDEX [IX_ApplicationUserId]
    ON [dbo].[Shippings]([ApplicationUserId] ASC);
我的第一页必须显示所有未售出的发货(
如果shipping.truckerId==null
表示尚未售出)

在my
ShippingController
中,我有以下内容:

// GET: Shipping
public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
{
        //below is sorting
        ViewBag.CurrentSort = sortOrder;
        ViewBag.FromSortParm = String.IsNullOrEmpty(sortOrder) ? "from_desc" : "";
        ViewBag.DestSortParm = sortOrder == "Destination" ? "dest_desc" : "Destination";

        if (searchString != null)
        {
            page = 1;
        }
        else
        {
            searchString = currentFilter;
        }

        ViewBag.CurrentFilter = searchString;

        //below is searching state and zipcode
        var shippings = from s in db.Shippings
                        where s.TruckerId == null
                        select s;

        if (!String.IsNullOrEmpty(searchString))
        {
            shippings = shippings.Where(s => s.FromState.Contains(searchString)//from state
                                   || s.DestState.Contains(searchString)//dest state
                                   || s.FromZipCode.Contains(searchString)//from zipcode
                                   || s.DestZipCode.Contains(searchString));//dest zipcode
        }

        switch (sortOrder)
        {
            case "from_desc":
                shippings = shippings.OrderByDescending(s => s.From);
                break;
            case "Destination":
                shippings = shippings.OrderBy(s => s.Destination); //not working
                break;
            case "dest_desc":
                shippings = shippings.OrderByDescending(s => s.Destination); //not working
                break;
            default:
                shippings = shippings.OrderByDescending(s => s.OrderDateTime);
                break;
        }

        int pageSize = 10;
        int pageNumber = (page ?? 1);
        return View(shippings.ToPagedList(pageNumber, pageSize));
        //return View(shippings.ToList());

}
我认为:

var shippings = from s in db.Shippings
                where s.TruckerId == null
                select s;
这不是获得发货的聪明方法,如果db变大,速度会非常慢

我只需要显示它的FromCity、FromState、FromZipCode、PickUpDateTime、DestCity、DestState、DestZipCode、价格、内容和卡车ID,告诉它是否售出

请帮忙

编辑和更新: 在我问这个问题的时候,我对web开发和数据库还相当陌生。 通过为db创建索引,我能够获得更好的性能。因此,快速查找是可能的。 我还重新设计了web应用程序的体系结构。
我还创建了一个未售出的发货视图。因此,如果web访问db中的视图,它将不必花费时间进行筛选。

没有足够的声誉进行评论,我将删除此内容,或重新制作以回答

那么:

  • 添加一些枚举状态(已售出、活动、租金中等),或者仅在不需要更多状态时为已售出创建布尔值
  • 或者可能进行一些优化(例如将NVARCHAR(MAX)减少到可能的最长值,例如属性名为NVARCHAR(20)

  • 注:我认为,这项选择不会降低很多速度….

    首先要加快创建适当索引的速度。特别是在where子句中使用的列上。lok表示非聚集索引。此外,您还可以使用sql配置文件生成sql,然后分析查询计划并使用适当的数据类型。您有varchar(max)到处都是。你真的预计跟踪数字会超过8000个字符吗?不要使用float和real来保存你想要精确的值。它们是近似的数据类型。改用numeric。只使用正确的数据类型将大大减少行的宽度。与此相同的问题:@SeanLange什么是最好的数据类型ta价格和长度类型(英寸)?表很好,但随着表变大,您可能需要更多的子句和基于分页的查询来处理此表…需要数百万条记录。您的问题都与需要提取更多结果的数量有关。