为什么Select*Faster比Microsoft Access DB中的Select Top 1更快

use*_*904 6 ms-access

我试图让这个样本尽可能简单地重现.我在MS Access中有一个表,大约有425,000行.当我再次执行以下查询时,表执行大约需要10秒钟:

SELECT TOP 1 BlockID FROM AvailabilityBlocks ORDER BY BlockID;
Run Code Online (Sandbox Code Playgroud)

"BlockID"字段是主键并被索引.

但是当我运行以下查询时,它会在不到2秒的时间内返回:

SELECT BlockID FROM AvailabilityBlocks ORDER BY BlockID;
Run Code Online (Sandbox Code Playgroud)

我已经尝试重建索引,甚至做了一个紧凑和修复,并没有产生任何影响.

任何帮助或见解都将非常感激!

小智 1

当扩展你的实验时,你会以更多的方式看到 MS-Access 的这种行为。

观察结果在一个包含 400 万行的 MS-Access 数据库中重现,该数据库用于将 CSV 导入传输到 SQL 服务器。

当选择具有排序顺序的所有未索引字段时,MS-Access 需要 3 分钟才能执行。当选择所有索引字段时,需要一瞬间的时间。当选择索引字段的TOP 1时,又需要3分钟,这证明该函数没有使用可用的索引。作弊(SELECT TOP 1 BLOCKID FROM (SELECT BlockID FROM AvailabilityBlocks ORDER BY BlockID)也不使用索引,也需要 3 分钟。

我的解释是,MS-Access 具有本机“喷气引擎”功能,这对于某些用途来说是可以接受的(我仍然在一些轻量级网站上使用 MS-Access)。“喷气引擎”支持可视化查询设计屏幕的所有功能。从 Office 2007 开始,添加了另一层功能以使 SQL 语言与 T-SQL 兼容。

“TOP 1”语句是这些“新”函数之一。如您所见,视觉设计中不支持它。很明显,创建该函数不是为了利用现有索引。

您可以将代码限制为喷气发动机功能'options for Access'-> 'Design for objects' -> 'Query design' -> 'Compatibility with SQL server (ANSI 92).'

保护 MS-Access 投资的另一个选择是将数据迁移到 ODBC 数据库(MYSQL、SQL 服务器、Oracle ...)并仅使用 MS-Access 作为前端。然后,带有“top 1”的视图可以由更优化的引擎呈现。