在整个索引上使用括号有什么区别?
What is the difference using bracket on the entire index?
/* Method 1 */
FOR EACH customer NO-LOCK WHERE customer.name EQ 'John':
DISPLAY customer.name.
END.
/* Method 2*/
for each customer where (customer.name EQ 'John'):
DISPLAY customer.name.
end.
能否请您用括号解释编译器的作用?
你的第二个例子并不快。它实际上更慢,因为您没有指定 NO-LOCK。因此,默认情况下,您将获得带有 SHARE-LOCK 的记录,当每条记录超出范围时,需要将其解锁。这项额外的工作需要时间并导致查询变慢。
如果您正在连接 client/server,它可能会慢几个数量级,因为:
a) 每条记录需要3条网络消息。 1 请求它,另一个 return 它和第三个解锁它。
b) NO-LOCK 查询可以将多个记录打包到一个响应消息中。这比一次请求并发送一个要有效得多。因为没有锁,所以不需要解锁。
(在您的示例中,您只获得了一条记录,因此差异很小。)
"Index Brackets" 与用“(”和“)”分组的子表达式是完全不同的概念。索引括号是由 WHERE 子句的元素指定的一组记录。在上面的两个示例中,您在一个字段上进行了相等匹配,该字段是唯一索引的主要组成部分。所以 "bracket" 正好是一条记录。 (假设这是标准的体育数据库!)
如果您指定更复杂的内容,例如:
for each order no-lock where order.custid = 1 and order.ship-date >= 7/1/2019 and order.ship-date <= 7/31/2019:
Progress 使用静态的、基于规则的查询优化器。索引是在编译时选择的。规则很复杂,但到目前为止,最重要的是领先组件的相等匹配使您的索引发挥作用。范围匹配是下一个最有用的。但是一旦您获得范围匹配,就不会再考虑其他字段来选择索引。
在某些情况下,使用括号对 WHERE 子句的元素进行分组会对索引选择产生影响。 (只有一个字段被选中的情况不是其中之一。)通常,这将是您有一个混合了 AND 和 OR 元素的复杂查询的情况。如果没有别的,在这些情况下使用括号可以使运算符优先级更不容易出错并且更容易被人类阅读。
有很多关于索引选择过程的 material 可用。我建议你从这里开始:https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/wp-abl-triggers/general-rules-for-choosing-a-single-index.html
在每个 PUG 挑战赛上也有关于该主题的精彩演讲。如果您不能亲自参加(您应该),可以下载其中的许多内容:http://pugchallenge.org/downloads.html
/* Method 1 */
FOR EACH customer NO-LOCK WHERE customer.name EQ 'John':
DISPLAY customer.name.
END.
/* Method 2*/
for each customer where (customer.name EQ 'John'):
DISPLAY customer.name.
end.
能否请您用括号解释编译器的作用?
你的第二个例子并不快。它实际上更慢,因为您没有指定 NO-LOCK。因此,默认情况下,您将获得带有 SHARE-LOCK 的记录,当每条记录超出范围时,需要将其解锁。这项额外的工作需要时间并导致查询变慢。
如果您正在连接 client/server,它可能会慢几个数量级,因为:
a) 每条记录需要3条网络消息。 1 请求它,另一个 return 它和第三个解锁它。
b) NO-LOCK 查询可以将多个记录打包到一个响应消息中。这比一次请求并发送一个要有效得多。因为没有锁,所以不需要解锁。
(在您的示例中,您只获得了一条记录,因此差异很小。)
"Index Brackets" 与用“(”和“)”分组的子表达式是完全不同的概念。索引括号是由 WHERE 子句的元素指定的一组记录。在上面的两个示例中,您在一个字段上进行了相等匹配,该字段是唯一索引的主要组成部分。所以 "bracket" 正好是一条记录。 (假设这是标准的体育数据库!)
如果您指定更复杂的内容,例如:
for each order no-lock where order.custid = 1 and order.ship-date >= 7/1/2019 and order.ship-date <= 7/31/2019:
Progress 使用静态的、基于规则的查询优化器。索引是在编译时选择的。规则很复杂,但到目前为止,最重要的是领先组件的相等匹配使您的索引发挥作用。范围匹配是下一个最有用的。但是一旦您获得范围匹配,就不会再考虑其他字段来选择索引。
在某些情况下,使用括号对 WHERE 子句的元素进行分组会对索引选择产生影响。 (只有一个字段被选中的情况不是其中之一。)通常,这将是您有一个混合了 AND 和 OR 元素的复杂查询的情况。如果没有别的,在这些情况下使用括号可以使运算符优先级更不容易出错并且更容易被人类阅读。
有很多关于索引选择过程的 material 可用。我建议你从这里开始:https://documentation.progress.com/output/ua/OpenEdge_latest/index.html#page/wp-abl-triggers/general-rules-for-choosing-a-single-index.html
在每个 PUG 挑战赛上也有关于该主题的精彩演讲。如果您不能亲自参加(您应该),可以下载其中的许多内容:http://pugchallenge.org/downloads.html