PDA

View Full Version : سوال: بالا بردن کارایی در تابع Max



raziee
شنبه 22 آبان 1389, 12:38 عصر
با سلام.
من جدولی دارم به نام Posts که پست های کاربران رو در خودش نگهداری میکنه.
برای هر کاربر تعداد پست ها از 1 شروع شده و بالا میره.
در واقع کلید ترکیبی به وسیله ی WeblogID و PostID ساخته میشه.
حالا سوال من اینه که بهترین روش برای گرفتن MAX چیه؟
یک روش:

SELECT Max(PostID)
FROM Posts
WHERE WeblogID=@WeblogID
و روش دوم:
SELECT Max(CASE WHEN WeblogID=@WeblogID THEN PostID END)
FROM Posts
به نظر شما بازدهی کدوم بیشتره؟

Rezahak
شنبه 22 آبان 1389, 12:47 عصر
از نظر بازدهي و استاندارد بودن قطعا اولي بهينه تر است ولي اگر هدف شما فقط استفاده از يك فيلد autoincreament است چرا از identity استفاده نمي كنيد ؟

Rejnev
شنبه 22 آبان 1389, 12:47 عصر
فكر ميكنم اولي.
اگه بتوني Execution plan رو تحليل كني بهتر به جواب ميرسي.
در كل اين جور كوئري ها به قدري سريعن كه شايد لازم نباشه اينقدر وسواس درش داشت

چرا از identity استفاده نمي كنيد
كليدشون تركيبيه

raziee
شنبه 22 آبان 1389, 13:28 عصر
اگه بتوني Execution plan رو تحليل كني بهتر به جواب ميرسي.
توضیح ای در مورد Execution plan میدید لطفا.

Rejnev
شنبه 22 آبان 1389, 13:38 عصر
صفحه 83 كتاب كوئري پرفورمنس تيونينگ (http://www.4shared.com/document/Q_HZZBA7/Programming_-_SQL_Server_2008_.htm)

كليد جستجو در 4shared
http://search.4shared.com/q/1/Query%20Performance%20Tuning
----
در كل نمايي گرافيكي از اجراي دستورات و هزينه اجراي هر يك از بخشهاي كوئري رو به ما ميده.

ASKaffash
یک شنبه 23 آبان 1389, 09:35 صبح
با سلام.
من جدولی دارم به نام Posts که پست های کاربران رو در خودش نگهداری میکنه.
برای هر کاربر تعداد پست ها از 1 شروع شده و بالا میره.
در واقع کلید ترکیبی به وسیله ی WeblogID و PostID ساخته میشه.
حالا سوال من اینه که بهترین روش برای گرفتن MAX چیه؟
یک روش:

SELECT Max(PostID)
FROM Posts
WHERE WeblogID=@WeblogID
و روش دوم:
SELECT Max(CASE WHEN WeblogID=@WeblogID THEN PostID END)
FROM Posts
به نظر شما بازدهی کدوم بیشتره؟

سلام
ایندکس روی WeblogID و PostID چگونه دارید ؟ (منظورم ترتیب ایندکس چطوریه ؟)

raziee
یک شنبه 23 آبان 1389, 11:03 صبح
سلام
ایندکس روی WeblogID و PostID چگونه دارید ؟ (منظورم ترتیب ایندکس چطوریه ؟)
سلام جناب کفاش.
ایندکس ابتدا بر WeblogID و سپس PostID هست.
تصویری از داده های فرضی از جدول در ضمیمه آوردم ام.(داده ها به صورت random به جدول اضافه شدند)
CREATE TABLE [dbo].[Posts](
[WeblogID] [bigint] NOT NULL,
[PostID] [int] NOT NULL,
CONSTRAINT [PK_Posts] PRIMARY KEY CLUSTERED
(
[WeblogID] ASC,
[PostID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
این کد های ایجاد Table من هست.(البته فیلد های دیگری هم داره که در اینجا ذکر نشده)

ASKaffash
یک شنبه 23 آبان 1389, 11:39 صبح
سلام دوست من


روش دوم اصلا قابل قبول نیست چون همیشه جدول را Scan می کند
روش اول شما باتوجه به ایندکس اعلام شده بهینه ترین روش است