Access链接到SQL Server

时间:2015-10-23 14:47:56

标签: sql sql-server ms-access

如果我使用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?

由于

4 个答案:

答案 0 :(得分:1)

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

在这些情况下,Access喜欢从表中请求所有内容,并在客户端执行其过滤器。这会更加严重地打击服务器,使网络更加困难,并迫使您的机器通过更多数据来显示结果集。

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

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

(如果我在代码中工作,我通常更喜欢使用ADO进行传递查询,主要是因为它允许我使用参数,而且我对动态SQL非常偏执(特别是如果涉及字符串输入)。缺点是ADO不像DAO那样处理JET环境。)

答案 1 :(得分:0)

  

速度是否与在SQL Server环境中查询数据相同?

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

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

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

答案 2 :(得分:0)

我做了类似的事情,但是使用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上。我建议你试一试,看看。

答案 3 :(得分:0)

  

如果我使用Access链接到SQL Server数据库,速度是否相同?

这取决于您执行的查询类型。我发现通常对于SELECT查询,执行时间最终几乎相同,但对于UPDATE和DELETE查询由于某种原因似乎非常慢。也就是说,我认为与Access合作一段时间的每个人都会同意它有时会出现意外行为。因此,您必须尝试并比较最终结果。