链接到 SQL Server 的访问权限

Posted

技术标签:

【中文标题】链接到 SQL Server 的访问权限【英文标题】:Access linked to SQL Server 【发布时间】:2015-10-23 14:47:56 【问题描述】:

如果我使用Access链接SQL Server数据库,速度会一样吗?

例如,我在 SQL Server 数据库中有一个表 [TEST],在列 [ID] 上有一个索引。如果我在 SQL Server 环境中编写 SQL 查询:

SELECT .... 
FROM TEST 
WHERE ID = ...;

索引正在工作(或有帮助)。如果我使用 Access 链接到这个 [TEST],并在 Access 中编写查询:

SELECT .... 
FROM TEST 
WHERE ID = ...;

会不会和SQL Server环境下查询数据的速度一样?有没有办法测试它,比如执行计划,或者 SQL Server 中的 SQL Server Profiler?

谢谢

【问题讨论】:

您可以使用 Profiler 向您显示正在传递给 SQL Server 的命令。至于相对速度,你可以自己测试一下。 【参考方案1】:

只要您在索引字段上执行所有连接和 where 子句,它应该是相对相似的服务器端。当您使用 Access 查询引擎从链接表中提取数据并且您使用的是非索引字段时,就会出现问题。

在这些情况下,Access 喜欢从表中请求所有内容,并在客户端执行其过滤器。这对服务器的冲击更大,对网络的冲击更大,并迫使您的机器通过大量数据来显示结果集。

传递查询绝对是避免此类问题的最佳选择。在 DAO 中使用传递查询的一些警告:

您无法为 DAO 传递查询分配参数,因此当您需要灵活的条件时,您需要使用动态 SQL。 您可以在 DAO 传递查询中执行复杂的操作(例如,变量声明、按顺序运行多个查询、游标(如果必须的话)等)但是为了执行比单个语句更复杂的操作,您需要我们 SET NOCOUNT ON 否则当第一个语句返回其状态时,Access 将阻塞。

(如果我正在编写代码,我通常更喜欢使用 ADO 进行传递查询,主要是因为它允许我使用参数,而且我对动态 SQL 非常偏执(尤其是在涉及字符串输入的情况下)。缺点是 ADO 处理 JET 环境的能力不如 DAO。)

【讨论】:

【参考方案2】:

会不会和SQL Server环境下查询数据的速度一样?

一般来说:是的。根据我的经验,对于绝大多数查询,服务器上的执行时间在这两种情况下或多或少是相同的。当然,在 Access 中显示数据会有一点网络开销,因此总执行时间可能会稍长一些。

但也有例外。我有一些复杂的查询,通常带有一个或多个左连接,在 Access 中执行时执行得非常糟糕,但在 SQL Server 上执行时没有任何问题。

对于这些情况(您会注意到它们!),请在 Access 中使用传递查询。它们直接在服务器上执行,无需 ODBC 驱动程序解释。

【讨论】:

感谢传递查询解决方案。一开始并不知道。在 Access 端花费的时间太少。但是,@Dan Bracuk 似乎有一些不同的想法。我会测试一下。 @kzhang12:嗯,你问的是SQL Server。只有在如上所述的极少数情况下,我才看到在直接 SQL 查询中不会出现的 Access 查询中的性能问题。永远不要直接使用表,或者使用“简单”查询(几个带有 INNER JOIN 的表)。【参考方案3】:

我做类似的事情,但使用 redbrick,而不是 sql server。以下是我的观察:

使用直通查询在性能上几乎没有差异。但是,输出将是只读的,可能是也可能不是您想要的。

在具有复合主键的单个表上使用访问查询设计器,它可能快如闪电,也可能非常慢。如果查询不返回任何行,您会立即得到一个空结果集。但是,如果查询要返回数据,那就另当别论了。

本示例使用名为 Clinic_fact 的表,主键为registration_number 和clinic_position。它有大约 650 万条记录。如果您直接查询数据库,过滤单个registration_number,您将获得即时结果。在访问中,需要10多秒才能得到结果。在那段时间里,我可以看到正在生成什么 sql。看起来像这样。

select yourfields
from "clinic_fact"  
where "registration_number" = 'something' and "clinic_position" = 2 
or "registration_number" = 'something' and "clinic_position" = 1 
or "registration_number" = 'something' and "clinic_position" = 1 
or "registration_number" = 'something' and "clinic_position" = 1 
or "registration_number" = 'something' and "clinic_position" = 1 
or "registration_number" = 'something' and "clinic_position" = 1 
or "registration_number" = 'something' and "clinic_position" = 1 
or "registration_number" = 'something' and "clinic_position" = 1 
or "registration_number" = 'something' and "clinic_position" = 1 
or "registration_number" = 'something' and "clinic_position" = 1;

此查询返回 2 行。诊所位置是 1 和 2。

SQL Server 可能会或可能不会发生类似的事情。我建议你试试看。

【讨论】:

这听起来像 redbrick ODBC 驱动程序......不是很好。但我同意“试试看”。 这是一个很好的例子。谢谢。但我不太明白“输出将是只读的”部分。使用直通查询后,您仍然可以编辑底层 SQL。 可能是驱动,也可能不是。我不会尝试分析我的观察结果,只介绍它们。 关于只读部分。我使用访问权限来编辑红砖数据库中的记录。如果我使用直通查询,则无法编辑返回的任何记录。 这不是问题的好答案。查询翻译和性能与 ODBC-Driver(除其他外)密切相关。因此,您无法将 Redbrick 与 SQL-Server 进行比较。【参考方案4】:

如果我使用Access链接SQL Server数据库,速度会一样吗?

这取决于您正在执行的查询类型。我发现通常对于 SELECT 查询,执行时间最终几乎相同,但对于 UPDATE 和 DELETE 查询由于某种原因似乎真的很慢。也就是说,我认为使用 Access 一段时间的每个人都会同意它有时会表现得有些出乎意料。因此,您将不得不尝试并比较最终结果。

【讨论】:

以上是关于链接到 SQL Server 的访问权限的主要内容,如果未能解决你的问题,请参考以下文章

授予对数据库的 SQL Server 登录访问权限 - SQL Server

Microsoft sql server无法访问,请检查访问权限

SQL Server 查询以查找数据库中所有用户的所有权限/访问权限

SQL Server - 授予对所有现有和未来数据库的读取访问权限的登录权限

如何处理访问 SQL Server 数据库的应用程序的权限?

在没有 VIEW SERVER STATE 权限的情况下查找 SQL Server 2014 中最常访问的表