PDA

View Full Version : Query و SubQuery از یک جدول



A.Farzin
یک شنبه 30 دی 1386, 02:29 صبح
با سلام

جدولی حاوی تعداد سفارش رسیده و تعداد فروش رفته از آنها دارم. میخواهم تعداد سفارشهائی که هنوز کاملاً فروخته نشده‌اند را با یک کوئری استخراج کنم.
برای این منظور از یک SubQuery استفاده کرده‌ام. بدین شکل که Query و SubQuery هر دو به یک جدول ارجاع دارند.

کد ساخت جدول:

--- Create Table
CREATE TABLE [dbo].[OrderResult] (
[RecID] [int] IDENTITY (1, 1) NOT NULL ,
[OrderID] [int] NULL ,
[Received] [int] NULL ,
[Sold] [int] NULL
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[OrderResult] WITH NOCHECK ADD
CONSTRAINT [PK_OrderResult] PRIMARY KEY CLUSTERED
(
[RecID]
) ON [PRIMARY]
GO

کد ورود تعدادی رکورد:

--- Insert Data
insert OrderResult(OrderID, Received, Sold) values (1125, 143, 0)
insert OrderResult(OrderID, Received, Sold) values (1217, 275, 0)
insert OrderResult(OrderID, Received, Sold) values (1219, 119, 0)
insert OrderResult(OrderID, Received, Sold) values (1220, 496, 0)
insert OrderResult(OrderID, Received, Sold) values (1125, 0, 143)
insert OrderResult(OrderID, Received, Sold) values (1217, 0, 240)
insert OrderResult(OrderID, Received, Sold) values (1219, 0, 119)
insert OrderResult(OrderID, Received, Sold) values (1220, 0, 350)

کد کوئری:

-- Query
SELECT RecID, OrderID, Received, Sold
From OrderResult Left OUTER JOIN (
SELECT RecID as RecID2, OrderID AS OrderID2, Received as Received2, Sold As Sold2
FROM OrderResult
) t2
ON OrderID = OrderID2 And Received = Sold2 And Sold = Received2
WHERE RecID2 IS NULL
ORDER BY OrderID

و اما، مشکل:
الف) این کوئری را روی دو مورد از دیتاها تست کردم در یک حالت جدول حاوی 000ر20رکورد بود و در مدت زمان مناسبی جواب را برگرداند
ب) در حالت دیگر که جدول حاوی 000ر550 رکورد بود، حدود 15 دقیقه زمان صرف اجرای آن شد و آخر سر هم آن را Cancel کردم. این در حالیست که کوئری ساده و بدون جوین از این جدول ظرف 7 ثانیه جواب می‌داد.
به نظر شما چرا چنین می‌شد. آیا ممکن است که SubQuery جدول را Lock کند؟

ممنون

AFSHIN_REFUA
یک شنبه 30 دی 1386, 10:35 صبح
با سلام من هم از این بلاها سرم زیاد آمده
اول روی OrderId یک Index NonClustered بگذارید اگر حل نشد
روی دو ستون Recived ,Sold اندیس غیر خوشه ای بگذارید مشکلتان حل میشه
لطفا نتیجه را به من هم اعلام کنید

AminSobati
یک شنبه 30 دی 1386, 23:25 عصر
یک Screen Shot از Execution Plan بگیرین، ضمنا set statistics profile on و بعد Query رو اجرا کنین و نتیجه Profile رو پست کنین