- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
假设您有一个包含三列的大型表格,如下所示:
[id] INT NOT NULL,
[date] SMALLDATETIME NOT NULL,
[sales] FLOAT NULL
同时假设您仅限于一个物理磁盘和一个文件组 (PRIMARY)。您希望此表包含 10,000,000 多个 ID、跨越 100 个日期(很容易 1B+ 记录)的销售额。
与许多数据仓库场景一样,数据通常会按日期顺序增长(即,每次执行数据加载时,您都会插入新日期,并且可能会更新一些较新日期的数据)。出于分析目的,数据通常会被查询和聚合,以获得大约 10,000 个 id 的随机集合,这些 id 将通过与另一个表的连接指定。通常,这些查询不指定日期范围,或者指定非常宽的日期范围,这引出了我的问题:索引/分区此表的最佳方法是什么?
我已经考虑了一段时间,但一直坚持使用相互矛盾的解决方案:
选项 #1: 由于数据将按日期顺序加载,因此将聚簇索引(和主键)定义为 [date]、[id]。还创建一个“滑动窗口”分区函数/日期方案,允许新数据快速移入/移出表。可能会在 id 上创建一个非聚集索引以帮助查询。
预期结果#1:此设置对于数据加载目的来说非常快,但在分析读取方面不是最佳的,因为在最坏的情况下(不受日期限制,不幸的是查询一组id),可能会读取100%的数据页。
选项#2:由于一次只会查询一小部分 ID 数据,因此将聚簇索引(和主键)定义为 [id]、[date]。不必费心创建分区表。
预期结果 2:由于我们无法再按日期快速限制,因此在加载数据时预期会出现巨大的性能下降。当涉及到我的分析查询时,预期会带来巨大的性能优势,因为它将最大限度地减少读取的数据页数。
选项 #3: 集群(和主键)如下:[id]、[date]; “滑动窗口”分区函数/方案日期。
预期结果 #3: 不确定会发生什么。鉴于聚集索引中的第一列是 [id],因此(据我所知)数据是按 ID 排列的,我希望我的分析查询具有良好的性能。但是,数据按日期分区,这与聚集索引的定义相反(但仍然对齐,因为日期是索引的一部分)。我还没有找到很多文档来说明这种情况以及我可以从中获得什么性能优势(如果有的话),这让我想到了最后一个奖金问题:
如果我在一个磁盘上的一个文件组上创建一个表,在一列上有一个聚集索引,那么在同一列上定义一个分区是否有任何好处(除了加载数据时的分区切换)?
最佳答案
这张 table 非常窄。如果真正的表这么窄,您应该乐于使用表扫描而不是索引->查找。
我会这样做:
CREATE TABLE Narrow
(
[id] INT NOT NULL,
[date] SMALLDATETIME NOT NULL,
[sales] FLOAT NULL,
PRIMARY KEY(id, date) --EDIT, just noticed your id is not unique.
)
CREATE INDEX CoveringNarrow ON Narrow(date, id, sales)
这会处理带有搜索的点查询和根据日期条件和 ID 条件进行有限扫描的大范围查询。索引中没有每条记录的查找。是的,我已经将写入时间(和使用的空间)增加了一倍,但没关系,imo。
如果需要特定的数据片段(并且这种需要通过分析来证明!!),我会针对表的该部分创建一个集群 View 。
CREATE VIEW Narrow200801
AS
SELECT * FROM Narrow WHERE '2008-01-01' <= [date] AND [date] < '2008-02-01'
--There is some command that I don't have at my finger tips to make this a clustered view.
聚簇 View 可以按名称在查询中使用,或者优化器会在 FROM 和 WHERE 子句合适时选择使用聚簇 View 。例如,此查询将使用集群 View 。请注意,查询中引用了基表。
SELECT SUM(sales) FROM Narrow WHERE '2008-01-01' <= [date] AND [date] < '2008-02-01'
索引让您可以方便地访问特定列...集群 View 让您可以方便地访问特定行。
关于SQL Server - 分区表与聚集索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/120731/
我想沿着一个轴从特定位置的X数组中分散并收集元素。 因此,给定一个索引数组idx,我想选择第0列的idx(0) th元素,第1列的idx(1) th元素,等等。 在Numpy中,以下语句: X = n
我有一个在集群硬件中运行的 Java 应用程序。我使用 Hashmap 作为缓存。我也希望缓存能够集群。有没有一些开源java项目可以在两台连接的机器上同步Hashmap? 最佳答案 看看 Hazel
这个问题在这里已经有了答案: Count number of times that an item occurred in each of multiple columns (4 个答案) 关闭 5
我一直在尝试“组合”一个列表 I mean putting items together depending on the item inbetween, so ['d','-','g','p','q
非聚集文件存储在数据文件中,聚集索引按逻辑索引顺序存储数据。 逻辑顺序位于哪里? 最佳答案 大多数 MySQL 索引的结构为 BTree。 (参见维基百科) (我在此讨论中排除了 FULLTEXT 和
所有源和目标都位于不可缓存的内存中。毫无疑问。在启动 DMA(即分散-聚集 DMA)之前,我构建了 DMA 链表(包含 src、dest、size 和 next)。我想我不必将列表放入不可缓存的内存中
我需要将输入字符串拆分为输出字符串(按一定顺序)通过在输入字符串上应用一组正则表达式。我想实现这个功能与 akka Actor 集群一起使用,我将其分散正则表达式和输入字符串并收集字符串。不过我想知道
Windows 文件系统支持scatter/gather IO .(当然,其他平台也可以) 但是不知道什么时候用IO机制。 你能给我解释一个合适的案例吗? 使用I/O机制我们能得到什么好处?(只是一点
我正在尝试使用克隆调用两个端点并收集它们的信息以通过聚合发送,我必须将其与分散收集中介器一起使用。每个端点返回一个 json 字符串。但我一直遇到“期望 SOAP Envelope 的实现作为父级”错
我想要实现的目标是使用户空间中的内存块可以通过 PCIe 直接由 FPGA 板中的 DMA 内核访问(不受内核的任何干扰)。 为此,我在用户空间中使用 posix_memalign() 在用户空间中分
假设我有以下数据框: > a a Source: local data frame [3 x 2] my_type_1_num_widgets my_type_2_num_widgets 1
我已经搜索了一段时间,但似乎无法在文档或 SO 上找到任何有用的信息。 This question并没有真正帮助我,因为它引用了修改程序集,而我正在用 C 语言编写。 我有一些代码进行间接访问,我想对
我已经坚持了一段时间了。我的代码基于 https://webrtc.org/getting-started/firebase-rtc-codelab .我基本上只是将其更改为 React 和 fire
我可以合并 Mono> 的列表吗?数据源整合为单个Mono>包含所有项目而不阻塞? 在我的带有 Lombok 分散收集应用程序的 JDK 9 Spring Boot 2 中,此阻塞版本有效:
我是一名优秀的程序员,十分优秀!