ms-access - 为什么在 Microsoft Access DB 中 Select * 比 Select Top 1 更快

标签 ms-access

我尝试让这个示例尽可能容易地重现。我在 MS Access 中有一个大约有 425,000 行的表。当我再次执行以下查询时,该表大约需要 10 秒才能执行:

SELECT TOP 1 BlockID FROM AvailabilityBlocks ORDER BY BlockID;

“BlockID”字段是主键并已建立索引。

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

SELECT BlockID FROM AvailabilityBlocks ORDER BY BlockID;

我尝试过重建索引,甚至进行了压缩和修复,但都没有效果。

任何帮助或见解将不胜感激!

最佳答案

当扩展您的实验时,您会以更多方式看到 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 具有 native “喷气引擎”功能,这对于某些用途来说是可以接受的(我仍然在一些轻量级网站上使用 MS-Access)。 “喷气引擎”支持可视化查询设计屏幕的所有功能。从 Office 2007 开始,添加了另一层功能以使 SQL 语言与 T-SQL 兼容。

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

您可以在“Access 选项”->“对象设计”->“查询设计”->“与 SQL Server 的兼容性 (ANSI 92)”中将代码限制为喷射引擎功能。

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

关于ms-access - 为什么在 Microsoft Access DB 中 Select * 比 Select Top 1 更快,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29834282/

相关文章:

database - Access VBA : Error when declaring the type of a Database object: User defined type is not defined

sql - 优化笨拙的查询

vba - 如何在 MS Access 表单上动态保持控件居中(相对位置)?

vba - Outlook VBA Mailitem 属性 SenderEmailAddress 未正确返回地址

ms-access - Microsoft Access 在启动时显示 "Missing APSBrowsePanes.dll"错误。 (虚拟机)

c# - 如何使用 MS Access 数据库在 C# 中自动生成字母数字 ID?

vba - Access 条件格式以获取单个记录的连续表格

sql - 使用变量名称创建新的 mdb 表

sql - 为什么 Access 中的 LIKE 查询不返回任何记录?

mysql - 一次性将整个 MS ACCESS 迁移到 MYSQL