限制

SQL 插件存在以下限制:

不支持对表达式进行聚合

您只能对字段应用聚合。聚合操作无法接受表达式作为参数。例如,不支持 avg(log(age))

FROM 子句中的子查询

FROM 子句中 SELECT outer FROM (SELECT inner) 这种格式的子查询,仅当查询被合并为一个查询时才受支持。例如,以下查询是支持的:

SELECT t.f, t.d
FROM (
    SELECT FlightNum as f, DestCountry as d
    FROM opensearch_dashboards_sample_data_flights
    WHERE OriginCountry = 'US') t

但是,如果外部查询包含 GROUP BYORDER BY,则不受支持。

JOIN 查询

由于 UDB-Sx 本身不支持关系型操作,因此 JOIN 查询仅尽力提供支持。

JOIN 不支持对连接结果进行聚合

JOIN 查询不支持对连接结果进行聚合操作。

例如,不支持 SELECT depo.name, avg(empo.age) FROM empo JOIN depo WHERE empo.id = depo.id GROUP BY depo.name

性能

JOIN 查询容易导致昂贵的索引扫描操作。

当处理超过 500 万条匹配记录的结果集时,JOIN 查询可能会遇到性能问题。 为了提高 JOIN 性能,请先通过筛选数据来减少要连接的记录数。例如,将连接限制在特定的键值范围内:

SELECT l.key, l.spanId, r.spanId
  FROM logs_left AS l
  JOIN logs_right AS r
  ON l.key = r.key
  WHERE l.key >= 17491637400000
    AND l.key < 17491637500000
    AND r.key >= 17491637400000
    AND r.key < 17491637500000
  LIMIT 10

默认情况下,JOIN 查询会在 60 秒后自动终止,以防止资源过度消耗。您可以在查询中使用提示来调整此超时期限。例如,要设置 5 分钟(300 秒)的超时,请使用以下代码:

SELECT /*! JOIN_TIME_OUT(300) */ l.key, l.spanId, r.spanId FROM logs_left AS l JOIN logs_right AS r ON l.key = r.key LIMIT 10

这些性能限制不适用于查询外部数据源时。

分页仅支持基本查询

分页查询使您可以获取分页响应。

目前,分页仅支持基本查询。例如,以下查询返回带有游标 ID 的数据。

POST _plugins/_sql/
{
  "fetch_size" : 5,
  "query" : "SELECT OriginCountry, DestCountry FROM opensearch_dashboards_sample_data_flights ORDER BY OriginCountry ASC"
}

以 JDBC 格式返回的响应,包含游标 ID。

{
  "schema": [
    {
      "name": "OriginCountry",
      "type": "keyword"
    },
    {
      "name": "DestCountry",
      "type": "keyword"
    }
  ],
  "cursor": "d:eyJhIjp7fSwicyI6IkRYRjFaWEo1UVc1a1JtVjBZMmdCQUFBQUFBQUFCSllXVTJKVU4yeExiWEJSUkhsNFVrdDVXVEZSYkVKSmR3PT0iLCJjIjpbeyJuYW1lIjoiT3JpZ2luQ291bnRyeSIsInR5cGUiOiJrZXl3b3JkIn0seyJuYW1lIjoiRGVzdENvdW50cnkiLCJ0eXBlIjoia2V5d29yZCJ9XSwiZiI6MSwiaSI6ImtpYmFuYV9zYW1wbGVfZGF0YV9mbGlnaHRzIiwibCI6MTMwNTh9",
  "total": 13059,
  "datarows": [[
    "AE",
    "CN"
  ]],
  "size": 1,
  "status": 200
}

目前,带有 aggregationjoin 的查询不支持分页。