我是谷歌大查询的新手,并试图了解这里的最佳做法。
我有一个(.net)组件来实现一些文章阅读器行为。
我有两张桌子。 一个是文章,另一个是用户操作。
文章是一个包含数千种可阅读文章的通用表格。 用户操作只需在用户阅读文章时注册。
我的系统中有大约200,000个用户。 在某个时间,我需要通过从文章表中获取1000篇文章并省略他已阅读的文章,为每个用户准备一桶可能的文章。
由于我有超过100,000名用户来构建一个存储桶,我正在寻找最佳解决方案来执行此操作:
可能的解决方案:
一个。查询所有文章, 湾查询所有用户操作。 C。在代码冗长的操作中创建用户存储桶以省略他所做的操作。 这意味着我在bigquery中执行大约(用户数)+ 1个查询,但我必须在我的代码中进行大量搜索。
我可以在这里做任何智能联接,但我不确定这是怎么回事? 将搜索工作留给大查询,并且使用的查询次数少于用户数。
任何有关2的帮助将不胜感激
谢谢你。
答案 0 :(得分:2)
我会做这样的事情,在一次通话中为所有读者填充一张表:
Select User,Article
from
(
Select User,Article,
Row_Number() Over (Partition by User) as NBR -- to extract only 1000 per users
From
(
((Select User From
UserActions
Group Each by User) -- Unique Users table
Cross Join
Articles) as A -- A contains a list of users with all available articles
Left Join Each
(Select User,Article
From UserAction
where activity="read"
Group Each By User,Article
) as B --Using left join to add all available articles and..
On A.User=B.User
and A.Article=B.Article
where B.User Is Null --..filter out already read
)
)
where NBR<=1000 -- filter top 1000 per user
如果您想为每个用户生成一个查询,并且您可以将用户添加到查询中,我会选择更简单的内容,例如:
Select top 1000 Article
from Articles
where Article not in
(Select Article from UserAction where User = "your user here" )
希望这有帮助