使用 IDirectorySearch 分頁

分頁會指定伺服器傳回給客戶端的數據列數目。 頁面可以透過數據列數目或時間限制來定義。 ADSI COM 對象會根據下表所列的值,擷取結果的每個頁面。 呼叫端會在到達頁面結尾時呼叫 IDirectorySearch::GetNextRow ,而 ADSI COM 物件會擷取下一頁。

Description
ADS_SEARCHPREF_PAGESIZE 指定要在頁面中傳回的數據列數目上限。
ADS_SEARCHPREF_PAGED_TIME_LIMIT 指定伺服器在將頁面傳回用戶端之前,應該花費在收集結果頁面的時間上限,以秒為單位。 如果達到限制,伺服器會停止搜尋,並傳回已經為頁面擷取的數據列。

 

如果未設定這些搜尋喜好設定,則預設值為無分頁。 在未分頁的情況下執行的 Active Directory 搜尋僅限於傳回前 1000 筆記錄的最大值,因此,如果結果集可能包含超過 1000 個專案,則必須使用分頁搜尋。

搜尋作業可能會導致傳回大量物件。 如果伺服器傳回一組的結果,它可能會降低客戶端和伺服器的效能,以及影響網路負載。 分頁搜尋可用來防止這種情況。 在分頁搜尋中,用戶端可以接受較小的封包結果。 封包的大小稱為搜尋頁面大小。

分頁搜尋可同時為客戶端和伺服器提供優點。 在向使用者呈現結果時,用戶端可以更有回應。 這特別與圖形使用者介面工具有關,這些工具可以開始窗口顯示程式,而其他線程同時接收數據。

在伺服器端,分頁搜尋可調整作業。 例如,如果一百個用戶端同時發出搜尋要求,而且平均而言,每個客戶端都會收到兩百個物件。 如果未指定任何頁面大小,在最壞的情況下,伺服器必須有足夠的記憶體來保存 20,000 個物件。 相反地,如果每個用戶端指定一個頁面大小,例如十個對象,伺服器上的記憶體需求就會降低 20。

此外,使用分頁搜尋,用戶端可以放棄進行中的作業。 相反地,在未分頁的搜尋中,用戶端會在一個封包中接收結果集。 這可能會降低網路效能。

ADSI 會處理客戶端的頁面大小。 用戶端不需要計算進行中的物件數目。 ADSI 會封裝客戶端的伺服器互動。 從客戶端的觀點來看,搜尋會傳回完整的結果集。

建議使用分頁。

若要指定頁面大小上限,請設定ADS_SEARCHPREF_PAGESIZE搜尋選項,並將ADSTYPE_INTEGER值設定為傳遞至 IDirectorySearch::SetSearchPreference 方法之ADS_SEARCHPREF_INFO陣列中每個頁面的數據列數目上限。

下列程式代碼範例示範如何設定頁面大小上限。

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGESIZE;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 1000;

若要指定頁面時間,請設定ADS_SEARCHPREF_PAGED_TIME_LIMIT搜尋選項,並將ADSTYPE_INTEGER值設定為伺服器應該花費在傳遞至 IDirectorySearch::SetSearchPreference 方法的ADS_SEARCHPREF_INFO數位中擷取頁面的最大秒數。

下列程式代碼範例示範如何指定頁面時間。

ADS_SEARCHPREF_INFO SearchPref;
SearchPref.dwSearchPref = ADS_SEARCHPREF_PAGED_TIME_LIMIT;
SearchPref.vValue.dwType = ADSTYPE_INTEGER;
SearchPref.vValue.Integer = 60;