Jet Engine 的查询优化是基于统计的,但是它们是如何用链接表刷新的呢?
Posted
技术标签:
【中文标题】Jet Engine 的查询优化是基于统计的,但是它们是如何用链接表刷新的呢?【英文标题】:Jet Engine's query-optimization is based on statistics, but how are they refreshed with linked tables? 【发布时间】:2009-11-09 21:06:28 【问题描述】:我正在处理一些旧版访问
查询强制喷气发动机根据喷气发动机优化从 SQL Server 检索数据。因此,每当 sql server 发生变化时,刷新 odbc-links 是必不可少的,比如添加一个新的 index par 示例。
随着一些表变大,jet-optimizer 需要刷新统计信息,但哪个进程会这样做?是修复和压缩还是刷新 ODBC 链接?这可以通过编程方式完成吗?
和平
冰
【问题讨论】:
【参考方案1】:JET 要做出良好的优化决策,最重要的是正确的索引在表格上。您可以通过在设计模式下打开链接表 (ODBC) 并单击索引图标来检查 JET 可以看到哪些索引。您将收到一条警告说这些表是只读的。
在源表上创建索引可能比在执行查询时等待 JET 构建优化元数据更有效。
【讨论】:
Jet 在执行查询期间正在执行诸如构建统计信息之类的操作?这些信息将存储在哪里?当我以只读模式打开 mdb(提示:odbc 链接表中的数据是可写的)但 mdb 没有增长时怎么办? Jet 确实在查询执行期间存储元数据并将其存储在 .mdb 文件中。 Jet 可以在本地表上编译比 ODBC 连接更完整的信息。如果 JET 决定将查询编译交给远程数据库,那么可能会创建很少的优化信息。【参考方案2】:认识到只有 ODBC 数据源的某些类型的表统计信息和元数据与 Jet 相关,这一点很重要。一般来说,我认为从 Jet 决定如何处理 SQL 语句的角度来看,索引是唯一真正重要的部分——只要索引在那里并且它理解另一端的服务器,它就会处理一切除非您愚蠢地选择或排序了服务器数据库无法理解的表达式,否则请转到服务器进行处理。在这种情况下,Jet 可能仍然足够聪明,可以发送部分 SQL 语句供服务器处理(例如文字上的连接和条件),然后使用表达式返回的结果集。
关于链接表的问题,不幸的是,没有动态的方法来更新 ODBC 链接表 - 例如,向表或视图添加列,它不会在返回的表中,刷新链接,新列就会出现,但它可能是只读的。
我发现在更改服务器的表结构和视图时唯一要做的就是删除并重新创建相关的链接表。我不知道有任何编程方式可以做到这一点。如果有关于表/视图的任何元数据告诉其结构上次更新的时间,您可能能够根据链接表的日期检查它,并在链接后更新后端时删除并重新创建,但我只是在这里猜测。但这将是特定于后端的。
为了完整起见,我将仅提供 Jet 后端的基础知识:
使用 Access to Jet,compact 应该重置表统计信息,并且在下一次运行每个 SQL 语句时,将丢弃每个语句的编译,并根据新的统计信息重新计算查询计划。如果您为了更新表统计信息而压缩前端,那么在压缩前端之前压缩后端很重要,因为这样可以确保所有后端表统计信息都为尽可能准确(尽管它们中的大多数即使没有紧凑型也能保持最新状态)。
【讨论】:
谢谢,为深入的解释。我完全同意,但是在 where 子句中包含子选择的选择语句存在显着差异: where not exists(select * from... 这些语句在 sql-server 上运行就像一个魅力,但 jet 为每一行发送一个子选择-statement...您可以使用分析器在 sql-server 上跟踪它。这不好玩。jet-statistics 到底存储在哪里? 无法通过我知道的任何方法访问 Jet 统计数据。【参考方案3】:如果我错了,我相信我会得到纠正,但我认为重新链接表格会强制更新统计信息。如果只有几个表,那么您可以使用内置的“链接表管理器”来执行此操作。如果没有,那么您可以在代码中将其自动化,然后每次您想要更新表统计信息时触发该功能。
我有一些代码将访问表重新链接到其他路径,我相信您可以修改这些代码以使用 ODBC 链接表
【讨论】:
刷新现有链接不会更新链接表中存储的所有元数据。只有删除和重新创建链接才能确保元数据是最新的。 我的立场是正确的(穿矫形鞋的人说)。你是否知道刷新链接时元数据的哪些部分没有更新,只有在删除链接时才更新?以上是关于Jet Engine 的查询优化是基于统计的,但是它们是如何用链接表刷新的呢?的主要内容,如果未能解决你的问题,请参考以下文章
EXCEL 导入SQL2005 提示 找不到可安装的 ISAM。 (Microsoft JET Database Engine)