【发布时间】:2011-02-07 18:54:01
【问题描述】:
据我了解,大多数查询优化器都是“基于成本的”。其他人是“基于规则的”,或者我相信他们称之为“基于语法”。那么,优化 SQL 语句的语法以帮助优化器产生更好结果的最佳方法是什么?
一些基于成本的优化器可能会受到 FIRST_ROWS() 等“提示”的影响。其他的则是为 OLAP 量身定做的。是否有可能了解关于 Informix IDS 和 SE 的优化器如何决定处理查询的最佳路径(除了 SET EXPLAIN)的更详细逻辑?是否有任何文档说明 SELECT 语句的排名,假设它已被索引,那么访问行的最快方法是什么?
我想“SELECT col FROM table WHERE ROWID = n”是最快的(排名 1)。
如果我没记错的话,Informix SE 的 ROWID 是一个 SERIAL(INT),它允许一个最大值。 2GB nrows,或者它使用 INT9 作为 TB 的 nrows? SE 的优化器是基于成本的,当它有足够的数据但它不使用像 IDS 优化器这样的分布时。
IDS'ROWID 不是 INT,它是行左页的逻辑地址 移位 8 位加上包含行数据的页面上的插槽号。
IDS 的优化器是基于成本的优化器,它使用数据 关于索引的深度和宽度、行数、页数和 由更新统计 MEDIUM 和 HIGH 创建的数据分布来决定 哪个查询路径成本最低,但没有语句排名?
我认为 Oracle 使用 HEX 值作为 ROWID。太糟糕了 ROWID 不能经常使用,因为行 ROWID 可以更改。所以也许优化器可以使用 ROWID 作为计数器来报告查询进度?我在“在查询完成之前开始查看查询结果”问题中提到的一个想法?我觉得在处理时报告查询的进度并不难,也许会以一些轻微的开销为代价,但提前知道会很好:“类似谷歌”的估计有多少行满足查询的条件,每 100、200、500 或 1,000 行显示它的进度,让用户能够随时取消它,并在它们被放入当前列表时开始显示符合条件的行,同时继续搜索?.. 这个只是一个例子,也许我们可以考虑其他简洁/有用的功能,这些元素或多或少都在那里。
也许我们可以比当前可用的更精细地微调每个查询? OLTP 查询往往是静态的和预定义的。 “假设”更多的是 OLAP,所以让我们尝试为其添加更多控制和智能?因此,需要能够更精确地控制,而不仅仅是“提示/影响”优化器。然后,我们可以针对特定情况使用更多动态 SELECT 语句!甚至可能告诉 IDS 一次读取索引节点块,而不是一个接一个,等等。
【问题讨论】:
-
一个问题中有很多问题 - 对于商业产品,查询优化器的内部工作仅保留内部信息,因为它构成产品 IP 的一部分。
标签: sql-server oracle db2 informix