錯誤 #: 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 快取存放區的配額