我是这个进度的初学者。我对下面的逻辑感到困惑,尤其是索引的实际工作方式。
我在一个索引中添加了2个字段。如下所示,我编写了三个查询。
查询1,使用索引从2个字段中查找数据来检索数据
查询2,使用相同的索引,但只从一个字段查找数据
查询3,使用了与非索引字段相同的索引字段
define temp-table tt_creldata no-undo
field tt_cscx_order as character
field tt_cscx_part as character
field tt_cscx_shipfrom as character
index tt_cscx
tt_cscx_order
tt_cscx_part
.
**Query 1:**
find first tt_creldata use-index tt_cscx
where tt_cscx_order = "153"
and tt_cscx_part = "113" no-lock no-error.
**Query 2:**
find first tt_creldata use-index tt_cscx
where tt_cscx_order = "153" no-lock no-error.
**Query 3:**
find first tt_creldata use-index tt_cscx
where tt_cscx_order = "153"
and tt_cscx_part = "113"
and tt_cscx_shipfrom = "US" no-lock no-error.
问题1:哪个查询有助于提高性能
问题2:当我提到use-index
时,如果我不使用索引的字段怎么办?问题3:如果我在提到use-index时添加一个非索引字段会怎么样?
作为一般的经验法则,您不应该使用use-index
。
AVM将在编译时选择一个或多个索引用于查询,通过强制它使用您选择的一个,您正在消除这种可能性。
如果在where子句中有额外的,可能是非索引的字段,只有当您让AVM选择时才会影响所选择的索引(即不使用use-index
)。如果您在查询中不使用索引字段,这也是正确的。
如果使用xref
或xml-xref
选项编译程序,并查找SEARCH
项,则可以看到使用了哪些索引。
正如nwahmaet所说,您永远不应该使用use - index。在这种情况下,它尤其没有意义,因为只有一个索引。在有多个索引的情况下,无论where子句多么复杂,FIND语句只会使用其中一个索引,但编译器几乎总是会比您更好地选择一个有效的索引。(FOR EACH语句及其关联的动态查询能够使用多个索引。FIND总是仅限于一个索引。)在极少数情况下,当你认为你做得更好时,你应该彻底地记录为什么你的选择更好,并包括详细的测试用例和结果。
所有的查询都使用FIRST。这是必要的,因为索引没有被定义为唯一的。这可能是你的意图,但这似乎不寻常。这意味着在有相同键值的重复记录的情况下你神奇地创造了" first "记录比其他的更特别。这是一个数据规范化的失误(你正在做"第一次")。数据的一个属性)和一个等待发生的错误。
FIND FIRST和USE-INDEX经常一起使用来(试图)掩盖彼此的不足。通过指定一个特定的索引,FIRST变得更加一致。同样,FIRST通常用于"治愈"。由于索引定义不充分、WHERE子句不充分或在FOR EACH更合适的情况下选择FIND而导致的性能问题。
这些查询都不会比其他查询执行得快。
查询2可以返回,也可以不返回与查询1相同的记录。例如,如果有part = "112"那么查询2将有一个不同的"first"记录。但是它的返回速度和查询1一样快。
同样,查询3可能会有不同的结果,这取决于哪些记录包含shipfrom = "US"。在最好的情况下,第一阶= "153"部分"113"也满足船从="美国";那么它的速度就和其他的一样了。 然而,查询3可能要慢得多,这取决于需要扫描多少条记录才能找到一条来自= "美国"由于该字段不是任何索引的一部分,因此匹配它将需要扫描记录,直到找到匹配的记录。这可能是第一个记录,也可能是第10个。