首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么加入CTE这么慢?

为什么加入CTE这么慢?
EN

Stack Overflow用户
提问于 2022-04-24 16:28:40
回答 2查看 96关注 0票数 0

我有一个这样的查询

代码语言:javascript
复制
WITH 
events AS (
    SELECT * 
    FROM Table1 ae
    WHERE '2022-04-21 06:25:22' >= ae.Stamp
    AND ae.Stamp > '2022-04-21 05:25:22'
),
users AS 
(
    SELECT User,COUNT(*) AS cnt 
    FROM events 
    GROUP BY User
    HAVING cnt > 60
)
SELECT *
FROM events e join users u on e.User = u.User

执行得非常慢。执行两个CTE大约需要13s,事件包含3009条记录,用户包含2条记录。但是,如下图所示,运行查询需要超过30分钟:-O

如果我将最后一行更改为显式比较用户表中的用户

代码语言:javascript
复制
FROM events e join users u on e.User in ('User1','User2')

查询在22秒内执行!

为什么连接这么慢?是否有更好的方法来实现查询?

谢谢

-更新

基于SOS的输入,我将查询更改为

代码语言:javascript
复制
WITH 
events AS (
    SELECT *,
    COUNT(*) OVER(PARTITION BY User) AS TotalUser 
    FROM Table1 ae
    WHERE '2022-04-21 06:25:22' >= ae.Stamp
    AND ae.Stamp > '2022-04-21 05:25:22'
)
SELECT *
FROM events e 
WHERE TotalUser > 60

现在执行时间为6s (在相同的数据上) :-)。

EN

回答 2

Stack Overflow用户

发布于 2022-04-25 11:54:55

尝试创建此索引。

代码语言:javascript
复制
CREATE INDEX ts_user ON Table1 (Stamp, User)

它应该同时帮助日期范围筛选器和组。

如果您使用SSMS -微软的-这个技巧是为您准备的:在查询窗口中右键单击,然后选择Show实际执行计划,然后运行查询。执行计划显示有时建议创建一个新索引。

票数 0
EN

Stack Overflow用户

发布于 2022-04-28 23:34:08

看看这是否更有效:

代码语言:javascript
复制
SELECT u.*, ae.cnt
  FROM (
    SELECT User, COUNT(*) AS cnt
        FROM Table1
        WHERE Stamp >  '2022-04-21 05:25:22'
          AND Stamp <= '2022-04-21 05:25:22' + INTERVAL 1 HOUR 
        GROUP BY User
        HAVING cnt > 60
     ) AS ae
  JOIN Users AS u  USING(User)

可能的索引:

代码语言:javascript
复制
Table1:  INDEX(Stamp, User)
Users:   PRIMARY KEY(User) or INDEX(User), but not both
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71990314

复制
相关文章

相似问题

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