当前位置:  开发笔记 > 数据库 > 正文

您在SQL Server上优化大表(+ 1M行)的方法是什么?

如何解决《您在SQLServer上优化大表(+1M行)的方法是什么?》经验,为你挑选了2个好方法。

我正在将巴西股票市场数据导入SQL Server数据库.现在我有一张表格,其中包含三种资产的价格信息:股票,期权和远期合约.我仍然在2006年的数据,该表有超过50万的记录.我有更多12年的数据需要导入,因此该表肯定会超过一百万条记录.

现在,我的第一种优化方法是将数据保持在最小值,因此我将行大小减少到平均60字节,并使用以下列:

[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

现在,第二种优化方法是制作聚簇索引.实际上主要索引是自动clusted的,我用Stock和Date字段作为复合索引.这是独一无二的,我不能在同一天为同一股票提供两个报价数据.

clusted index确保来自同一股票的报价保持在一起,并且可能按日期排序.这第二个信息是真的吗?

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

现在对于第三种方法,我正在考虑将表格分成三个表格,每个表格针对特定市场(股票,期权和远期).这可能会将表格大小减少1/3.现在,这种方法有用还是无关紧要?现在这个表有50mb的大小,所以它可以完全适合RAM而不会有太多麻烦.

另一种方法是使用SQL Server的分区功能.我不太了解它,但我认为它通常在表很大时使用,你可以跨越多个磁盘来减少I/O延迟,我是对的吗?在这种情况下,分区是否有用?我相信我可以在不同的表中划分最新的值(最近几年)和最旧的值,寻找最新数据的概率更高,而小分区它可能会更快,对吧?

什么是使其尽可能快的其他好方法?该表的主要选择用途是用于从特定资产中寻找特定范围的记录,例如最近3个月的资产X.将会有另一个用法,但这将是最常见的,可能超过3k执行用户同时.



1> dkretz..:

    在100万条记录中,我不认为这是一个特别大的表需要不寻常的优化技术,例如拆分表,非正规化等等.但是当你尝试了所有不影响你的正常方法时,这些决定就会出现.能够使用标准查询技术.

现在,第二种优化方法是制作聚簇索引.实际上主要索引是自动clusted的,我用Stock和Date字段作为复合索引.这是独一无二的,我不能在同一天为同一股票提供两个报价数据.

clusted index确保来自同一股票的报价保持在一起,并且可能按日期排序.这第二个信息是真的吗?

这在逻辑上是正确的 - 聚集索引定义了磁盘上记录的逻辑顺序,这是您应该关注的全部内容.SQL Server可能会放弃在物理块内进行排序的开销,但它仍然会像它一样表现,因此它并不重要.在任何情况下,查询一个库存可能是1或2页读取; 并且优化器不会从页面读取中的无序数据中获益.

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

不一定显着.表大小和查询速度之间没有线性关系.通常有更多的考虑更重要.我不会在你描述的范围内担心它.这是你担心的原因吗?200毫秒在我看来是伟大的,足以让你到你的表加载的地步,你可以开始做真实的测试,并更好地了解现实生活中的表现.

现在对于第三种方法,我正在考虑将表格分成三个表格,每个表格针对特定市场(股票,期权和远期).这可能会将表格大小减少1/3.现在,这种方法有用还是无关紧要?现在这个表有50mb的大小,所以它可以完全适合RAM而不会有太多麻烦.

没有!这种优化是不成熟的,它可能是死产的.

另一种方法是使用SQL Server的分区功能.

同样的评论.您将能够长时间坚持严格的逻辑,完全规范化的架构设计.

什么是使其尽可能快的其他好方法?

最好的第一步是集群库存.在您查看每秒插入的多个记录之前,插入速度根本没有任何影响 - 我在这里看不到任何附近任何活动.这应该让你接近最大效率,因为它将有效地读取与股票相关的每个记录,这似乎是你最常见的指数.需要根据测试完成任何进一步的优化.



2> Jon Skeet..:

百万条记录真的不是那么大.听起来好像搜索时间太长了 - 您要搜索的列是否已编入索引?

与以往一样,第一个调用端口应该是SQL事件探查器和查询计划评估程序.询问SQL Server它会对您感兴趣的查询做些什么.我相信您甚至可以要求它建议更改,例如额外的索引.

我还没有开始进入分区等 - 正如你所说,它现在应该都舒服地坐在内存中,所以我怀疑你的问题更可能是一个缺失的索引.

推荐阅读
mobiledu2402852357
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有