我试图让这个样本尽可能简单地重现.我在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”的视图可以由更优化的引擎呈现。
归档时间: |
|
查看次数: |
636 次 |
最近记录: |