你目前正处于脱机状态,正在等待 Internet 重新连接

查询需要较长时间才能完成运行时在 SQL Server 2005 年增长 TokenAndPermUserStore 高速缓存的大小

注意:这篇文章是由无人工介入的微软自动的机器翻译软件翻译完成。微软很高兴能同时提供给您由人工翻译的和由机器翻译的文章, 以使您能使用您的语言访问所有的知识库文章。然而由机器翻译的文章并不总是完美的。它可能存在词汇,语法或文法的问题,就像是一个外国人在说中文时总是可能犯这样的错误。虽然我们经常升级机器翻译软件以提高翻译质量,但是我们不保证机器翻译的正确度,也不对由于内容的误译或者客户对它的错误使用所引起的任何直接的, 或间接的可能的问题负责。

点击这里察看该文章的英文版: 927396
错误 #: 429501 (SQLBUDT)
症状
在 Microsoft SQL Server 2005,您可能会遇到以下症状:
  • 通常运行速度更快的查询需要较长时间才能完成运行。
  • 多个通常为 SQL Server 的进程的 CPU 利用率。
  • 当您运行一个特殊的查询时,您会遇到性能降低时,您查看该查询从 sys.dm_exec_requestssys.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 的实例上您注意到大量 sys.dm_os_memory_cache_entries 视图中有 65535 的类的 TokenAccessResult 条目。有 65535 的类的 TokenAccessResult 项表示特殊的高速缓存项。这些高速缓存条目用于对查询的累积权限检查。例如对于您可以运行以下查询:
select * from t1 join t2 join t3
SQL Server 在这种情况下计算为此查询的累积权限检查。这一检查将确定用户是否有上 t1,t2,t3 的选择。这些累积权限检查结果嵌入到 TokenAccessResult 项并将插入 TokenAndPermUserStore 高速缓存存储 65535 的 id。如果同一用户重新使用,或多次执行此查询,SQL Server 就重复一次使用 TokenAccessResult 高速缓存项。

当此高速缓存存储的增长时重新使用现有的条目中搜索所需的时间会增加。 此缓存的访问控制,以便只有一个线程可以执行搜索。此行为最终导致查询性能,以减少,和更多的 CPU 利用率出现。
解决方案

服务包信息

若要解决此问题,获得最新的 service pack,SQL Server 2005 年。有关详细的信息请单击下面的文章编号,以查看 Microsoft 知识库中相应的文章:
913089如何获取最新的 service pack,SQL Server 2005 年
若要解决此问题,SQL Server 2005 Service Pack 2 更改权限令牌缓存的行为。默认状态下,TokenAccessResult 安全缓存项的特殊查询将只缓存时再次执行特定的特殊查询。
替代方法
要变通解决此问题,使用一个或多个以下方法:
  • 显式参数化的特殊查询。

    备注
    • 此方法,可以有效地重复使用的特殊查询和他们的计划。
    • 您在使用此方法时您不必每次运行该特殊查询一起使用不同的参数创建 TokenAccessResult 条目。
    • 使用此方法在 TokenAndPermUserStore 保持合理的限制下的高速缓存的大小。
  • 包装内存储的过程的特殊查询,并使用存储的过程,而不是直接执行的特殊查询。

    备注
    • 对于在存储过程中的语句缓存执行计划。
    • TokenAccessResult 编辑框中的每个语句都与该执行计划条目相关联。
    • 只要此执行计划存储在缓存中的过程一直,每次执行存储过程的有效地重新使用 TokenAccessResult 条目。因此,不必创建新 TokenAccessResult 条目。
  • 启用 FORCE_PARAMETERIZATION 数据库选项。

    备注
    • 此方法,可以有效地重复使用的特殊查询和他们的计划。
    • 您在使用此方法时您不必每次运行该特殊查询一起使用不同的参数创建 TokenAccessResult 条目。
    • 使用此方法在 TokenAndPermUserStore 保持合理的限制下的高速缓存的大小。
  • 添加执行该登录 sysadmin 服务器组的成员身份变化特别查询。

    备注
    • TokenAccessResult 项仅创建一个特殊的查询的查询执行情况的不是 sysadmin 服务器组的成员登录时。
    • 因为 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 知识库中相应的文章:
933564FIX: USERSTORE_TOKENPERM 高速缓存存储区的内存占用的逐步增加发生 SQL Server 2005 中
959823如何自定义为 SQL Server 2005 Service Pack 3 中 TokenAndPermUserStore 高速缓存存储配额

警告:本文已自动翻译

属性

文章 ID:927396 - 上次审阅时间:07/28/2009 13:38:47 - 修订版本: 4.0

Microsoft SQL Server 2005 Developer Edition, Microsoft SQL 2005 Server Enterprise, Microsoft SQL Server 2005 Enterprise Edition for Itanium Based Systems, Microsoft SQL Server 2005 Enterprise X64 Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Standard X64 Edition

  • kbmt kbtshoot kbinfo kbsql2005tsql kbprb KB927396 KbMtzh
反馈
tml>