MS Access对SQL Server的内部查询的性能问题

时间:2012-04-12 13:26:49

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

我们有一个在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

3 个答案:

答案 0 :(得分:0)

如果找不到问题的根本原因,或许解决问题可能有所帮助?只是一个想法:您可以将SQL语句封装在db_owner拥有的proc中,并为其指定EXECUTE AS子句。这样,当一个非db_owner调用proc时proc中的SQL将在db_owner的模拟下执行,只是为了proc的持续时间和范围。希望您的非db_owner用户可以从db_owner运行该SQL时所看到的性能中受益。

答案 1 :(得分:0)

有点迟到了,但试试这个:

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

使用视图特定对象并反转比较可能会略微改善

答案 2 :(得分:0)

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

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

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

由于您无法更改查询或功能,因此您运气不佳。

我建议您考虑使用链接表转移到ACCDB,因为无论如何,在Access 2013中取消了ADP支持。