1

是否可以对来自的两个值求和COUNT(DISTINCT [something]) ?我有一张表,里面有近 4 亿条记录。该表根据用户访问而增加,现在我想COUNT(DISTINCT [SpecialUser])根据正常查询获得基础,大约需要 5-6 分钟才能给出查询答案。现在我在想,如果有可能:

保存昨天的答案COUNT(DISTINCT [SpecialUser]),命名total,然后与今天的结果相加以提高查询速度?我知道由于 Distinct 以正常方式不可能,但是还有其他解决方案吗?

作为参考,这里是完整的查询:

DECLARE @Total_User int 

SELECT @Total_User = COUNT(DISTINCT [SpecialUser]) 
FROM [dbo].[Visit] AS V 
WHERE 
  LEN([SpecialUser]) > 1 

UPDATE [dbo].[Stat] 
SET Total_User=@Total_User 
WHERE ID = 1;
4

2 回答 2

1

显然,您的问题在于数据库模式/表结构。

我相信每次发生用户访问时,都会在表中添加一条新记录。但是,您必须获取所有不同的SpecialUser字段,这是与表中不同类型的信息。

解决方案是将该信息写入另一个表(或使用您已经拥有的表)。该表应该已经具有唯一键控的那些不同值。

但是,如果由于...而现在无法做到这一点,那么我现在记得的最佳解决方案(以及避免臭名昭著的 varchar-indexes 的解决方案)是将计算列添加到表中,将其持久化,对其进行索引并使用它在您的查询中。

它应该看起来像这样:

IsSpecialUser = CASE WHEN LEN([SpecialUser]) > 1 THEN 1 ELSE 0 END

完整的 DDL:

ALTER TABLE dbo.Visit 
ADD IsSpecialUser AS (CASE WHEN LEN([SpecialUser]) > 1 THEN 1 ELSE 0 END) PERSISTED
GO

之后,在dbo.Visit.IsSpecialUser. 您的查询应如下所示:

SELECT @Total_User = COUNT(DISTINCT [SpecialUser]) 
FROM [dbo].[Visit] AS V 
WHERE IsSpecialUser = 1
于 2013-08-11T08:30:35.733 回答
0

将不同日期的值存储在不同的表中。否则,它总是大约需要您所说的时间。

它可能会进行一些优化,但从 5-6 分钟不会下降太多。我假设您需要比这更快的东西。如果您不习惯将数字存储在数据库中,您可以尝试使用查询缓存之类的东西。

底线:你不能加速 sql 内置函数。

希望有帮助:)

于 2013-08-11T07:01:17.577 回答