优化 SQL 数据资源管理器查询

随着游戏越来越成功,玩家群体的增长,您可能会发现,即使简单的 SQL 数据资源管理器查询也可能需要很长时间才能运行。

请参见以下基本查询

SELECT count(distinct event_name, user_id)/count(distinct user_id) as "avg number of event types per user"
FROM EVENTS
WHERE event_date>current_date-7

使用 (mod) 哈希换取查询精度以提高速度

对于大型数据集,这可能需要一段时间才能运行。但是,由于 user_id 存储为哈希值,您可以将代码重写如下

SELECT count(distinct event_name, user_id)/count(distinct user_id) as "avg number of event types per user"
FROM EVENTS
WHERE event_date>current_date-7
AND mod(hash(user_id),100) = 63

在这里,我们将用户分成 100 个伪随机分配且编号的桶,查看桶号 63。随着计算复杂度的增加,以这种方式过滤数据变得更加有用,可以节省时间。

使用四舍五入换取查询精度以提高速度

提高查询速度而不影响 100% 精度的一种简单方法是使用 approximate_count_distinct。我们之前的查询将变为

SELECT approximate_count_distinct(event_name, user_id)/ approximate_count_distinct(user_id) as "avg number of event types per user"
FROM EVENTS
WHERE mod(hash(user_id),100) = 63

使用更小的对象

我们可以通过使用更小的对象来改进许多查询。

查看SQL 数据资源管理器表格页面,查看可查询的表格。这些表格随 UGS 提供。

  • 事件
  • USERS:保存每个玩家的一行数据,以及他们在游戏中的终身指标。
  • FACT_USER_SESSIONS_DAY:包含每个玩家每个会话的数据。
  • FACT_EVENT_TYPE_USERS_DAY:包含玩家每天发送的每个事件的一行数据,以及总计计数。
  • FACT_WAU_USERSFACT_MAU_USERS:包含在特定日期之前的一周或一个月内玩过游戏的用户的个人资料数据。

FACT_EVENT_TYPE_USERS_DAYFACT_USER_SESSIONS_DAY 之间,您可能能够在更小的对象上回答 80%+ 的大多数查询。

例如,要跟踪任务失败率,我们可以使用 FACT_EVENT_TYPE_USERS_DAY 计算每天的总失败率,其中 NUMBER_OF_EVENTS 计数存储在此表格中。

SELECT event_date
, round((SUM(case when event_name='missionFailed' then number_of_events else null end) / SUM(case when event_name='missionStarted' then number_of_events else null end))*100) as overallFailRate
FROM FACT_EVENT_TYPE_USERS_DAY
WHERE event_name in ('missionStarted','missionFailed')
AND event_date>current_date-30
GROUP BY event_date
ORDER BY event_date