限制
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 BY 或 ORDER 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
}
目前,带有 aggregation 和 join 的查询不支持分页。