按顺序处理许多统计数据库列

时间:2009-02-06 22:15:58

标签: sql sql-server statistics

对于我目前的项目,我们希望提供统计数据并对其进行排名。对于我的情况,我说的是一个艺术家的“Favouriting”,计算一个艺术家的曲目已播放的时间,显示艺术家曲目添加到播放列表中的播放列表的数量...这些都是特定领域的问题,但这是我的问题的具体例子。

主要问题是我将返回为了所有这些统计属性而返回的结果集。

以下是一些例子:

  • 音乐登陆页面应该显示最受欢迎的前五名艺术家。
  • 音乐登陆页面应显示最多播放的前5首曲目。

我的第一个想法已经确定我需要一个计算的聚合列。由于我想对这些值进行排序,这意味着CLUSTERED INDEX在我想要订购的每个聚合上都是最优的。其次,由于CLUSTERED INDEX列上的DML在插入时不是连续的,因此需要将其作为预定作业。

所以,对于艺术家最喜欢的数据,这里是我提出的DDL。注意到我的T-SQL可能会非常糟糕,但我认为意图很清楚。

CREATE TABLE Stats_ArtistFavourites (
    FavouriteCount INT DEFAULT 0,
    ArtistId INT PRIMARY KEY NONCLUSTERED,
    FOREIGN KEY (ArtistId) REFERENCES Artists
)

CREATED CLUSTERED INDEX IDX_Favourites 
ON Stats_ArtistFavourites (FavouriteCount, ArtistId) DESC

正如您所看到的,我需要为每个要跟踪的统计信息创建一个单独的表,否则我将需要ORDER BY不在CLUSTERED INDEX中的列。这看起来很丑陋的事实让我觉得我错了。

我应该开始考虑集成OLAP(我对OLAP多维数据集的经验很少)吗?或者也许Lucene?

3 个答案:

答案 0 :(得分:2)

通过普通索引进行扫描类似于连接,因为普通索引包含索引值以及对每个叶中的表块的引用。要提取非索引值,您需要通过此块引用“连接”表。

相反,聚簇索引包含每个叶子的表数据本身,您可以在扫描时获得非索引字段值。

只要您选择5个热门记录,就可以使用普通索引,因为一个表总是更易于管理。

它会比集群索引慢一点,因为这意味着上面描述的“加入”,但它只有5条记录,你几乎不会发现任何差异。

您甚至可以创建统计表:

CREATE TABLE stats (type INTEGER, score INTEGER, artist INTEGER);
CREATE INDEX ix_stats (type, score);

,这将有助于您更轻松地添加新的聚合值。

这里1的{​​p> type可能意味着艺术家有多少时间played2他有多少次favorited等等。当您需要新聚合时,只需在表中创建一个新类型和INSERT 5个新行,而不是更改其定义。

同样,如果我理解你的任务,我们正在讨论从这个表中选择几十条记录。在这种情况下,可管理性比选择这些前5位艺术家快10毫秒更重要。

答案 1 :(得分:0)

您可以浏览索引视图。 http://technet.microsoft.com/en-us/library/cc917715.aspx

  • 聚合可以预先计算和 存储在索引中以最小化 查询期间昂贵的计算 执行。
  • 表格可以预先加入 并保存结果数据集。
  • 联接或聚合的组合 可以存储。

第一点看起来就像你追求的那样。

答案 2 :(得分:0)

你考虑过使用RANK吗?你可能会对表现感到惊讶。