Vertica或其他sql服务器如何执行连接

时间:2017-04-11 19:52:39

标签: sql vertica

查看我的下一个Vertica查询:

WITH groupA AS (
    SELECT
      userId,
      color
    FROM worldUsers
    WHERE DayPartition = 409
          AND Hour = 12
)
SELECT
  color = 12 AS                        userColor,
  REGEXP_LIKE(familyName, '[a-z]+ish', 'i') ishPeople,
  REGEXP_LIKE(familyName, '[a-z]+lem', 'i') lemPeople,
  count(*)                         AS                        peopleCount,
  round(count(*) / sum(count(*))
  OVER (), 5.0) * 100 || '%'       AS                        peoplePercentage

FROM PlanetUsers
  JOIN groupA USING (userId)
WHERE DayPartition = 409
GROUP BY 1, 2, 3
ORDER BY 4 DESC

表格 worldUsers PlanetUsers 都有字段Hour,它们都由DayPartition字段分区。如果我们更改以下查询的where语句

,它会改善性能吗?

 WHERE DayPartition = 409 

 WHERE DayPartition = 409 and AND Hour = 12

或更改使用声明

USING (userId)

USING (userId, Hour)

假设除DayPartition上的分区外没有主键且没有投影

1 个答案:

答案 0 :(得分:0)

该分区仅用于CTE的初始提取。 我建议你删除CTE,因为你有它们,并确保你有两个表由连接键排序(这表明你加入将是哈希或合并)。

分区将应用分区修剪并限制查询中使用的ROS数量。

因此,您的两个表都应按(userid,hour)排序。

在初始sql之上运行explain,确保你有stas,在查询中进行更改并再次查看解释。

在此处发布您的计划,我们可能会帮助您。