2011-08-08 79 views
2

我有一個SQL Server數據庫與大量的數據(6500萬行主要是文本,總計8Gb)。數據每週只能更改一次。我有一個ASP.NET Web應用程序,它將對此數據運行多個SQL查詢,這些查詢將計算滿足各種條件的行數。由於數據每週只能更改一次,因此本週SQL存儲查詢和計數的最有效方法是什麼?我應該將它存儲在數據庫還是應用程序中?最有效的方法來存儲查詢和大型SQL數據計數

+0

順便說一句,6500萬行和8GB的總數並不是真的那麼大...... –

+0

MS SQL Server是否支持物化視圖?這將是一個想法。 (我做了一個快速搜索並找到[this](http://stackoverflow.com/questions/1527141/how-to-mimick-oracle-materialized-views-on-ms-sql-server)。) – bart

回答

3

如果數據每週只修改一次,作爲ETL過程的一部分和結束,請執行「基本」計數並將結果存儲在數據庫中的表中。此後,您可以查詢這些小型彙總表,而不是在大型表格上進行冗長的查詢。

0

查詢應根據複雜程度存儲爲存儲過程或視圖。

對於您的情況我會去了解一下indexed views.

他們讓你既保存查詢,結果像聚集的東西,否則不能被索引設置。

作爲獎勵,查詢優化器「知道」它也有這個數據,所以如果你檢查另一個查詢中存儲在視圖索引中的計數或其他東西(即使沒有直接引用視圖)也可以仍然使用存儲的數據。

+0

索引視圖可以是非常有用的,但我認爲他們在這種情況下矯枉過正。 –

+0

@Mitch - 也許。他沒有說他需要多長時間檢查一次這些總量或者有多少次,或者查詢結果有多少。 – JNK

2

如果你並不需要100%的正常運行,以一分鐘的準確的行數,你可以查詢SQL Server的內部信息:

Select so.name as 'TableName', si.rowcnt as 'RowCount' 
from sysobjects so 
inner join sysindexes si on so.id = si.id 
where so.type = 'u' and indid < 2 

非常快執行,並且不需要額外的表。在發生許多更新時不準確,但可能在您的預期用法中足夠準確。 [感謝你提意見!]

更新:做了一點挖掘的,這確實會產生準確計數(由於總和較慢,但仍快):

SELECT OBJECT_SCHEMA_NAME(ps.object_id) AS SchemaName, 
     OBJECT_NAME(ps.object_id) AS ObjectName, 
     SUM(ps.row_count) AS row_count 
FROM sys.dm_db_partition_stats ps 
JOIN sys.indexes i ON i.object_id = ps.object_id 
         AND i.index_id = ps.index_id 
WHERE i.type_desc IN ('CLUSTERED','HEAP') 
AND OBJECT_SCHEMA_NAME(ps.object_id) <> 'sys' 
GROUP BY ps.object_id 
ORDER BY OBJECT_NAME(ps.object_id), OBJECT_SCHEMA_NAME(ps.object_id) 

Ref

記住,存儲的計數的信息並不總是100%準確 在SQL Server 2000中關於2005年創建了一個新表 計數將是準確的。但是對於2000年存在的表,現在的 通過還原或更新駐留於2005年,則需要運行(移至2005年後僅運行一次 )sp_spaceused @updateusage = N'true'或帶有COUNT_ROWS的DBCC UPDATEUSAGE選項。

+0

我並不完全相信這些查詢的結果總是100%準確,即使我自己使用它們。這種方式有沒有證據確鑿的證據? –

+0

如果頻繁更改,元數據行數不是100%準確的。對於OP的情況(每週更新),它不太可能不準確。 – JNK

+0

@mitch - sysindexes只與當前統計信息一樣準確。 – JNK

相關問題