Sql server 如何在ASP.NET MVC(dupe)中提高从SQL Server数据库获取数据的速度

Sql server 如何在ASP.NET MVC(dupe)中提高从SQL Server数据库获取数据的速度,sql-server,query-performance,Sql Server,Query Performance,我是asp.NETMVC5新手 我有一个模型Shipping,我的dbo.Shippings.sql如下所示: CREATE TABLE [dbo].[Shippings] ( [Id] INT IDENTITY (1, 1) NOT NULL, [TrackingNumber] NVARCHAR (MAX) NOT NULL, [FromCompany] NVARCHAR (MAX) NULL

我是asp.NETMVC5新手

我有一个模型
Shipping
,我的
dbo.Shippings.sql
如下所示:

CREATE TABLE [dbo].[Shippings] 
(
    [Id]                INT             IDENTITY (1, 1) NOT NULL,
    [TrackingNumber]    NVARCHAR (MAX)  NOT NULL,
    [FromCompany]       NVARCHAR (MAX)  NULL,
    [FromContactName]   NVARCHAR (MAX)  NULL,
    [From]              NVARCHAR (MAX)  NOT NULL,
    [FromCity]          NVARCHAR (MAX)  NOT NULL,
    [FromState]         NVARCHAR (MAX)  NOT NULL,
    [FromZipCode]       NVARCHAR (MAX)  NOT NULL,
    [FromCountry]       NVARCHAR (MAX)  NOT NULL,
    [FromPhoneNumber]   NVARCHAR (MAX)  NULL,
    [FromFaxNumber]     NVARCHAR (MAX)  NULL,
    [Commodity]         NVARCHAR (MAX)  NOT NULL,
    [OrderDateTime]     DATETIME        NOT NULL,
    [OrderByName]       NVARCHAR (MAX)  NOT NULL,
    [PickUpDateTime]    DATETIME        NOT NULL,
    [PickUpRefNum]      NVARCHAR (MAX)  NOT NULL,
    [DestCompany]       NVARCHAR (MAX)  NULL,
    [DestContactName]   NVARCHAR (MAX)  NULL,
    [Destination]       NVARCHAR (MAX)  NOT NULL,
    [DestCity]          NVARCHAR (MAX)  NOT NULL,
    [DestState]         NVARCHAR (MAX)  NOT NULL,
    [DestZipCode]       NVARCHAR (MAX)  NOT NULL,
    [DestCountry]       NVARCHAR (MAX)  NOT NULL,
    [DestPhoneNumber]   NVARCHAR (MAX)  NULL,
    [DestFaxNumber]     NVARCHAR (MAX)  NULL,
    [DeliveryDateTime]  DATETIME        NOT NULL,
    [Price]             FLOAT (53)      NOT NULL,
    [Category]          NVARCHAR (MAX)  NOT NULL,
    [FreightClass]      INT             NOT NULL,
    [Pkgs]              INT             NOT NULL,
    [Weight]            REAL            NOT NULL,
    [Length]            REAL            NOT NULL,
    [Width]             REAL            NOT NULL,
    [Height]            REAL            NOT NULL,
    [IsDelivered]       BIT             NOT NULL,
    [ApplicationUserId] NVARCHAR (128)  NOT NULL,
    [AcceptOffer]       BIT             DEFAULT ((0)) NOT NULL,
    [TruckerId]         NVARCHAR (MAX)  NULL,
    [Description]       NVARCHAR (MAX)  NULL,
    [FileName]          NVARCHAR (255)  NULL,
    [ContentType]       NVARCHAR (100)  NULL,
    [Content]           VARBINARY (MAX) NULL,

    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
);
GO

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变大,速度会非常慢


请帮忙

显然,您需要检查数据类型。实际上,需要那么多
VARCHAR(MAX)
列是不可行的。因此,第一件事就是从这个意义上重塑数据库。我强烈建议您看看Joe Celko的SQL Server Central系列,它将为您提供数据类型及其正确用法的清晰图像

另一方面,如果您只想使用LINQ从中获取一些字段,您可以使用以下方法:

using (var ctx = new MyDataContext())
{
     var theDataINeed = (from myData in ctx.Shipping
                        where myData.TruckerId == null
                        select new {
                           myData.FromCity,
                           myData.FromState,
                           myData.FromZipCode,
                           myData.PickUpDateTime
                        });
}

然后将其传递到一个
列表
左右,您将只得到所需的数据。

显然,您需要查看您的数据类型。实际上,需要那么多
VARCHAR(MAX)
列是不可行的。因此,第一件事就是从这个意义上重塑数据库。我强烈建议您看看Joe Celko的SQL Server Central系列,它将为您提供数据类型及其正确用法的清晰图像

另一方面,如果您只想使用LINQ从中获取一些字段,您可以使用以下方法:

using (var ctx = new MyDataContext())
{
     var theDataINeed = (from myData in ctx.Shipping
                        where myData.TruckerId == null
                        select new {
                           myData.FromCity,
                           myData.FromState,
                           myData.FromZipCode,
                           myData.PickUpDateTime
                        });
}

然后你将它传递到一个
列表
左右,你只会得到你需要的。

你有许多
nvarchar(max)
列。。。为什么?@SqlZim我只是设置了
string
没有限制。我应该给他们最大值吗?我不认为你真正的问题在于你建议的代码。我想是在那些容器里。这是分析所有这些价值的实际成本。一个问题:你真的在视图中显示了所有这些列吗?@RenatoAfonso No我只显示了它的
FromCity
FromState
FromZipCode
PickUpDateTime
DestCity
DestZipCode
Price
内容
,和
TruckerId
,告诉它是否已售出。然后,我建议的第一件事是,仅检索该select上所需的列,并调整视图以仅访问该对象。有一件事你可能需要考虑的是,如果你确实有很多价值,可能需要一些时间来加载页面列表。为了减少这种情况,只使用列表中请求的值访问数据库。您有许多
nvarchar(max)
列。。。为什么?@SqlZim我只是设置了
string
没有限制。我应该给他们最大值吗?我不认为你真正的问题在于你建议的代码。我想是在那些容器里。这是分析所有这些价值的实际成本。一个问题:你真的在视图中显示了所有这些列吗?@RenatoAfonso No我只显示了它的
FromCity
FromState
FromZipCode
PickUpDateTime
DestCity
DestZipCode
Price
内容
,和
TruckerId
,告诉它是否已售出。然后,我建议的第一件事是,仅检索该select上所需的列,并调整视图以仅访问该对象。有一件事你可能需要考虑的是,如果你确实有很多价值,可能需要一些时间来加载页面列表。为了减少这种情况,只使用列表中请求的值访问数据库。