[英]Select million+ records while huge insert is running
我正在嘗試從單個表中提取應用程序日志文件。 選擇查詢語句非常簡單。
select top 200000 *
from dbo.transactionlog
where rowid>7
and rowid <700000 and
Project='AmWINS'
以上選擇的查詢時間超過5分鍾。 它長嗎? 在運行select的同時,批量插入也在運行。
[編輯]
實際上,我當前的生產日志數據庫存在嚴重問題,基本上,我們只有一個表(transactionlog)。 所有應用程序日志將插入到此表中。 對於像AmWINS這樣的項目,基於選擇計數結果,我們每天大約插入800K ++條記錄。 記錄的插入每天在生產環境中運行24小時。 如果用戶要檢查事務日志,則希望從表中提取數據。 因此,如果需要,我們需要從表中選擇記錄。
我試圖模擬UAT環境,以根據Production抽取大量數據,到今天,該產量已經增長到1000萬條記錄。 當我嘗試提取記錄時,同時,我使用批量插入進行模擬,使其看起來像在生產環境中一樣。 僅花費了5分鍾即可提取20萬條記錄。
在提取運行期間,我監視SQL phyiscal服務器上的CPU峰值達到95%。
該表具有13個字段,並使用bigint標識打開(行)。 rowid是PK。 在日期,項目,模塊和RefNumber上創建索引。 在行鎖和啟用頁面鎖的情況下創建表。 我正在使用SQL Server 2005。
希望你們能給我一些專業的建議,以啟發我。 謝謝。
您可能可以使用“ Nolock”表提示,如下所述:
您的SQL將變成這樣:
select top 200000 * from dbo.transactionlog with (no lock) ...
如果您不關心返回的數據的完整准確性,則可以實現更好的性能。
您要處理200,000行嗎? 您正在通過網絡運行此程序嗎? 根據表的寬度,僅花費整個網絡上的數據量可能是大部分時間。
您也可以將其導出為本地dat或sql文件。
這取決於您的硬件。 在插入數據的同時拉出200000行需要一些嚴肅的IO,因此除非您擁有30多個磁盤系統,否則它將很慢。
另外,您的rowID列是否已索引? 這將有助於選擇,但可能會降低批量插入的速度。
我不確定,但是不批量插入MS SQL會鎖定整個表嗎?
正如ck所說。 索引很重要。 因此,請確保您已准備好適當的索引。 我不僅會在rowId上設置索引,還會在Project上設置索引。 我還要將條款重寫為:
WHERE Project = 'AmWINS' AND rowid BETWEEN 8 AND 699999
原因:我猜想Project比rowid更具限制性,並且-如果我錯了,請糾正我-BETWEEN比<和>比較要快。
沒有索引的數量會在這里有所幫助,因為它是一個SELECT *查詢,因此很可能是PK掃描或可怕的預訂查詢
而TOP是沒有意義的,因為沒有ORDER BY。
據我所知,同時插入可能會引起誤解,除非該表只有2列,並且大容量插入會鎖定整個表。 使用簡單的int IDENTITY列,插入和選擇也可能不會互相干擾。
特別是如果批量插入只有幾千行(甚至10,000行)
編輯。 TOP和rowid值並不表示一百萬以上
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.