ورود

View Full Version : کندی دستور select count



b.mahsa
چهارشنبه 30 تیر 1389, 22:52 عصر
با سلام.

من دستور select * from table رو سیستم local و رو شبکه تست کردم و سرعت هر دوشون با هم مساوی بود.

ولی دستور select count(*)from table رو سیستم local سرعت خوبی داره و رو شبکه سرعت خیلی بد.
کسی میدونه دلیلش چیه؟؟؟
راه حلی نداره؟
ممنون میشم راهنماییم کنین.:ناراحت:

حمیدرضاصادقیان
پنج شنبه 31 تیر 1389, 12:23 عصر
سلام.اگر روی جدولتون PK دارید میتونید تعداد کل رکوردها رو از جدول sysindexes که یک فیلد به نام rowcount داره فرخوانی کنید.اینجوری سرعت شما چندبرابر خواهد شد.
ولی اگر میخواهید فیلتر روی تعداد رکوردهای خوانده شده انجام بدید باید روی فیلدهایی که در شرط where هستند index بذارید که برای اینکار بهتره Execution plan رو اینجا قرار بدید تا راهنماییتون کنیم یک ایندکس مناسب روی فیلد نماسب بذارید تا تاثیر مثبت داشته باشه.
موفق باشید

b.mahsa
پنج شنبه 31 تیر 1389, 17:30 عصر
ممنون بابت پاسختون.
امکان تغییر database رو ندارم.
و database ام هم index نداره.
دستور Select count همراه با group by استفاده میشه. و تعداد رکورد ها در هر گروه مد نظر است .پس index هم راه حل نیست.
ولی سوال من در مورد تفاوت سرعت بین local و شبکه بود. و اینکه بقیه دستورات روی شبکه
سرعت نسبتا خوبی درند. این کندی در دستور select count چه دلیلی داره.؟؟؟
آیا راه حلی وجود داره؟

حمیدرضاصادقیان
جمعه 01 مرداد 1389, 10:50 صبح
سلام.شما میتونید با استفاده از sql profiler ترافیک رو کنترل کنید ببینید روی شبکه چه اعمالی داره صورت میگیره.Execution plan کوئری تون رو اینجا قرار بدین.

b.mahsa
شنبه 02 مرداد 1389, 17:13 عصر
ممنون که وقت میزارید و پاسخ میدید.
میشه کمی بیشتر توضیح بدید.
من میتوننم بار پردازش رو به سیستمی که برنامه داره روش run میشه منتقل کنم. یا حتی خود سرور .که پردازش رو انجام بده و نتیجه رو فقط بر گردونه؟

حمیدرضاصادقیان
چهارشنبه 06 مرداد 1389, 23:01 عصر
سلام.بله شما میتونید کد مربوطه رو داخل یک Stored Procedure بنویسید و اونو از طریق کلاینت فقط اجرا کنید و نتیجه مربوطه رو نمایش بدید.
ببینید کدتون رو در Query Analyzer اجرا کنید و از منوی Query گزینه Show Execution plan رو انتخاب کنید و چارتی که بهتون نمایش میده رو به صورت فایل ذخیره کرده و در اینجا قرار بدید تا بهتر بشه تصمیم گرفت.
موفق باشید

b.mahsa
پنج شنبه 07 مرداد 1389, 18:42 عصر
ممنون بابت پاسختون.
من بانکم foxpro هست و امکان استفاده از sql server و storeprocedure رو ندارم.
در بانک foxpro امکان انتقال پردازش به سرور وجود نداره؟

حمیدرضاصادقیان
پنج شنبه 07 مرداد 1389, 23:05 عصر
ممنون بابت پاسختون.
من بانکم foxpro هست و امکان استفاده از sql server و storeprocedure رو ندارم.
در بانک foxpro امکان انتقال پردازش به سرور وجود نداره؟
دوست عزیز این سوالتون اصلا ربطی به بخش sql server نداره شما باید در بخش foxpro این سوال رو مطرح کنید.

b.mahsa
جمعه 08 مرداد 1389, 12:27 عصر
بله .
من چون از query های sql استفاده میکنم. گفتم شاید بشه این تغییرات رو تو query داد .برای همین تو این تالار مطرح کردم.
بازم ممنون بابت پاسخ ها و راهنماییهاتون

ashkan209
جمعه 08 مرداد 1389, 21:47 عصر
سلام.بله شما میتونید کد مربوطه رو داخل یک Stored Procedure بنویسید و اونو از طریق کلاینت فقط اجرا کنید و نتیجه مربوطه رو نمایش بدید.
ببینید کدتون رو در Query Analyzer اجرا کنید و از منوی Query گزینه Show Execution plan رو انتخاب کنید و چارتی که بهتون نمایش میده رو به صورت فایل ذخیره کرده و در اینجا قرار بدید تا بهتر بشه تصمیم گرفت.
موفق باشید

دوست من سلام
این query analyser کجاست و نحوه استفاده و آنالیز یک کوئری رو توضیح میدین ؟
قبلا سپاسگزارم

moharrami
جمعه 08 مرداد 1389, 22:27 عصر
.اگر روی جدولتون PK دارید میتونید تعداد کل رکوردها رو از جدول sysindexes که یک فیلد به نام rowcount داره فرخوانی کنید.د

@حمیدرضاصادقیان، میشه در مورد فیلد indid دراین جدول توضیح بدید منظورم حالت Heap هست

حمیدرضاصادقیان
شنبه 09 مرداد 1389, 08:13 صبح
@حمیدرضاصادقیان، میشه در مورد فیلد indid دراین جدول توضیح بدید منظورم حالت Heap هست
سلام.این فیلد نوع ایندکس رو مشخص میکند
به شرح زیر
1= Clustered Index
NonClustered >1
255= ّبرای جدولهایی که شامل فیلدی از نوع text یا Image هستند.

موفق باشید

حمیدرضاصادقیان
شنبه 09 مرداد 1389, 08:24 صبح
دوست من سلام
این query analyser کجاست و نحوه استفاده و آنالیز یک کوئری رو توضیح میدین ؟
قبلا سپاسگزارم
سلام.اگر از نسخه 2000 استفاده میکنید در all programs-microsoft sql server-query analyzer قرار داره.
و وقتی یک کوئری رو در اونجا می نویسید از منوی Query گزینه Show Execution plan رو انتخاب کنید.و کوئری رو اجرا کنید در پایین صفحه یک تب باز میشه که Plan کوئری رو نشون میده.
در 2005 و 2008 وقتی که Sql server management Studio رو اجرا میکنید و یک کوئری می نویسید در منوی Query گزینه Include Actual execution plan رو انتخاب کنید بعد کوئری رو اجرا کنید.
البته در 2005 و2008 میتوانید کوئری رو نوشته و بدون اینکه اجرا کنید با استفاده از منوی Query گزینه Display estimated execution plan ، نیز plan کوئری مربوطه رو ببینید.
موفق باشید

ashkan209
یک شنبه 10 مرداد 1389, 11:29 صبح
ممنون از راهنمائیتون
ولی این تصویر چی رو نشون میده ؟ یعنی تحلیلتون چی هستش ؟

حمیدرضاصادقیان
یک شنبه 10 مرداد 1389, 12:45 عصر
سلام.به طور مثال Table Scan نمایش دهنده این هست که کوئری شما از ایندکسی استفاده نکرده.
شما دستور زیر رو اجرا کنید دوباره کوئری تون رو اجرا کنید بعد plan اونو ملاحظه کنید.


create index ixTest on testtb(id)

ashkan209
یک شنبه 10 مرداد 1389, 17:49 عصر
ok
و حالا تحلیلش چی میشه ؟

حمیدرضاصادقیان
دوشنبه 11 مرداد 1389, 09:07 صبح
خوب حالا تحلیلش اینه که برای جستجو از ایندکس استفاده کرده. در plan قبلی وقتی از Table scan استفاده میشه یعنی برای پیدا کردن یک رکورد مجبوره تمام جدول رو بگرده تا رکورد مورد نظر رو پیدا کنه.
فرض کنید توی 2000000 رکورد دارید دنبال یک رکورد میگردید که در این حالت بدون ایندکس sql server مجبوره تمامی این رکوردها رو بگرده تا به رکورد مربوطه برسه.ولی وقتی از ایندکس استفاده میشه این اطلاعات به صورت دسته بندی در میان و سرعت جستجو چندین برابر خواهد شد.
برای آشنایی کامل با تجزیه و تحلیل plan پیشنهاد میکنم این کتاب (http://www.amazon.com/Dissecting-Server-Execution-Plans-ebook/dp/B0018PCIFG) رو مطالعه کنید.
موفق باشید