Sql server 查询与datetime字段上的内部联接挂起

Sql server 查询与datetime字段上的内部联接挂起,sql-server,ms-access,Sql Server,Ms Access,我们在连接SQLServer2005和MSAccess2003中的表时遇到了一个奇怪的问题 服务器上有一个大表,Access中本地有一个相当小的表。这些表通过3个字段连接,其中一个是包含一天的datetime字段;想法是每天从大型服务器表中获取额外的数据,以便将数据添加到本地表中 直到周末,每天都很好。从昨天开始,我们在Access中遇到了奇怪的非超时情况。非超时意味着查询将以较高的网络传输率永远运行,但不会发生超时。Access甚至不显示进度条。服务器跟踪告诉我们,同一查询在SQL Serve

我们在连接SQLServer2005和MSAccess2003中的表时遇到了一个奇怪的问题

服务器上有一个大表,Access中本地有一个相当小的表。这些表通过3个字段连接,其中一个是包含一天的datetime字段;想法是每天从大型服务器表中获取额外的数据,以便将数据添加到本地表中

直到周末,每天都很好。从昨天开始,我们在Access中遇到了奇怪的非超时情况。非超时意味着查询将以较高的网络传输率永远运行,但不会发生超时。Access甚至不显示进度条。服务器跟踪告诉我们,同一查询在SQL Server上反复执行,没有错误,但也没有结果。我们已经把它缩小到了一个问题,似乎是使用一个大表访问服务器表,或者是JOIN,或者是WHERE包含一个日期,但是我们不能真正缩小它的范围。我们已经重建了索引,目前正在恢复备份数据,但这里可能有人有任何我们可以尝试的方法


谢谢,Mike。

请发布执行此操作的查询,仅仅因为您有索引并不意味着它们将被使用。如果WHERE或JOIN子句不可搜索,则不会使用索引

以此为例,

WHERE CONVERT(varchar(49),Column,113) =  CONVERT(varchar(49),OtherColumn,113)
这将不使用索引

还是这个

WHERE YEAR(Column) = 2008
运算符左侧的函数意味着列本身将使优化器执行索引扫描而不是搜索,因为它不知道该函数的结果

我们已经重建了索引,目前正在恢复备份数据,但这里可能有人有任何我们可以尝试的方法

访问可以杀死很多好东西……你有没有考虑过阻塞


查看BlkBy列,看看谁在阻止什么

谢谢您的快速回答

实际查询量非常大;你不会满意的:

但是,我们将其缩小到一个简单的范围:

SELECT * FROM server_table INNER JOIN access_table ON server_table.date = local_table.date;
如果server_表是一个很难说的大表,那么其中就有150万行;大约有10行的测试表已经运行,本地_表是一个包含日期的单个单元格的表。这是永恒的。它不仅速度慢,而且什么也不做。此外,它似乎造成了网络流量,而且没有超时。这就是我觉得很奇怪的地方;通常你会得到一个超时时间,但这只是继续运行


我们刚刚找到KB文章828169;这似乎是我们的问题,我们会调查的。谢谢你的帮助

这只是一个想法,但在SQL Server中,您可以附加Access数据库并使用其中的表。然后,您可以在服务器上创建一个视图,以便在SQL server中执行全部联接。知识库文章中提出的解决方案对我来说似乎有问题,因为如果LIKE有效,那么=也应该有效,这是一个难题


如果我的建议行得通,我会说它在可维护性方面是一个更健壮的解决方案。

使用DATEDIFF函数比较两个日期,如下所示:

'如果基于datepart参数的日期相同,则DATEDIFF返回0,在本例中为d

WHERE DATEDIFF(d,Column,OtherColumn) = 0
DATEDIFF针对日期使用进行了优化。如果其中一个日期为空,比较等号两边的CONVERT函数的结果可能会导致表扫描

希望这有帮助


比尔

尝试另一种语法?比如: 从BigServerTable b中选择*,其中b.DateFld位于从SmallLocalTable s中选择不同的s.DateFld 你的问题描述中奇怪的事情是直到周末,这个问题每天都很好。 这意味着问题真的存在于其他地方。 您是否尝试创建一个新的空白Access数据库并导入旧数据库中的所有内容?
或者只是刷新所有链接?

如果您在访问SQL Server中的链接表时连接了一个本地表,并且根据链接数据连接的特定限制,查询实际上并不简单,那么Access很可能会从SQL Server中提取整个表,并对整个集合执行本地连接。这是一个已知的问题

这并不能直接解决您提出的问题,但您离将所有数据放在一个地方的SQL Server还有多远?我想,只要每个系统中都有一些数据,那么同样类型的性能问题就会困扰您


如果全部都在SQL Server中,则传递查询将优化并使用可用索引等。

您能向我们展示查询本身吗?是否要将sql server中的表连接到access中的表?启动查询的过程是什么?e、 例如,access中的脚本、c代码等。如果查询是从access运行的,那么肯定不会使用索引。为什么人们不解释他们的否决票?我愿意相信我的答案是错误的,如果是的话我会删除它,但是除了盲目的反对票,我不可能说我的答案是否有问题。振作起来,解释任何反对票。如果y 你不知道,你只是个匿名的混蛋。
WHERE DATEDIFF(d,Column,OtherColumn) = 0