【问题标题】:How to improve speed of getting data from SQL Server database in ASP.NET MVC [closed]如何提高在 ASP.NET MVC 中从 SQL Server 数据库获取数据的速度 [关闭]
【发布时间】:2017-08-06 13:04:21
【问题描述】:

我是 asp.net mvc5 的新手。我有一个模型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);

而且我的第一页必须显示所有未售出的货物(if shipping.truckerId == null 表示尚未售出)

在我的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;

不是聪明的方式来获得运输,如果数据库变得更大,它会很慢..

我只需要显示它的 FromCity、FromState、FromZipCode、PickUpDateTime、DestCity、DestState、DestZipCode、Price、Content 和 TruckerId 即可。

请帮忙!

编辑和更新: 在我问这个问题的时候,我对 Web 开发和数据库还很陌生。 通过为 db 创建索引,我能够获得更好的性能。如此快速查找成为可能。 我也重新制作了网络应用程序的架构。 我还创建了一个未售出的运输视图。因此,如果网络从 db 中访问视图,则始终不必花费时间进行过滤。

【问题讨论】:

  • 首先要加快创建适当的索引。特别是在 where 子句中使用的列上。乐为非聚集索引。您也可以使用 sql profile 来获取生成的 sql,然后分析查询计划
  • 并使用适当的数据类型。你到处都有 varchar(max) 。您真的预计跟踪号码会超过 8,000 个字符吗?并且不要使用 float 和 real 来保存您想要精确的值。它们是近似数据类型。请改用数字。仅使用正确的数据类型将大大减少行的宽度。
  • 与此处相同的问题:dba.stackexchange.com/questions/167259/…
  • @SeanLange 价格和长度(英寸)的最佳数据类型是什么?
  • 该表很好,但您可能需要更多子句和基于分页的查询来处理该表,因为它变得越来越大......考虑数百万条记录。您的问题都与您需要提取的结果数量有关。

标签: c# sql asp.net sql-server azure


【解决方案1】:

没有足够的声誉发表评论,我会删除这个,或者重新制作回答!!!

怎么样:

  1. 添加一些枚举状态(已售出、活动中、出租中...)或仅在不需要更多状态时为已售出布尔值
  2. 或者也许是一些优化(比如将 NVARCHAR(MAX) 减少到可能的最长值,例如属性名称为 NVARCHAR(20)

附: : 我认为,这个选择不会慢很多....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多