Sql server 如何在ASP.NET MVC(dupe)中提高从SQL Server数据库获取数据的速度
我是asp.NETMVC5新手 我有一个模型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
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
表示尚未售出)
在myShippingController
中,我有以下内容:
// 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上所需的列,并调整视图以仅访问该对象。有一件事你可能需要考虑的是,如果你确实有很多价值,可能需要一些时间来加载页面列表。为了减少这种情况,只使用列表中请求的值访问数据库。