Sql server 霍桑?你好吗?一个接一个
但这其中的关键还是索引,不要搞分区之类的事情。。特别是对于一个百万记录,那没什么,我有一个有1.5亿记录的表,返回40k特定记录需要引擎大约1500ms 另一个解决方案是为每年创建一个历史表,将所有这些表放入历史数据库中,填入所有表,然后为它们创建适当的索引。一旦你做完了,你就再也不用碰它们了。为什么您必须不断插入数据?要查询所有这些表,只需“联合所有”它们:p 当前年份表应该与此历史表非常不同。据我所知,您计划在旅途中插入记录?我会计划一些不同的事情,比如时不时地进行批量插入或类似的事情。当然,所有这些都取决于你想做什么Sql server 霍桑?你好吗?一个接一个,sql-server,optimization,bigtable,Sql Server,Optimization,Bigtable,但这其中的关键还是索引,不要搞分区之类的事情。。特别是对于一个百万记录,那没什么,我有一个有1.5亿记录的表,返回40k特定记录需要引擎大约1500ms 另一个解决方案是为每年创建一个历史表,将所有这些表放入历史数据库中,填入所有表,然后为它们创建适当的索引。一旦你做完了,你就再也不用碰它们了。为什么您必须不断插入数据?要查询所有这些表,只需“联合所有”它们:p 当前年份表应该与此历史表非常不同。据我所知,您计划在旅途中插入记录?我会计划一些不同的事情,比如时不时地进行批量插入或类似的事情。当然
这里的问题似乎在设计上。我会选择一种新的设计。据我所知,您现在拥有的那一个并不合适。您已经提到,您的主键是(股票、日期)上的一个复合键,并且是集群的。这意味着该表是按库存再按日期组织的。每当插入新行时,它都必须将其插入表的中间,这可能会导致其他行被推出到其他页面(页面拆分) 我建议尝试将主键反转为(Date,Stock),并在Stock上添加一个非聚集索引,以便快速查找特定的股票。这将允许插入始终发生在表的末尾(假设您是按日期顺序插入的),并且不会影响表的其余部分,并且页拆分的可能性较小 实际上,主索引是自动聚集的,我把它做成了一个包含股票和日期字段的复合索引。这是唯一的,我不能有两个相同的股票在同一天报价数据 聚集指数确保同一股票的报价保持一致,并且可能按日期排序。这第二个信息是真的吗 SQL Server中的索引始终按索引中的列顺序排序。因此,[股票,日期]上的指数将首先按股票排序,然后按日期在股票内排序。[日期,股票]上的指数将首先在日期排序,然后在股票的日期内排序 在执行查询时,应始终在WHERE部分中包含索引的第一列,否则无法有效使用索引 针对您的具体问题:如果股票的日期范围查询是最常见的用法,那么请在[date,stock]上执行主键,这样数据将按日期顺序存储在磁盘上,您应该能够以最快的速度访问。根据需要建立其他索引。插入大量新数据后,执行索引重建/统计信息更新
最好的第一步是对股票进行聚类。在您查看每秒插入的多个记录之前,插入速度根本不重要-我在这里没有看到任何与该活动相关的内容。这将使您接近最高效率,因为它将高效地读取与股票相关的所有记录,而这似乎是您最常用的索引。任何进一步的优化都需要在测试的基础上完成。是的,它已经编制了索引,但我忘记了一个非常重要的点:我仍然在插入数据,这可能会对搜索造成很大影响。我知道它没那么大,但会经常被查询。你有没有分析过它并检查过它 [Stock] [int] NOT NULL [Date] [smalldatetime] NOT NULL [Open] [smallmoney] NOT NULL [High] [smallmoney] NOT NULL [Low] [smallmoney] NOT NULL [Close] [smallmoney] NOT NULL [Trades] [int] NOT NULL [Quantity] [bigint] NOT NULL [Volume] [money] NOT NULL