1

我有一个客户端门户项目(我开发的第一个项目,所以基本的最佳实践就是我在这里寻找的,没什么特别的)即将发布。

报告中使用的主要记录类型的简化如下:

CREATE TABLE [dbo].[conversions](
    [conversion_id] [nvarchar](128) primary key NOT NULL,
    [click_id] [int] NULL,
    [conversion_date] [datetime] NOT NULL,
    [last_updated] [datetime] NULL,
    [click_date] [datetime] NULL,
    [affiliate_affiliate_id] [int] NOT NULL,
    [advertiser_advertiser_id] [int] NOT NULL,
    [offer_offer_id] [int] NOT NULL,
    [creative_creative_id] [int] NOT NULL,
    [conversion_type] [nvarchar](max) NULL)

CREATE TABLE [dbo].[clicks](
    [click_id] [int] primary key NOT NULL,
    [click_date] [datetime] NOT NULL,
    [affiliate_affiliate_id] [int] NOT NULL,
    [advertiser_advertiser_id] [int] NOT NULL,
    [offer_offer_id] [int] NOT NULL,
    [campaign_id] [int] NOT NULL,
    [creative_creative_id] [int] NOT NULL,
    [ip_address] [nvarchar](max) NULL,
    [user_agent] [nvarchar](max) NULL,
    [referrer_url] [nvarchar](max) NULL,
    [region_region_code] [nvarchar](max) NULL,
    [total_clicks] [int] NOT NULL)

我的具体问题是:鉴于每个表中有数百万行,如果您知道可以请求的所有可能报告,那么使用什么机制来按需快速提供摘要报告?

起点,性能方面,为最繁忙的客户对价值 18 个月的数据进行原始查询在我的仪表板上产生 3 到 5 秒的延迟,最坏的情况是具有自定义日期范围的摘要报告超过 10 秒跨越所有行。

我知道我可以在第一次点击后缓存它们,但我希望在第一次点击时表现出色。

我的感觉是这是这种性质的应用程序的一个基本方面,并且有大量这样的应用程序,那么是否有一种已经深思熟虑的方法来预先计算已经进行分组和聚合的表?那么如何让它们保持最新状态?您是否使用预先强制计算的 SQL 代理和自定义控制台应用程序?

任何一般的指针将不胜感激..

4

1 回答 1

3

两张表都是时间序列。它们似乎被一个 ID 列聚集在一起,对于如何查询时间序列几乎没有价值。时间序列几乎总是按日期范围查询,因此您的集群组织首先应该为此类查询提供服务:按日期集群,将 ID 主键约束移动到非集群中。

CREATE TABLE [dbo].[conversions](
    [conversion_id] [nvarchar](128) NOT NULL,
    [conversion_date] [datetime] NOT NULL,
    ...
    constraint pk_conversions nonclustered primary key ([conversion_id]))
go

create clustered index [cdx_conversions] on [dbo].[conversions]([conversion_date]);
go

CREATE TABLE [dbo].[clicks](
    [click_id] [int] NOT NULL,
    [click_date] [datetime] NOT NULL,
    ...
    constraint [pk_clicks] nonclustered [click_id]);
go

create clustered index [cdx_clicks] on [dbo].[clicks]([click_date]);

[click_date]此模型将服务于按范围 on和 on过滤的典型查询[conversion_date]。对于任何其他查询,答案将非常针对您的查询。

对于像您这样的 OLAP/DW 工作负载,关系行组织模型的有用程度是有限的。专业工具在这方面做得更好。列存储索引可以提供惊人的快速响应,但它们很难更新。创建MOLAP 多维数据集也可以提供出色的结果,但这是一项严肃的项目任务。甚至还有专门的时间序列数据库

于 2013-04-24T07:47:19.127 回答