我需要我的查询使它成为多个索引,它是如何可能的

时间:2013-05-21 06:14:47

标签: progress-4gl

FOR EACH customer no-lock where cs-id = "ABC" AND em-id = "123" AND  vehicle = YES:
    Display customer.  
END.

INDEX
 idx1  cs-id  em-id country state 
 idx2   cs-id vehicle  

我的查询只占用idx2它没有采用多个索引,如果它将使两个索引性能都会提高。

问题:如何查询多个索引。

注意:条件应该相同

3 个答案:

答案 0 :(得分:2)

This article涵盖了进度中的多个索引选择

在论文中,他们提到了以下内容:

  

当选择标准包括使用AND时,不止一个   当涉及每个索引的所有组件时,将使用index   在平等匹配中,索引不是唯一的。

在您的查询中,您没有指定国家/地区和州,因此我不相信多重索引会启动。

进度不会使用for中的数据量来确定要使用的索引。我将假设使用cs-id,与使用车辆的idx2相比,em-id返回的行数更少,因此强制进度使用idx1,如下所示

  

对于每个客户NO-LOCK WHERE                 customer.cs-id =“ABC”AND customer.em-id =“123”AND   customer.vehicle = YES          USE-INDEX idx1:          显示客户。 END。

答案 1 :(得分:0)

如果要使用这两个索引,则必须使用查询中的所有索引字段:

FOR EACH customer no-lock 
    where cs-id = "ABC" 
    AND em-id   = "123" 
    and country = "XX"
    and state   = "YY
    AND vehicle = YES:
    Display customer.  
END.

答案 2 :(得分:0)

我不确定为什么要使用这两个索引,使用正确的索引是重要的。使用索引允许进度返回最少量的数据,因为您使用的是cs_id&这意味着index2在大多数情况下都是有效的。

如果你有一个非常大的数据库,其中有很多记录仍在idx2中,或者你经常需要根据你指定的三个字段找到记录,那么创建一个包含所有三个字段的第三个索引可能是值得的。

idx3 cs-id em-id vehicle

如果您想强制OpenEdge使用多个索引并且您使用AND运算符,那么您必须满足以下所有条件:

  • 所有匹配都是平等匹配。
  • 所有索引都是非唯一索引。
  • 包含索引的所有组件。