【问题标题】:Performance issues with internal query from MS Access against SQL Server来自 MS Access 的内部查询对 SQL Server 的性能问题
【发布时间】:2012-04-12 13:26:48
【问题描述】:

我们有一个在 MSAccess 中运行但使用 SQL Server 作为后端数据库的应用程序。这会生成一个查询来检查它可以访问哪些视图,对于普通用户来说,这最多需要 18 秒。对于属于 db_owner 角色的所有用户,需要 0.2 秒。有什么办法可以为普通用户调整这个吗?也许我可以在 Access 中做些什么?我不想给他们db_owner,重写应用程序不使用Access是不可能的。

这是查询:

select 
  object_name(id), 
  user_name(uid), type, 
  ObjectProperty(id, N'IsMSShipped'), 
  ObjectProperty(id, N'IsSchemaBound') 
    from sysobjects 
    where type = N'V' 
      and permissions(id) & 4096 <> 0

使用 MS Access 2003、SQL Server 2008 R2

【问题讨论】:

  • 当您在其中一个用户名下运行查询时返回了多少视图?
  • 它为 db_owners 返回 1351 行,为普通用户返回 1344 行
  • 执行计划相同。在 winmerge 中比较它们,唯一的区别是 QueryPlan 元素,其中 CompileTime 和 CompileCPU 略有不同(两者都为 6,两者都为 7),以及 RunTimeCountersPerThread 元素,其中 ActualRows 对于普通用户为 1344,对于 db_owners 为 1351

标签: sql-server performance ms-access database-performance sqlperformance


【解决方案1】:

没有找出问题的根本原因,也许解决方法可能会有所帮助?只是一个想法:您可以将您的 SQL 语句封装在 db_owner 拥有的 proc 中,并给它一个 EXECUTE AS 子句。这样,当非 db_owner 调用 proc 时,proc 中的 SQL 将在 db_owner 的模拟下仅在 proc 的持续时间和范围内执行。希望您的非 db_owner 用户能够从您在 db_owner 运行该 SQL 时看到的性能中受益。

【讨论】:

  • 不能真正做到这一点,因为这些是 Access 的“内部”,所以这发生在我们的代码开始运行之前。感谢您的提示
【解决方案2】:

派对迟到了,但试试这个:

select
  [name], 
  schema_name(schema_id), 
  [type], 
  Is_MS_Shipped,
  Is_Schema_published
from 
    sys.all_views
where 
    not permissions(object_id) & 4096 = 0

使用视图特定对象并反转比较可能会给您带来轻微的改进

【讨论】:

    【解决方案3】:

    让我猜猜:您有一个在启动时执行此操作的 Access-ADP 应用程序。我们完全一样。此查询用于获取 Access 稍后使用的元数据。问题的根本原因是已弃用的 PERMISSIONS 函数:

    http://msdn.microsoft.com/en-us/library/ms186915.aspx

    引用:“继续使用 PERMISSIONS 函数可能会导致性能下降。”

    由于您无法更改查询或函数,因此您很不走运。

    我建议您考虑迁移到带有链接表的 ACCDB,因为无论如何 ADP 支持在 Access 2013 中都被取消了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-11
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多