2013-11-14 38 views
0

根據某些條件,獲取行數的最快方式是什麼?
我有一張桌子:transactions(id int (PK), userId int, typeId int, dateCreated date, (and about 5-6 additional columns))
此表有數百萬行。T-SQL按條件對行進行最快計數的方法

現在我需要檢索此表中記錄的計數... count的標準可以是一列到三列(userId, typeId, dateCreated)的任意組合,dateTime可以是「from」和「To」。

什麼應該是查詢和索引,以便以最快的方式獲得計數?是否可以僅使用索引/統計信息來獲取行數,而無需讀取實際的表數據?
請問count(*)count(id)在這種情況下的性能影響?

謝謝。

+1

執行簡單的COUNT(*)FROM表可以對聚集索引執行更高效的掃描,因爲它不必關心任何過濾,加入,分組等 –

+0

@VijaykumarHadalgi但聚類索引的簡單計數是不是一個問題...查詢可能看起來像這樣的問題:select table count(*)where userid ='someuser'and dateCreated =>'somedate'和dateCreated <='somedate',所以在這種情況下,我需要在userid和dateCreated上有非聚集索引。我不知道這是否是唯一的方法,或者我可以直接使用非聚集索引來獲取行數。 –

+0

您可能會嘗試先覆蓋索引:'userId,typeId,dateCreated','userId,dateCreated','typeId,dateCreated','dateCreated';如果證明速度太慢,請嘗試使用相同的列進行聚合[索引視圖](http://technet.microsoft.com/zh-cn/library/dd171921%28v=sql.100%29.aspx) on和'count_big(*)'預先計數記錄(儘管使用*或id並不重要,在這種情況下,由於count_big(*)在聚合索引視圖中是必需的,因此id會詢問另一列。不要忘記在測試查詢中在視圖名稱後添加'noexpand'提示。 –

回答

0

您可以嘗試從索引中獲取它,我不確定它是否100%準確,但您不會錯過超過幾行的計數。

select ob.name, ix.rowcnt 
from sys.sysindexes ix 
join sys.sysobjects ob ON ix.id = ob.id 
where ob.xtype = N'U' and ob.name = N'MyTable' 

注意這種方式,你可以得到你所有的餐桌吃一次的計數。 obs:注意它不適合返回表中每個索引的值

相關問題