2017-04-11 12 views
-1

看看我的下一个Vertica的查询:确实Vertica的或其他SQL服务器如何执行联接

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 

两个表worldUsersPlanetUsers拿到了场Hour,他们都通过DayPartition场分区。它会提高性能,如果我们改变了下面的查询

的where语句从

WHERE DayPartition = 409 

WHERE DayPartition = 409 and AND Hour = 12 

或改变using语句

USING (userId) 

为了

USING (userId, Hour) 

假设除了上DayPartition分区不存在主键和没有凸起

回答

0

分区将只在你的CTE的初始提取物一起使用。 我建议你消除CTE,因为你有他们,并确保你有两个表按连接键排序(这决定了如果你加入将是散列或合并)。

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

所以你的两张表都应该按(userid,hour)排序。

在最初的sql之上运行解释,确保你有他们的stas,对你的查询进行修改并再次看到解释。

在这里发布你的计划我们可能会帮助你。

相关问题