簡體   English   中英

使用dm_db_partition_stats獲取過濾的行數

[英]Get filtered row count using dm_db_partition_stats

我在我的應用程序中使用分頁,但是我注意到分頁進行得非常慢,以下是罪魁禍首:

SELECT COUNT (*) FROM MyTable

在我的只有900萬行的表上,需要43秒才能返回行數。 我讀過另一篇文章,該文章指出要返回14億行的行數,需要5分鍾以上的時間。 這顯然不能與分頁一起使用,因為它太慢了,我需要行數的唯一原因是計算可用頁面的數量。

經過一番研究,我發現使用以下命令可以立即(准確地)獲得行數:

SELECT SUM (row_count)
FROM sys.dm_db_partition_stats
WHERE object_id=OBJECT_ID('MyTable')
AND (index_id=0 or index_id=1)

但是上面的方法返回了整個表的計數,如果沒有應用過濾器,這很好,但是如果我需要應用過濾器(例如日期范圍和/或狀態),該如何處理呢?

例如,當DateTime字段介於2013-04-05和2013-04-06之間且status ='warning'時,MyTable的行計數是多少?

謝謝。

UPDATE-1

如果不清楚,我需要可用的總行數,以便可以確定使用“分頁”功能時與查詢匹配的所需頁數。 例如,如果一個頁面返回20條記錄,而與查詢匹配的記錄總數為235,我知道我需要在網格下方顯示12個按鈕。

01-(第1至20行)-20行顯示在網格中。 02-(第21至40行)-20行顯示在網格中。 ... 11-(第200至220行)-網格中顯示20行。 12-(第221至235行)-在網格中顯示15行。

將添加其他邏輯來處理大量頁面,但這是一個UI問題,因此不在本主題范圍內。

使用“從MyTable中選擇count(*)”的問題是,它對900萬條記錄花費了40秒鍾以上的時間(認為現在已經不復存在了,我需要找出原因!),但是使用這種方法,我可以添加與我的查詢相同的過濾器來確定查詢。 例如,

SELECT COUNT(*) FROM [MyTable]
WHERE [DateTime] BETWEEN '2018-04-05' AND '2018-04-06' AND
      [Status] = 'Warning'

確定頁數后,我將運行相同的查詢,但要包括字段而不是count(*),CurrentPageNo和PageSize,以便使用行ID按頁碼過濾結果,並在需要時導航到特定頁面。

SELECT RowId, DateTime, Status, Message FROM [MyTable]
WHERE [DateTime] BETWEEN '2018-04-05' AND '2018-04-06' AND
      [Status] = 'Warning' AND
      RowId BETWEEN (CurrentPageNo * PageSize) AND ((CurrentPageNo + 1) * PageSize)

現在,如果我使用其他提到的方法來獲取行數,即

SELECT SUM (row_count)
FROM sys.dm_db_partition_stats
WHERE object_id=OBJECT_ID('MyTable')
AND (index_id=0 or index_id=1)

它會立即返回計數,但是我該如何過濾它,以便可以像使用SELECT COUNT(*)方法一樣包含相同的過濾器,因此最終會得到類似以下內容:

SELECT SUM (row_count)
FROM sys.dm_db_partition_stats
WHERE object_id=OBJECT_ID('MyTable') AND 
(index_id=0 or index_id=1) AND
([DateTime] BETWEEN '2018-04-05' AND '2018-04-06') AND
([Status] = 'Warning')

當我查詢dm_db_partition_stats時,以上清除將不起作用,但我想知道是否可以執行某種聯接或類似的操作以立即為我提供行的總數,但需要過濾而不是應用於整個桌子。

謝謝。

您是否曾經問過前往人馬座的路線? 沒有? 答案是,您不能從這里到達那里。

添加索引,重新組織/重新構建,更新統計信息只會使您到目前為止。 您應該考慮改變您的方法。

sp_spaceused通常會立即返回記錄計數; 您也許可以使用此功能,但是取決於(您尚未充分提供給我們足夠的信息)計數所用的內容可能並不足夠。

我不確定您是否要使用此計數作為短路較大操作的方法,或者您如何在應用程序中使用該計數。 當您開始突出顯示14億條記錄時,您正在尋找所說集合中的一個窗口時,聽起來您可能是分區表的候選人。

這使您可以分配幾個較小的表,這些表通常按日期,年/月分隔,作為一個表。 當您在14億條記錄中提供日期范圍時,SQL可以滿足性能期望。 這確實取決於SQL Edition,但是也有視圖分區。

金伯利·特里普(Kimberly Tripp)擁有一個博客和一些視頻,肯德拉·利特爾(Kendra Little)也對如何使用它們以及如何進行設置有一些很好的了解。 這將是設計更改。 這有點復雜,不是一時興起的東西。

這是金伯利博客的鏈接: https : //www.sqlskills.com/blogs/kimberly/sqlskills-sql101-partitioning/

開發玩笑:

另外,我聽說您指責SQL,您是否偶然使用實體框架?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM