对于我目前的项目,我们希望提供统计数据并对其进行排名。对于我的情况,我说的是一个艺术家的“Favouriting”,计算一个艺术家的曲目已播放的时间,显示艺术家曲目添加到播放列表中的播放列表的数量...这些都是特定领域的问题,但这是我的问题的具体例子。
主要问题是我将返回为了所有这些统计属性而返回的结果集。
以下是一些例子:
我的第一个想法已经确定我需要一个计算的聚合列。由于我想对这些值进行排序,这意味着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?
答案 0 :(得分:2)
通过普通索引进行扫描类似于连接,因为普通索引包含索引值以及对每个叶中的表块的引用。要提取非索引值,您需要通过此块引用“连接”表。
相反,聚簇索引包含每个叶子的表数据本身,您可以在扫描时获得非索引字段值。
只要您选择5个热门记录,就可以使用普通索引,因为一个表总是更易于管理。
它会比集群索引慢一点,因为这意味着上面描述的“加入”,但它只有5条记录,你几乎不会发现任何差异。
您甚至可以创建统计表:
CREATE TABLE stats (type INTEGER, score INTEGER, artist INTEGER);
CREATE INDEX ix_stats (type, score);
,这将有助于您更轻松地添加新的聚合值。
这里1
的{p> type
可能意味着艺术家有多少时间played
,2
他有多少次favorited
等等。当您需要新聚合时,只需在表中创建一个新类型和INSERT
5个新行,而不是更改其定义。
同样,如果我理解你的任务,我们正在讨论从这个表中选择几十条记录。在这种情况下,可管理性比选择这些前5位艺术家快10毫秒更重要。
答案 1 :(得分:0)
您可以浏览索引视图。 http://technet.microsoft.com/en-us/library/cc917715.aspx
第一点看起来就像你追求的那样。
答案 2 :(得分:0)
你考虑过使用RANK吗?你可能会对表现感到惊讶。