我正在将巴西股市数据导入 SQL Server 数据库。现在我有一张表格,其中包含三种资产的价格信息:股票、期权和远期。我还在 2006 年的数据中,该表有超过 50 万条记录。我有更多 12 年的数据要导入,因此该表肯定会超过一百万条记录。
现在,我的第一种优化方法是将数据保持在最小大小,因此我将行大小减少到平均 60 字节,并包含以下列:
[股票] [int] 非空 [日期] [smalldatetime] 非空 [打开] [smallmoney] 非空 [高] [smallmoney] 非空 [低] [smallmoney] 非空 [关闭] [smallmoney] 非空 [交易] [int] 非空 [数量] [bigint] 非空 [数量] [钱] NOT NULL
现在,第二种优化方法是创建一个聚集索引。实际上主索引是自动聚集的,我把它做成了一个包含 Stock 和 Date 字段的复合索引。这是独一无二的,我不能在同一天拥有同一股票的两个报价数据。
聚集索引确保来自同一股票的报价保持在一起,并且可能按日期排序。第二个信息是真的吗?
现在有 50 万条记录,从特定资产中选择700条报价大约需要 200毫秒。我相信随着桌子的增长,这个数字会越来越高。
现在对于第三种方法,我正在考虑将表格分成三个表格,每个表格用于特定市场(股票、期权和远期)。这可能会将表格大小减少 1/3。现在,这种方法会有所帮助还是无关紧要?现在,该表的大小为 50mb,因此它可以完全放入 RAM 中而没有太多麻烦。
另一种方法是使用 SQL Server 的分区功能。我对此了解不多,但我认为它通常在表很大并且您可以跨越多个磁盘以减少 I/O 延迟时使用,对吗?在这种情况下,分区会有所帮助吗?我相信我可以对不同表中的最新值(最近年份)和最旧值进行分区,寻找最新数据的概率更高,并且使用小分区可能会更快,对吧?
还有什么其他的好方法可以使这个过程尽可能快?该表的主要选择用途是从特定资产中查找特定范围的记录,例如资产 X 的最近 3 个月。还有其他用途,但这将是最常见的,可能执行超过 3k用户同时。