1

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

这里的查询:

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的

+0

当您在其中一个用户名下运行查询时,会返回多少个视图? – 2012-04-12 14:26:46

+0

它为db_owners返回1351行,为普通用户返回1344行 – 2012-04-13 06:49:58

+0

执行计划完全相同。在winmerge中比较它们,唯一的区别是QueryPlan元素的CompileTime和CompileCPU略有不同(两者都是vs 7)和RunTimeCountersPerThread元素,其中ActualRows对于普通用户是1344,对于db_owners是1351 – 2012-04-13 06:55:53

回答

0

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

+0

真的不能这样做是因为这些对于Access来说是“内部的”,所以这发生在我们的代码开始运行之前。谢谢你的提示 – 2012-04-16 12:15:06

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 

使用该视图特定对象和反相的比较,可以让你略有改善

0

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

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

引用:“续使用的权限的功能可能导致性能的下降。”

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

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