从下面的查询中,表 tdfmstr 使用两个索引和添加的条件(所有条件都是必需的)。编译后,我检查了查询的 XREF。我可以看到编译器选择了 2 个索引 opvdor 和 opsellord。
您能告诉我编译器是使用两个索引还是仅使用第二个索引(opsellord)?如果我通过在查询中提及 use-index opvdor 对编译器说仅使用第一个索引怎么办?我知道强制编译器不是一个好的选择,但在这种情况下,我不确定此查询将如何处理更大的记录并且不会导致任何性能问题。
索引
**opvdor** 3 + tdfcust
+ tdfnum
+ tdfseq
**opsellord** 3 + tdfcust
+ tdfpart
+ tdfvend
查询
for each tdf_mstr
where tdfmstr.tdfcust = "SALES"
and tdfmstr.tdfnum = "1"
and tdfmstr.tdfseq = 455
and tdfmstr.tdfpart = "TEST"
and tdfmstr.tdfglob = ""
and tdfmstr.tdfvend = "TOYOTA"
and tdfmstr.tdfeed = "X"
no-lock
use-index opvdor: /*Forcibly given to use 1st Index*/
end.
外部参照结果
916 SEARCH edb.tdf opvdor
916 SEARCH edb.tdf opsellord
使用两个索引应该是一个好处,而不是一个问题。我不明白为什么你想强制查询降低效率。您显示的 WHERE 子句在两个索引中的所有字段上都具有相等匹配,这应该是理想的。
如果您不确定,请运行一些测试用例并跟踪响应时间。或者,如果您想要真正喜欢,请使用 -zqil 启动参数来报告运行时行为。