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

时间:2015-04-23 21:03:49

标签: ms-access

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

_multiprocessing.SemLock.SEM_VALUE_MAX

“BlockID”字段是主键并已编制索引。

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

SELECT TOP 1 BlockID FROM AvailabilityBlocks ORDER BY BlockID;

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

非常感谢任何帮助或见解!

2 个答案:

答案 0 :(得分:1)

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

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

当选择具有排序顺序的所有未索引字段时,MS-Access需要3分钟才能执行。选择所有索引字段时,它需要分秒。当选择索引字段的TOP 1时,它再次花费3分钟,这证明该函数没有使用可用索引。作弊ng-pattern="/^(?:\+88|01)?(?:\d{11}|\d{13})$/" 也没有使用索引,也需要3分钟。

我的解释是MS-Access拥有原生喷气式发动机'某些用途可以接受的功能(我仍然在一些轻量级网站上使用MS-Access)。喷气式发动机'支持可视化查询设计屏幕的所有功能。从Office 2007开始,添加了另一层功能,以使SQL语言与T-SQL兼容。

' TOP 1'声明是其中一个新的'功能。如您所见,视觉设计不支持它。很明显,没有创建此函数来使用现有索引。

您可以在(SELECT TOP 1 BLOCKID FROM (SELECT BlockID FROM AvailabilityBlocks ORDER BY BlockID)

中将代码限制为喷气引擎功能

保护您在MS-Access中投资的另一个选择是将数据迁移到ODBC数据库(MYSQL,SQL服务器,Oracle ...),并仅将MS-Access用作前端。带有' top 1'的视图然后可以通过更优化的引擎进行渲染。

答案 1 :(得分:0)

这将给出完全相同的结果([BlockID]字段包含“最低”值的一行)...仅以此方式,Access / Jet 应该使用索引来快速完成此操作:

SELECT Min(T.BlockID) AS BlockID FROM AvailabilityBlocks T;

或者,如果这是您所关注的整个顶部行,这也应该很快得到它:

SELECT * FROM AvailabilityBlocks WHERE BlockID=(SELECT Min(T.BlockID) FROM  AvailabilityBlocks T);

使用ORDER BY告诉它首先按顺序组装425K行。使用Min(BlockID),它只需从索引中获取第一个/最低值,而WHERE子句将使用索引来获取您要访问的行。

区别在于触摸一行而不是数十万...