为啥 MS-Access 中的 Teradata 查询比 SQL Server 更快
Posted
技术标签:
【中文标题】为啥 MS-Access 中的 Teradata 查询比 SQL Server 更快【英文标题】:Why is a Teradata query faster in MS-Access than SQL Server为什么 MS-Access 中的 Teradata 查询比 SQL Server 更快 【发布时间】:2015-05-15 18:55:27 【问题描述】:我需要连接一个包含大约 5 亿条记录的 Teradata 表和一个包含大约 10,000 条记录的本地表。我让它在 MS Access 中运行,运行大约需要 15 分钟。我更愿意在 SQL Server 中执行此操作,但甚至无法在本地 SQL 表中使用 1 条记录进行连接。
为什么 MS Access 能够做到这一点,尽管速度很慢,而 SQL Server 却卡住了? MS Access 与 SQL Server 有何不同?
连接失败的 SQL Server 查询:
SELECT a.trk, a.wgt
FROM openquery(TERADATA, 'SELECT trk, wgt
FROM SHIPMENT_DB.pkg') a
INNER JOIN (Local_Tbl) b ON a.trk = b.Tracking_Number
一个没有连接的简单 SQL Server 查询:
SELECT *
FROM openquery(TERADATA,'SELECT trk, wgt
FROM SHIPMENT_DB.pkg
WHERE trk = ''773423067500''')
【问题讨论】:
这两个查询都是 SQL Server 查询。 Access 是如何参与的? 在 MS-Access 中,我通过 ODBC 驱动程序连接到 Teradata DB。然后,我将 500M Terdata 表链接到 Access 并构建了一个简单的选择查询,将这两个表连接在一起。有用。 MS-Access 必须做一些不同于 SQL Server 的事情,但是什么? Access 不是在加入之前将整个 500M Teradata 表带过来,而是如何处理查询?我觉得很奇怪,Access 比 SQL-Server 能更好地执行这个任务。让我觉得我在 SQL Server 中做错了什么。 我的猜测是 Access 可以识别 Teradata DB 的大小并通过 IN 子句选择记录。我相信有一种方法可以监视 Access 发送的内容,但不知道它是不是临时的。至于 SQL Server 端,使用链接服务器而不是 openquery 可能会获得更好的结果。值得一试。 【参考方案1】:不是答案,但我在使用 OPENDATASOURCE 时遇到了类似的问题。性能很糟糕,查询需要几个小时才能运行。 解决方案是确保 WHERE 子句中涉及的所有列都具有数学数据类型。在我的情况下,远程列是 INT 但在查询中它作为 varchar 传递:...'WHERE remote_table.ID = ''4'''... 将所有值更改为适当的数据类型后,查询需要几秒钟才能运行。
【讨论】:
【参考方案2】:查看 SQL Server 中的执行计划。由于它对将从 Teradata 返回的数据集知之甚少,因此它做出了一些假设。
交换连接中表的顺序会有所帮助。使用明确的INNER HASH JOIN
可能会有所帮助(一旦您切换了顺序)。
【讨论】:
以上是关于为啥 MS-Access 中的 Teradata 查询比 SQL Server 更快的主要内容,如果未能解决你的问题,请参考以下文章