View Full Version : بهینه ترین حالت برای گرفتن Count
یوسف زالی
سه شنبه 26 شهریور 1392, 10:45 صبح
سلام.
دوستان کوئری زیر رو ببینید:
select *,
(select count(1) from TBL2 where T2F1 = T1F1)
form TBL1
چه حالت های بهتری در خصوص سرعت بخشیدن به این کوئری می شه پیدا کرد؟
من با Apply هم امتحان کردم متاسفانه سرعت بهبود پیدا نکرد.
با تشکر
محمد سلیم آبادی
سه شنبه 26 شهریور 1392, 10:57 صبح
هر دوی اینها را امتحان کنید:
select t1,*, t2,cnt
from tbl1 t1
left outer join
(
select id, count(*) cnt
from tbl2
group by id
)t2
on t1.id = t2.id
select t1.*, isnull(count(*),0)as cnt
from tbl1 t1
left join tbl2 t2
on t1.id=t2.id
group by t1.id, t1.col1, ....
hamzehsh
چهارشنبه 27 شهریور 1392, 16:58 عصر
يك view بساز بعد توش select count(*) برن سرعت بيشتر ميشه.
حمیدرضاصادقیان
پنج شنبه 28 شهریور 1392, 03:06 صبح
سلام
يك view بساز بعد توش select count(*) برن سرعت بيشتر ميشه.
ببخشید طبق چه اصولی این مورد رو فرموید؟؟؟؟
درمورد پست 2 برای اینکه بهتر متوجه بشید بهتره قبل از اجرای دستور Set Statistics io on رو اجرا کنید و ببینید SQL Server چه طور داده های شما رو واکشی می کند.
tooraj_azizi_1035
پنج شنبه 28 شهریور 1392, 21:24 عصر
از توابع Windowing هم می تونید کمک بگیرید سرعتش رو با کد شما مقایسه نکردم:
COUNT(FieldName) OVER(PARTITION BY IDField ORDER BY SomeField) ...
محمد سلیم آبادی
جمعه 29 شهریور 1392, 04:10 صبح
به query که در پست اول هست خوب دقت کنید. معادل اینه که بخواهید کارمندان را از جدول Employees لیست کنید همراه با تعداد سفارشاتشون.
مثل این:
select *, (select count(*) from orders where empid = t.empid) as cnt
from employees as t
حالا شما توسط توابع Window چگونه این مساله رو به شکل بهینه حل میکنید؟
شاید منظورتون این روش باشه:
select distinct t.*, count(*) over(partition by t.empid)
from employees as t
join orders o
on t.empid = o.empid
وقتی پای ORDER BY clause را به Aggregate Window Function باز میکنید یعنی میخواهید از قابلیت های Framing بهره مند شوید.
توجه داشته باشید که کدی شما قرار دادین معادل این کد هست:
COUNT(FieldName) OVER(PARTITION BY IDField ORDER BY SomeField RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
tooraj_azizi_1035
جمعه 29 شهریور 1392, 12:22 عصر
حالا شما توسط توابع Window چگونه این مساله رو به شکل بهینه حل میکنید؟توابع Windowing رو در اکثر موارد که تست کردم سریعتر از موارد مشابه عمل می کرد مثل Running Sum در این مورد گفتم که آزمایش نکردم.
با گذاشتن اندیس Nonclustered (فرض کردم که id در جدول t2 می تونه تکرار بشه) روی فیلد id در جدول t2 می تونید عملیات Sort رو از پلن اجرا حذف کنید و Performance رو افزایش بدید:
select t1.* , t2.cnt from t1
inner join (select id,count(id) from t2 group by id) t2 on t1.id=t2.id
fakhravari
شنبه 30 شهریور 1392, 17:55 عصر
داش محمد سلیم آبادی براي جداول با تعداد ركورد زياد چه count پيشنهاد مي كنيد؟
حمیدرضاصادقیان
شنبه 30 شهریور 1392, 22:42 عصر
داش محمد سلیم آبادی براي جداول با تعداد ركورد زياد چه count پيشنهاد مي كنيد؟
اگر نیاز دارید Count کل رکوردهای جدول رو بگیرید و جدول فوق از PK استفاده میکنه ٬ نیازی به Query های بالا نیست و میتوانید از جدول Sys.Sysindexes استفاده کنید که مقدار فیلد Rowcnt برابر مقدار کل رکوردهای همان جدول میباشد.
fakhravari
پنج شنبه 04 مهر 1392, 17:25 عصر
اگر نیاز دارید Count کل رکوردهای جدول رو بگیرید و جدول فوق از PK استفاده میکنه ٬ نیازی به Query های بالا نیست و میتوانید از جدول Sys.Sysindexes استفاده کنید که مقدار فیلد Rowcnt برابر مقدار کل رکوردهای همان جدول میباشد.
ممنون پس اون روش براي ركورد هاي بدون شرط.
پس با شرط چي؟
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.