PDA

View Full Version : چه روش سریعی برای Row Count وجود دارد؟



mehrpars
پنج شنبه 30 اردیبهشت 1389, 02:18 صبح
سلام ،
سریعترین روش برای گرفتن query از روی سرور چیه ؟
من از OpenRowSet استفاده کردم ، سرعت اینترنتم 128k هست ولی واسه برگردوندن 300 تا رکورد حدود 20 تا 30 ثانیه معطلی داره .
این نکته رو هم بگم که فیلدهارو بر نمی گردونم و فقط از count(*) استفاده میکنم والا این تایم بیشتر هم می شه:اشتباه:

amir_alaki
پنج شنبه 30 اردیبهشت 1389, 13:17 عصر
با سلام
بهتره به جای

Count(*)
از

Count(ID) یا هر فیلد دیگه ای که ترجیحا کلید هم باشه استفاده کنین بهتره
چون
Count(*) به خاطر * خود SQL باید یک Execution plan کامل برای این Select بسازه و این خودش روی حجم داده بالا عمل زمان بری هست

موفق باشید

محمد سلیم آبادی
پنج شنبه 30 اردیبهشت 1389, 13:50 عصر
با سلام
بهتره به جای

Count(*)
از

Count(ID) یا هر فیلد دیگه ای که ترجیحا کلید هم باشه استفاده کنین بهتره
چون
Count(*) به خاطر * خود SQL باید یک Execution plan کامل برای این Select بسازه و این خودش روی حجم داده بالا عمل زمان بری هست

موفق باشید

سلام دوست من،
نمی شه به همین سادگی در این مورد قضاوت کرد.
دو تابع زیر از لحاظ منطقی با یکدیگر متفاوت هستند و ممکن است در سناریو های مختلف نتیجه های مختلفی بدهند:

COUNT(*)
COUNT(I)

در ضمن عملکرد هر دو روش یکسان هست به Query و Plan زیر توجه کنید:


set nocount on
select cnt=COUNT(i) from (select 1 union all select 1 union all select null)d(i)
select cnt=COUNT(*) from (select 1 union all select 1 union all select null)d(i)


cnt
-----------
2
Warning: Null value is eliminated by an aggregate or other SET operation.

cnt
-----------
3




http://www.barnamenevis.org/forum/attachment.php?attachmentid=49314&stc=1&d=1274349021

mehrpars
جمعه 31 اردیبهشت 1389, 01:59 صبح
ممنون از پاسخهاتون ،
در نهایت چکار می شه کرد ؟ من حتی یا delete و insert into کامل جدول به زمان کمتری می رسم و فقط با select count مشکل دارم

در ضمن count(*) و Count(index) هم با هم فرقی نداشت و بصورت تصادفی زمانهای مختلفی داشتم

محمد سلیم آبادی
جمعه 31 اردیبهشت 1389, 03:31 صبح
ممنون از پاسخهاتون ،
در نهایت چکار می شه کرد ؟ من حتی یا delete و insert into کامل جدول به زمان کمتری می رسم و فقط با select count مشکل دارم

در ضمن count(*) و Count(index) هم با هم فرقی نداشت و بصورت تصادفی زمانهای مختلفی داشتم

یک مقاله ی عالی برای این مساله پیدا کردم، حتما بخوانید:
http://sqlserver2000.databases.aspfaq.com/how-do-i-get-a-list-of-sql-server-tables-and-their-row-counts.html

با استفاده از مطالب مقاله این روش را بدست آوردم. امتحانش کنید:



DECLARE @t TABLE(name varchar(500), rows int, reserved varchar(500), data varchar(500), index_size varchar(500), unused varchar(500))
INSERT INTO @t EXECUTE sp_spaceused 'boats'

SELECT rows FROM @t