簡體   English   中英

CommandBehavior.SequentialAccess是否有任何性能提升?

[英]Is there any performance gain from CommandBehavior.SequentialAccess?

我意識到我總是按索引返回的順序讀取我的字段(使用常量)。 所以據我所知,我的代碼已經與CommandBehavior.SequentialAccess兼容。

如果我打開它會有任何好處嗎? DataReader只是前傳,只讀是真正的性能增益嗎?

這種情況的主要用途是在讀取非常大的CLOB( nvarchar(max)等)或BLOB( varbinary(max) )字段時。 在默認用法中,它會在讓您靠近它之前緩沖整行數據 - 這可能意味着它必須為任何BLOB / CLOB字段分配一個大緩沖區。 使用順序模式時,它不緩沖行 ; 您可以將常規API用於小字段(只要以正確的順序訪問它們),但對於CLOB / BLOB字段,您可以使用基於塊的API( GetBytesGetChars )依次訪問數據的分數。 通過這樣做,您可以,例如,僅使用1k或4k緩沖區處理40 MB圖像。

MSDN說的一樣

為DataReader提供一種處理包含具有大二進制值的列的行的方法。 SequentialAccess不是加載整行,而是使DataReader能夠將數據作為流加載。 然后,您可以使用GetBytes或GetChars方法指定用於啟動讀取操作的字節位置,以及用於返回數據的有限緩沖區大小。

是的,即使不訪問BLOB,使用CommandBehavior.SequentialAccess也應該至少有一些性能提升。 Microsoft KB文章, 在Visual C#中使用DataReader時出現“無效嘗試從列序號讀取”錯誤 ,指出:

設置CommandBehavior.SequentialAccess標志會導致DataReader按順序讀取行和列。 行和列不緩沖。 讀過列后,它將從內存中刪除。 任何重新讀取列或讀取先前讀取的列的嘗試都會導致異常。

使用CommandBehavior.SequentialAccess標志可提供性能優勢,尤其是在使用二進制大對象(BLOB)字段時。 如果不使用SequentialAccess ,則會將所有BLOB數據復制到客戶端。 這可能會消耗大量資源。

CommandBehavior.SequentialAccess還可以在訪問非BLOB字段時提高性能。 如果未設置CommandBehavior.SequentialAccess,則可以不按順序訪問列; 但是,您會產生以下開銷:

  • 檢查該列以查看該列是否晚於先前訪問的列。
  • 檢索所有先前訪問的列的數據,然后對其進行高速緩存以供以后檢索。

必須檢查和緩存列,因為在使用DataReader時 ,基礎流僅對行進行轉發以及列訪問。

暫無
暫無

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

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