LINQ-To-SQL - медленный запрос - PullRequest
0 голосов
/ 28 ноября 2011

Мне просто интересно, может ли кто-нибудь дать какой-нибудь совет о том, как улучшить мой запрос.

По сути, это объединит 2 строки в 1. Единственное, чем будут отличаться строки, это столбец типа «Тип» («S» или «C») и значение. Я хочу выбрать одну строку со значением «S» и значением «C» и вычислить разницу (S-C).

Мой запрос работает, но он довольно медленный - получение результатов занимает около 8 секунд, что не идеально для моего приложения. Я хотел бы изменить структуру базы данных, но я не могу, к сожалению,!

Вот мой запрос:

var sales = (from cm in dc.ConsignmentMarginBreakdowns
            join sl in dc.SageAccounts on new { LegacyID = cm.Customer, Customer = true } equals new { LegacyID = sl.LegacyID, Customer = sl.Customer }
            join ss in dc.SageAccounts on sl.ParentAccount equals ss.ID
            join vt in dc.VehicleTypes on cm.ConsignmentTripBreakdown.VehicleType.Trim() equals vt.ID.ToString() into vtg
            where cm.ConsignmentTripBreakdown.DeliveryDate >= dates.FromDate && cm.ConsignmentTripBreakdown.DeliveryDate <= dates.ToDate
            where (customer == null || ss.SageID == customer)
            where cm.BreakdownType == 'S'
            orderby cm.Depot, cm.TripNumber
            select new
            {
                NTConsignment = cm.NTConsignment,
                Trip = cm.ConsignmentTripBreakdown,
                LegacyID = cm.LegacyID,
                Costs = dc.ConsignmentMarginBreakdowns.Where(a => a.BreakdownType == 'C' && a.NTConsignment == cm.NTConsignment && a.LegacyID == cm.LegacyID && a.TripDate == cm.TripDate && a.Depot == cm.Depot && a.TripNumber == cm.TripNumber).Single().Value,
                Sales = cm.Value ?? 0.00m,
                Customer = cm.Customer,
                SageID = ss.SageID,
                CustomerName = ss.ShortName,
                FullCustomerName = ss.Name,
                Vehicle = cm.ConsignmentTripBreakdown.Vehicle ?? "None",
                VehicleType = vtg.FirstOrDefault().VehicleTypeDescription ?? "Subcontractor"
            });

Ответы [ 2 ]

1 голос
/ 28 ноября 2011

Хорошее место для начала при оптимизации запросов Linq к SQL - это SQL Server Profiler.Там вы можете найти, какой код SQL генерируется Linq to SQL.Оттуда вы можете поиграть с запросом linq, чтобы посмотреть, сможете ли вы написать его лучше.Если это не сработает, вы всегда можете написать хранимую процедуру вручную, а затем вызвать ее из Linq в SQL.

1 голос
/ 28 ноября 2011

На самом деле недостаточно информации, чтобы составить обоснованное мнение.Например, сколько строк в каждой из таблиц?Как выглядит сгенерированный T-SQL?

Первое, что я хотел бы предложить, - это взять выведенный T-SQL, сгенерировать план запроса и найти сканирование таблицы или индекса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...