私は次の見解を持っています:
SELECT
poHeader.No_ AS PONumber,
poHeader.[Buy-from Vendor No_] AS VendorNumber,
poHeader.[Document Date] AS DocumentDate,
vendor.Name AS VendorName,
vendor.Contact AS VendorContact,
vendor.[E-Mail] AS VendorEmail,
vendor.Address AS VendorAddress,
vendor.[Address 2] AS VendorAddress2,
vendor.City AS VendorCity,
vendor.County AS VendorCounty,
vendor.[Post Code] AS VendorPostCode,
vendor.[Phone No_] AS VendorPhone,
vendor.[Fax No_] AS VendorFax,
salesHeader.No_ AS SONumber,
poHeader.[Order Date] AS OrderDate,
salesHeader.[Crocus Comment] AS CrocusComment,
salesHeader.GiftMessage,
salesHeader.[Delivery Comment] AS DeliveryComment,
salesHeader.[Shipment Date] AS DeliveryDate,
COALESCE (salesHeader.[Ship-to Name],
poHeader.[Ship-to Name]) AS DeliveryName,
COALESCE (salesHeader.[Ship-to Address],
poHeader.[Ship-to Address]) AS DeliveryAddress,
COALESCE (salesHeader.[Ship-to Address 2],
poHeader.[Ship-to Address 2]) AS DeliveryAddress2,
COALESCE (salesHeader.[Ship-to City],
poHeader.[Ship-to City]) AS DeliveryCity, COALESCE (salesHeader.[Ship-to County],
poHeader.[Ship-to County]) AS DeliveryCounty,
COALESCE (salesHeader.[Ship-to Post Code],
poHeader.[Ship-to Post Code]) AS DeliveryPostcode,
salesHeader.DeliveryPhoneNo, poForEmailing.Processed,
poForEmailing.Copied
FROM
Navision4.dbo.[Crocus Live$Purch_ orders for e-mailing] AS poForEmailing
LEFT OUTER JOIN
Navision4.dbo.[Crocus Live$Purchase Header] AS poHeader ON poForEmailing.No_ = poHeader.No_
INNER JOIN
Navision4.dbo.[Crocus Live$Vendor] AS vendor ON poHeader.[Buy-from Vendor No_] = vendor.No_
LEFT OUTER JOIN
Navision4.dbo.[Crocus Live$Sales Header] AS salesHeader ON salesHeader.No_ = dbo.fnGetSalesOrderNumber(poHeader.No_)
このビューは、NavisionMeta という名前のデータベースで作成されます。Navision4 という名前のデータベース (同じサーバー上) にクエリを実行します。
最近、両方のデータベースを新しい (より良い) ハードウェアに移動しました。これが関連しているかどうかはわかりませんが、新しいハードウェアには SQL 2008 があり、古いハードウェアは SQL 2000 を実行していました
SQL Management Studio でこのクエリを使用してクエリを実行すると、2 分以上かかります。
SELECT *
FROM [NavisionMeta].[dbo].[PurchaseOrders]
WHERE Processed=0 AND Copied=0
これは長すぎます!
LINQ の次のクエリは、タイムアウトを 5 分に調整しても、すべて一緒にタイムアウトします。
var purchaseOrdersNotProcessed = (from p in db.PurchaseOrders
where p.Copied.Equals(0)
&& p.Processed.Equals(0)
select p).ToList();
私を困惑させているのは、以前のハードウェアでは問題なく動作していたことです!
関連する場合に備えて、上記で使用されている udf は次のとおりです。
CREATE FUNCTION [dbo].[fnGetSalesOrderNumber](@PONumber varchar(20))
RETURNS varchar(20)
AS
BEGIN
RETURN (
SELECT
TOP 1 [Sales Order No_]
FROM
Navision4.dbo.[Crocus Live$Purchase Line]
WHERE
[Document No_] = @PONumber
)