RegexMatch 在处理大量数据时是否高效?

问题描述 投票:0回答:1

我正在经历 RegexMatch 并试图了解较大记录上的性能问题或不存在的问题(如果有)。

我的目标是获取 stockNumber 不精确的 10 位数字的记录。

文档示例1:

{
  "id": "abc",
  "stockNumber": "1001234567"
}

{
  "id": "pqr",
  "stockNumber": "200"
}

{
  "id": "xyz",
  "stockNumber": "200111"
}

正则表达式解决方案:

SELECT 
    *
FROM
    c
WHERE
   NOT RegexMatch(c.stockNumber, "^\\d{10}$")

Request Charge = 6.14 RUs

另一种添加新字段的方法:

{
  "id": "abc",
  "stockNumber": "1001234567",
  "someFlag": false
}

{
  "id": "pqr",
  "stockNumber": "200",
  "someFlag": true
}

{
  "id": "xyz",
  "stockNumber": "200111",
  "someFlag": true
}

查询:

SELECT 
    *
FROM
    c
WHERE
  c.someFlag = true

Request Charge = 6.1 RUs

附加信息:

  • 现在,我没有大量记录(假设超过 10,000 条)可以看到此差异。所以想了解最好的方法是什么。
  • 此有效负载可以有其他字段,我可以在查询中添加
    WHERE
    子句。不确定它会产生多少差异。
  • 我们有
    stockNumber
    作为字符串,这一步是过滤掉此类记录。
regex azure-cosmosdb
1个回答
0
投票

将固有较慢的正则表达式条件与优化器可能首先使用的更简单、更快的条件相结合,这将廉价地减少搜索空间:

SELECT *
FROM c
WHERE LEN(c.stockNumber) != 10
AND NOT RegexMatch(c.stockNumber, "^\\d{10}$")
© www.soinside.com 2019 - 2024. All rights reserved.