2017-03-15 1 views
0

Je suis nouveau sur asp.net mvc5.Comment améliorer la vitesse d'obtention de données à partir de la base de données SQL Server dans ASP.NET MVC (dupe)

J'ai un modèle Shipping et mon dbo.Shippings.sql est montré ici:

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

Et ma première page doit montre toutes les navigations que non vendus (if shipping.truckerId == null signifie ne pas encore vendus)

Dans mon ShippingController je ci-dessous:

// 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()); 

    } 

Je pense:

var shippings = from s in db.Shippings 
       where s.TruckerId == null 
       select s; 

n'est pas moyen intelligent d'obtenir et il est navigations très lent si le db grossit ..

S'il vous plaît aider!

+3

Vous avez beaucoup de colonnes 'nvarchar (max)' ... pourquoi? – SqlZim

+0

@SqlZim Je viens de les définir 'chaîne' n'a pas donné de restriction. Shoud je leur donne une valeur maximale? –

+0

Je ne pense pas que votre vrai problème est dans le code que vous avez suggéré. Je pense est dans ces contient. C'est un coût réel pour analyser toutes ces valeurs. Une question: montrez-vous vraiment TOUTES ces colonnes dans la vue? –

Répondre

3

De toute évidence, vous devez revoir vos types de données. Ce n'est tout simplement pas faisable que vous avez réellement besoin de beaucoup de colonnes VARCHAR(MAX). Donc, la première chose est de remodeler la base de données dans ce sens. Je vous recommande fortement d'examiner la série Stairway to Data de Joe Celko sur SQL Server Central, elle vous donnera une image claire des types de données et de leur utilisation correcte.

D'autre part, si vous voulez obtenir seulement quelques champs que l'utilisation de LINQ vous pouvez aller avec quelque chose comme:

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

Ensuite, vous passez à un List<> ou si et vous obtiendrez seulement ce que vous avez besoin.