首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MariaDB ColumnStore:按计算值过滤SubQuery

MariaDB ColumnStore:按计算值过滤SubQuery
EN

Stack Overflow用户
提问于 2018-02-27 04:33:29
回答 1查看 203关注 0票数 0

我有一个表,对于给定的(time, country, asn)元组,它存储了几个指标:

代码语言:javascript
复制
+----------+---------+-------+-------+--------+--------+
|   time   | country |  asn  |  rtt  |  rexb  |  reqs  |
+----------+---------+-------+-------+--------+--------+
| 10000000 |   US    | 12345 |  40   |  0.05  |  5000  |
| 10000000 |   US    | 54321 |  120  |  0.15  |  500   |
| 10000000 |   MX    | 12345 |  300  |  0.25  |  1000  |
| 10000000 |   MX    | 54321 |  160  |  0.10  |  200   |
|   ....   |   ...   |  ...  |  ...  |  ....  |  ....  |

在一般使用过程中,我将这些指标中的每个指标标准化为0到100之间的值,然后返回最大值,以便粗略估计与该国家/地区的ASN的连接有多好:

代码语言:javascript
复制
SELECT
    country,
    asn,
    least(
        -- least(100, greatest(0, ...)) = clip value between 0 and 100
        least(100, greatest(0,
            -- normalize and protect against null values
            -- sample normalization:
            --     0 ms RTT = "100% good"
            --     300 ms RTT = "0% good"
            coalesce((300 - rtt) / 3, 0)
        )),
        least(100, greatest(0,
            -- sample normalization:
            --     0% REXB = "100% good"
            --     50% REXB = "0% good"
            coalesce((0.5 - rexb) / 0.5, 0)
        )),
        -- Other metrics may follow
    ) as quality
FROM
    metrics
WHERE
    time = 10000000 -- "current time"

有时,我可能会使用reqs (对该country+ASN的请求数)列进行加权求平均值:

代码语言:javascript
复制
SELECT
    country,
    least(
        least(100, greatest(0,
            coalesce((300 - sum(rtt*reqs)/sum(reqs)) / 3, 0)
        )),
        least(100, greatest(0,
            coalesce((0.5 - sum(rexb*reqs)/sum(reqs)) / 0.5, 0)
        ))
    ) as avg_quality
FROM
    metrics
WHERE
    time = 10000000 -- "current time"
GROUP BY
    country

这个查询可以完美地工作。然而,当我试图在子查询中使用它时,我遇到了一个问题。

我的目标是找出有多少国家的“平均质量”低于某个阈值:

代码语言:javascript
复制
SELECT 
    count(*)
FROM (
    SELECT
        country,
        least(
            least(100, greatest(0,
                coalesce((300 - sum(rtt*reqs)/sum(reqs)) / 3, 0)
            )),
            least(100, greatest(0,
                coalesce((0.5 - sum(rexb*reqs)/sum(reqs)) / 0.5, 0)
            ))
        ) as avg_quality
    FROM
        metrics
    WHERE
        time = 10000000 -- "current time"
    GROUP BY
        time, country
) t1
WHERE t1.avg_quality < 50

这抛出了错误:

代码语言:javascript
复制
ERROR 1815 (HY000): Internal error: Lost connection to ExeMgr. Please contact your administrator

我可以毫无问题地执行更简单的子查询。为什么这个失败了,我该如何修复它?

我使用的是MariaDB,metrics表使用的是ColumnStore引擎。

快速更新

当我用WHERE country = "US"替换WHERE t1.avg_quality < 50时,查询执行起来没有问题。因此,它在执行子查询或过滤时没有问题。严格地说,当我尝试对计算列进行筛选时,它会失败。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-27 22:09:41

我联系了我公司的DBA,看看他们是否有任何答案或建议。他们无法为这种行为提供解释,但他们能够提供一个变通办法:

代码语言:javascript
复制
SELECT 
    count(*)
FROM (
    SELECT
        country,
        least(
            least(100, greatest(0,
                coalesce((300 - sum(rtt*reqs)/sum(reqs)) / 3, 0)
            )),
            least(100, greatest(0,
                coalesce((0.5 - sum(rexb*reqs)/sum(reqs)) / 0.5, 0)
            ))
        ) as avg_quality
    FROM
        metrics
    WHERE
        time = 10000000 -- "current time"
    GROUP BY
        time, country
    HAVING
        avg_quality < 50
) t1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48996645

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档