簡體   English   中英

在運行大量插入的同時選擇百萬條以上的記錄

[英]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”表提示,如下所述:

表提示MSDN

您的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.

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