SQL 服务器 :: Microsoft Access 查询中数据类型的隐式转换?

SQL Server :: implicit conversion of Data Type in query from Microsoft Access?

几周以来,我一直在管理 SQL Server 2019,该服务器不断受到 Microsoft Access 应用程序的攻击。

我发现了这个 Brent Ozar post(谢谢 @Brent),我发现 Access 中的数据类型与 SQL 服务器中的数据类型不同:

我知道有很多方法可以 improve performances 但我需要知道的是:数据类型在从 Access 转换为 SQL 时是否提交隐式转换服务器?

例如,Access 中的 Short Text 如何被 SQL 服务器解释为 bigintchar(10)datetimeoffsetnchar(10) , varchar(50), 等等...?

对我来说,它们看起来都像是隐式转换,对吧?

and I discovered with disgust that Data Types in Access are not the same in SQL Server:

You find that FoxPro data types are different. 
You find that Excel sheets data types are different
You find that SharePoint lists and data types are different
(all of the above are Microsoft products).

You find that MySQL data types are different
You find that Oracle data types are different
And so on. So data types "are" often different.

结果呢? 您会发现,即使不是大多数数据系统,也有相当多的数据系统必须使用稍微不同的数据类型。因此,ODBC 或 oleDB,甚至现在 jdbc 驱动程序将处理从服务器到客户端软件所需的转换。这可能会导致某些数据类型根本不受支持。

does the Data Types commit an implicit conversion when they get translated from Access to SQL Server?

是的,你是对的。 其实就是ODBC驱动。 SQL 服务器不“知道”客户端查询请求是否来自 Access、FoxPro、VB6、vb.net,甚至是一些奇特的 asp.net 网站。

在所有情况下,数据查询的速度和拉取速度都是相同的。

SQL 服务器不会突然决定 Access 中的某些查询或来自 asp.net 网站的某些 sql 查询 运行 变慢或更快。

ODBC 驱动程序(或现在很少使用的 oleDB 驱动程序)的数据类型转换(自动)在提取数据方面从来没有成为重大成本或开销。

因此,访问速度,或者说 asp.net 站点提取一些数据是相同的。

因此,访问中的任何查询都不应该比从 asp.net 或某些花哨的 c# 客户端程序发送的查询慢。它们都 运行 相同的速度,并且数据类型转换是所有 ODBC 或客户端软件用来提取此类数据的驱动程序的正常部分。

因此,如果我使用 Access、FoxPro、VB6、C# 或某些 asp.net 网站连接并从 SQL 服务器提取数据?那么在所有这些情况下,与 say .net 兼容的数据类型转换已经并且将会由所使用的驱动程序和连接堆栈进行。这种数据类型转换实际上从不影响性能。

那么,从 Access 或 .net 提交的查询?他们应该运行一样。但是,Access 具有(而 .net 和大多数其他连接技术不具有)的一个特性和能力是 Access 可以在不同的连接对象之间进行连接。因此,我可以有一个本地 table,一个 linked 到 Foxpro,另一个 linked 到 SQL 服务器。在 Access 中,您可以在这些不同的数据源 table 之间执行联接和 sql 查询。例如,在 .net 中,一个查询仅限于一个连接对象。

然而,这也意味着任何试图在两个数据源 table 之间进行关系连接的查询(即使是同一个数据库)都可能发生在客户端(因为 Access 可以做到这一点,而大多数系统都没有这个能力)。因此,在某些情况下,虽然从 Access 或说 asp.net 提取数据的 select 查询中的速度差异很小(如果有的话)?

当涉及到关系连接时,Access 可以导致关系连接和工作发生在客户端而不是服务器端。在这些情况下,您可以通过多种方法强制查询(和连接)发生在服务器端。在这些情况下,这样的查询将 运行 非常慢。

最佳选择:

Use/create 一个视图,link 从 Access 客户端到该视图。这是最佳选择。原因是您可以获得与 pass-though 查询相同的性能,并且可以获得与存储过程相同的性能。但是,没有代码或工作可以做到这一点。完成后,您再次发现 Access 客户端中的查询拉取速度与任何其他客户端软件(.net、asp.net、c# 等)相同

再一次,从性能的角度来看,所涉及的驱动程序对数据类型转换的任何考虑都是一个 MOOT 点。

您可以考虑 pass-through 查询来代替 linked 视图的极少工作。这当然又是从 Access 客户端发送的原始 T-SQL 语句,而且数据类型问题同样没有实际意义,因为这是发送到 sql 服务器的 t-sql 语法代码,因此它的 t-sql 采用 sql 语句并从 ASCII(好吧,uni-code)字符串进行数据类型转换,并将该字符串转换为数字、日期类型等。但话又说回来您编写的任何 sql 具有以此类字符串表示的值的语句都会发生数据转换。

那么是 .net、FoxPro、Access、asp.net 客户端软件?他们都将并且必须在数据和客户端软件之间进行数据转换类型。例如,.net 有几种数据类型,您可以在代码中定义这些数据类型,例如 Access、FoxPro 甚至 VB6(甚至 C++)都没有。因此,每个客户端系统都不断地从该软件中的本机变量和数据类型转换为 sql 服务器上使用的数据类型。

因此,所有客户端软件都会发生这种数据转换,这种转换在 Access 中不再是性能因素,然后用 C++ 甚至汇编程序编写代码。将查询发送到 sql 服务器时,所有这些系统的速度是相同的。