【问题标题】:Eliminate queries with a temporary table that get update every x minutes使用每 x 分钟更新一次的临时表消除查询
【发布时间】:2012-12-22 15:36:12
【问题描述】:

我有一张用户桌

id | user_id | session_id | last_activity (datetime)

在不对每个用户请求进行痛苦查询的情况下获得在线用户列表的最佳方式是什么?可以说是否有可能每 1 分钟有一个 cron 并通过它创建一个具有不同 user_id 的临时表,该表在最后一分钟有最后一个活动?主要目标是获得比这个查询更快的东西

select user_id 
from users_session 
where last_activity > dateadd(mi, -1, Current_TimeStamp) 
group by user_id

【问题讨论】:

  • 表的索引是否按last_activity降序排列?

标签: sql-server database sql-server-2008


【解决方案1】:

你可以做几件事,但我更喜欢这样的事情:

在登录时(如果您有登录名?),在 ActiveUsers 表中插入一行。每次用户执行某项操作时,更新此表中的 last_activity 列。有一个每分钟或两分钟运行一次的作业,并从该表中删除 last_activity 为 < DATEADD(mi, -10, GETDATE() 的行。

这样,您查找活跃用户的查询是SELECT user_id FROM ActiveUsers

此外,要获取有关活跃用户的更多信息,您可以执行以下操作:

SELECT U.name, U.age, U.shoe_size, U.is_premium_member, AU.last_activity
FROM Users U
JOIN ActiveUsers AU ON U.User_id = AU.User_id

【讨论】:

  • 非常感谢您的回复!是的,我有一个登录名,我在这里做几乎相同的事情,但是因为我对每个用户使用多个活动会话,所以我更喜欢使用上面的表格并从该表格中获取信息。好的,我提供的查询并不复杂,因此可以为此设置第二个 ActiveTable。但是当有更复杂的表时会发生什么?有一个单独的临时表的选项是一个好主意吗?如果是,我是否必须每分钟锁定表以进行更新!?感谢先进
  • 是的,当然可以有一个临时表 - 您是否在考虑全局临时表 (##) 之类的东西?您不必显式锁定它,SQL Server 会这样做,但是您想在哪里每分钟重新创建整个表?这肯定比我的建议更深入?
  • 我不知道! :) 你知道得更好,因为我在这方面的经验非常低。我绝对想让上面的 Sessions 表是最新的,所以我宁愿没有另一个在线用户表。此选项需要对每个用户活动进行 2 次查询
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-29
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多