查詢會花較長的時間才能完成時 TokenAndPermUserStore 快取大小成長 SQL Server 2005 中執行

錯誤 #: 429501 (SQLBUDT)

狀況

在 Microsoft SQL Server 2005 中,您可能會遇到下列徵狀︰

  • 通常執行速度較快的查詢會花較長的時間,以便完成執行。

  • 多個通常會設定 SQL Server 處理序的 CPU 使用率。

  • 當您執行臨機操作查詢時,您就會遇到效能降低時,您可以檢視從sys.dm_exec_requests或sys.dm_os_waiting_tasks的動態管理檢視查詢。不過,查詢不會等候任何資源。

  • TokenAndPermUserStore 快取存放區的大小會增大以穩定的速度。

  • TokenAndPermUserStore 快取存放區的大小是依順序數百百萬位元組 (MB)。

  • 在某些情況下,執行 DBCC FREEPROCCACHE 命令會提供暫時的浮雕。

若要監視的 TokenAndPermUserStore 快取大小,您可以使用類似下列的查詢︰

SELECT SUM(single_pages_kb + multi_pages_kb) AS 
"CurrentSizeOfTokenCache(kb)"
FROM sys.dm_os_memory_clerks
WHERE name = 'TokenAndPermUserStore'

原因

TokenAndPermUserStore 快取存放區會維護是安全性語彙基元型別︰

  • LoginToken

  • TokenPerm

  • UserToken

  • SecContextToken

  • TokenAccessResult。

不同類別的 TokenAccessResult 項目也會出現。許多有 65535 的一個類別的 TokenAccessResult 項目都存在,就會發生此特定問題。


上有隨機的動態查詢執行的比率過高的 SQL Server 的執行個體,您會發現大量有 65535 的類別,在 [ sys.dm_os_memory_cache_entries ] 檢視中的 TokenAccessResult 項目。有 65535 的一個類別的 TokenAccessResult 項目代表特殊的快取項目。這些快取項目適用於查詢的累積的使用權限檢查。例如,您可以執行下列查詢︰

select * 
from t1 join t2 join t3

在此情況下,SQL Server 會計算這項查詢的累積的權限檢查。此項檢查會判斷使用者是否有選取 [t1]、 [t2、 [t3。累積的權限核取等這些結果會內嵌至 TokenAccessResult 項目,以及插入 TokenAndPermUserStore 快取存放區,編號為 65535。如果同一個使用者會重複使用,或多次執行這項查詢,SQL Server 會重複 TokenAccessResult 快取項目使用一次。

當此快取儲存區成長時,則會增加的時間來搜尋重複使用現有的項目。此快取的存取控制,以便只有一個執行緒可以執行搜尋。這種行為最後原因查詢效能降低,並且更多的 CPU 使用率,就會發生。

解決方案

服務套件資訊

若要解決這個問題,請取得最新的 service pack,SQL Server 2005。如需詳細資訊,按一下下面的文件編號,檢視「Microsoft 知識庫」中的文件:

如何取得最新的 service pack,SQL Server 2005 的913089
若要解決這個問題,SQL Server 2005 的 Service Pack 2 會變更使用權限語彙基元的快取行為。根據預設,臨機操作查詢 TokenAccessResult 安全性快取項目是只快取特定的臨機操作查詢一次執行時。

因應措施

若要解決這個問題,請使用一或多個下列方法︰

  • 明確地參數化臨機操作查詢。

    注意事項

    • 這個方法可讓您有效地重複使用臨機操作查詢及它們的計劃。

    • 當您使用這個方法時,您不必每次您執行的搭配不同參數的臨機操作查詢建立一個 TokenAccessResult 項目。

    • 使用這個方法,TokenAndPermUserStore 快取的大小會保持在合理範圍之內。

  • 臨機操作查詢內預存程序,自動換行,而不是直接執行臨機操作查詢中使用預存程序。


    注意事項

    • 預存程序的陳述式的執行計劃會快取。

    • 每個陳述式的 TokenAccessResult 項目是相關聯的執行計劃項目。

    • 只要執行計劃,這會儲存程序仍會保留在快取,每次執行預存程序會重複有效地使用 TokenAccessResult 項目。因此,您不必建立新的 TokenAccessResult 項目。

  • 啟用 FORCE_PARAMETERIZATION] 資料庫選項。

    注意事項

    • 這個方法可讓您有效地重複使用臨機操作查詢及它們的計劃。

    • 當您使用這個方法時,您不必每次您執行的搭配不同參數的臨機操作查詢建立一個 TokenAccessResult 項目。

    • 使用這個方法,TokenAndPermUserStore 快取的大小會保持在合理範圍之內。

  • 新增 sysadmin 伺服器群組的成員身分登入執行而改變的臨機操作查詢。

    注意事項

    • 登入不是 sysadmin 伺服器群組的成員來執行查詢時,TokenAccessResult 項目才會建立臨機操作查詢。

    • TokenAccessResult 項目不會建立,因為這種行為會保留 TokenAndPermUserStore 的快取大小,來管理的大小。

  • 清除 [從 TokenAndPermUserStore 快取的項目。

    注意事項

    • 若要這樣做,請執行下列命令︰

      DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')

    • 在理想的情況下,試試看了 TokenAndPermUserStore 的快取大小的臨界值,當問題開始出現。

    • 您可以建立排定的 SQL Server 代理程式工作,執行下列動作︰

      • 檢查 TokenAndPermUserStore 快取大小的大小。若要這樣做,請執行下列命令︰

        SELECT SUM(single_pages_kb + multi_pages_kb) AS 
        "CurrentSizeOfTokenCache(kb)"
        FROM sys.dm_os_memory_clerks
        WHERE name = 'TokenAndPermUserStore'
      • 如果快取大小大於您觀察到的臨界值,請執行下列命令︰

        DBCC FREESYSTEMCACHE ('TokenAndPermUserStore')

參考

如需詳細資訊,按一下下面的文件編號,以檢視「Microsoft 知識庫」中的文件:

933564修正︰ 在 USERSTORE_TOKENPERM 的快取存放區的記憶體耗用量的逐漸增加,就會發生在 SQL Server 2005 中

959823如何自訂 SQL Server 2005 的 Service Pack 3] 中的 TokenAndPermUserStore 快取存放區的配額

Need more help?

Expand your skills
Explore Training
Get new features first
Join Microsoft Insiders

Was this information helpful?

Thank you for your feedback!

Thank you for your feedback! It sounds like it might be helpful to connect you to one of our Office support agents.

×