Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 霍桑?你好吗?一个接一个_Sql Server_Optimization_Bigtable - Fatal编程技术网

Sql server 霍桑?你好吗?一个接一个

Sql server 霍桑?你好吗?一个接一个,sql-server,optimization,bigtable,Sql Server,Optimization,Bigtable,但这其中的关键还是索引,不要搞分区之类的事情。。特别是对于一个百万记录,那没什么,我有一个有1.5亿记录的表,返回40k特定记录需要引擎大约1500ms 另一个解决方案是为每年创建一个历史表,将所有这些表放入历史数据库中,填入所有表,然后为它们创建适当的索引。一旦你做完了,你就再也不用碰它们了。为什么您必须不断插入数据?要查询所有这些表,只需“联合所有”它们:p 当前年份表应该与此历史表非常不同。据我所知,您计划在旅途中插入记录?我会计划一些不同的事情,比如时不时地进行批量插入或类似的事情。当然

但这其中的关键还是索引,不要搞分区之类的事情。。特别是对于一个百万记录,那没什么,我有一个有1.5亿记录的表,返回40k特定记录需要引擎大约1500ms

另一个解决方案是为每年创建一个历史表,将所有这些表放入历史数据库中,填入所有表,然后为它们创建适当的索引。一旦你做完了,你就再也不用碰它们了。为什么您必须不断插入数据?要查询所有这些表,只需“联合所有”它们:p

当前年份表应该与此历史表非常不同。据我所知,您计划在旅途中插入记录?我会计划一些不同的事情,比如时不时地进行批量插入或类似的事情。当然,所有这些都取决于你想做什么


这里的问题似乎在设计上。我会选择一种新的设计。据我所知,您现在拥有的那一个并不合适。

您已经提到,您的主键是(股票、日期)上的一个复合键,并且是集群的。这意味着该表是按库存再按日期组织的。每当插入新行时,它都必须将其插入表的中间,这可能会导致其他行被推出到其他页面(页面拆分)

我建议尝试将主键反转为(Date,Stock),并在Stock上添加一个非聚集索引,以便快速查找特定的股票。这将允许插入始终发生在表的末尾(假设您是按日期顺序插入的),并且不会影响表的其余部分,并且页拆分的可能性较小

实际上,主索引是自动聚集的,我把它做成了一个包含股票和日期字段的复合索引。这是唯一的,我不能有两个相同的股票在同一天报价数据

聚集指数确保同一股票的报价保持一致,并且可能按日期排序。这第二个信息是真的吗

SQL Server中的索引始终按索引中的列顺序排序。因此,[股票,日期]上的指数将首先按股票排序,然后按日期在股票内排序。[日期,股票]上的指数将首先在日期排序,然后在股票的日期内排序

在执行查询时,应始终在WHERE部分中包含索引的第一列,否则无法有效使用索引

针对您的具体问题:如果股票的日期范围查询是最常见的用法,那么请在[date,stock]上执行主键,这样数据将按日期顺序存储在磁盘上,您应该能够以最快的速度访问。根据需要建立其他索引。插入大量新数据后,执行索引重建/统计信息更新

  • 在100万个记录中,我不认为这是一个特别大的表,需要特殊的优化技术,比如拆分表、去表化等等。但是当你尝试了所有不影响你使用标准查询技术的正常方法时,这些决定就会出现。
  • 现在,第二种优化方法是创建聚集索引。实际上,主索引是自动聚集的,我把它做成了一个包含股票和日期字段的复合索引。这是唯一的,我不能有两个相同的股票在同一天报价数据

    聚集指数确保同一股票的报价保持一致,并且可能按日期排序。这第二个信息是真的吗

    这在逻辑上是正确的——聚集索引定义了磁盘上记录的逻辑顺序,这是您应该关注的全部。SQL Server可能会放弃在物理块中进行排序的开销,但它的行为仍会像这样,因此这并不重要。在任何情况下,查询一只股票可能需要读取1或2页;而且优化器也不会从页面读取中的无序数据中获得太多好处

    目前有50万条记录,从特定资产中选择700条报价大约需要200毫秒。我相信随着表格的增加,这个数字会越来越高

    不一定重要。表大小和查询速度之间没有线性关系。通常有更多更重要的考虑因素。在你描述的范围内,我不会担心。这就是你担心的原因吗?在我看来,200毫秒似乎很棒,足以让您达到加载表的程度,您可以开始进行实际测试,并更好地了解实际性能

    现在,我考虑的第三种方法是将表格分为三个表格,每个表格针对一个特定的市场(股票、期权和远期)。这可能会将表的大小减少1/3。现在,这种方法会有帮助吗?还是没什么大不了的?目前,该表有50mb的大小,因此它可以完全安装在RAM中,而无需太多麻烦

    不!这种优化太早了,可能是死胎

    另一种方法是使用SQLServer的分区功能

    同样的评论。您将能够长期坚持严格逻辑、完全规范化的模式设计

    还有什么好的方法可以使这成为最快的


    最好的第一步是对股票进行聚类。在您查看每秒插入的多个记录之前,插入速度根本不重要-我在这里没有看到任何与该活动相关的内容。这将使您接近最高效率,因为它将高效地读取与股票相关的所有记录,而这似乎是您最常用的索引。任何进一步的优化都需要在测试的基础上完成。

    是的,它已经编制了索引,但我忘记了一个非常重要的点:我仍然在插入数据,这可能会对搜索造成很大影响。我知道它没那么大,但会经常被查询。你有没有分析过它并检查过它 [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