2013-12-11 43 views
-1

我已经使用下面的查询来填充我的表适配器,但是当我的应用程序运行它是如此之慢,但是当我运行在SQL管理它的快!让我知道我的选择的问题,如何可以更优化!优化SQL选择tableadapter填充方法

SELECT (
     SELECT FullName AS Expr1 
     FROM Sales.CustomerInfo 
     WHERE (AccountFK = Ordering.Orders.CustomerFK) 
     ) AS Customer 
    ,Ordering.Orders.OrderID 
    ,Ordering.Orders.OrderDate 
    ,Ordering.Orders.OrderWayBill 
    ,Ordering.Orders.ExpireDate 
    ,Ordering.ShipperInfo.ShipperCompany 
    ,Production.Store.StoreName 
    ,Production.Product.ProductName 
    ,Ordering.Orders.Quantity 
    ,Ordering.Orders.Price 
    ,Ordering.Orders.ShipAddress 
    ,Ordering.Orders.Description1 
    ,Ordering.Orders.Description2 
    ,Ordering.Orders.Discount 
    ,Ordering.OrderStatus.Description 
    ,Sales.PaymentTerm.Description AS PaymentTerm 
    ,Ordering.Orders.CustomerFK 
    ,Ordering.Orders.ShipperFK 
    ,Ordering.Orders.StoreFK 
    ,Ordering.Orders.ProductCategoryFK 
    ,Ordering.Orders.ProductFK 
    ,Ordering.Orders.OrderStatusFK 
    ,Ordering.Orders.PaymentTermFK 
    ,Ordering.Orders.FinancialPeriodFK 
    ,Ordering.Orders.CompanyInfoFK 
    ,DueDate = (
     SELECT TOP 1 duedate 
     FROM (
      SELECT duedate = DATE 
      FROM banking.receivedcash 
      WHERE orderfk = Ordering.Orders.OrderID 

      UNION ALL 

      SELECT duedate = duedate 
      FROM banking.receivedcheque 
      WHERE orderfk = Ordering.Orders.OrderID 
      ) AS a 
     ORDER BY duedate DESC 
     ) 
FROM Ordering.Orders 
LEFT OUTER JOIN Ordering.ShipperInfo 
    ON Ordering.Orders.ShipperFK = Ordering.ShipperInfo.ShipperInfoID 
LEFT OUTER JOIN Production.Product 
    ON Ordering.Orders.ProductFK = Production.Product.ProductID 
LEFT OUTER JOIN Production.Store 
    ON Ordering.Orders.StoreFK = Production.Store.StoreID 
LEFT OUTER JOIN Ordering.OrderStatus 
    ON Ordering.Orders.OrderStatusFK = Ordering.OrderStatus.OrderStatusID 
LEFT OUTER JOIN Sales.PaymentTerm 
    ON Ordering.Orders.PaymentTermFK = Sales.PaymentTerm.PaymentTermID 
+0

您是否在调试或发布模式下运行您的应用程序? – TGlatzer

+0

只要将SQL放入查询中,那么性能应该是相同的。顺便说一句:你的SQL通常看起来很慢,所有这些外连接。你确定调用代码是罪魁祸首吗? –

+0

@ Grumbler85在两种模式下测试的速度相当慢 –

回答

1

由于每行都执行两个子查询,因此查询速度很慢。如果将它们重写为连接,速度会更快。

+0

我不能写第二个子集的联接 –

+0

当然可以。想想'SELECT MAX(duedate),orderfk FROM ... GROUP BY orderfk' – Twinkles

+0

Twinkles - 也许你可以写出一个完整的例子吗?请注意'UNION ALL'的确使它变得更棘手......但是有几种方法呢?但是,我更喜欢做这样的事情。 –