AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 12789
Accepted
Contango
Contango
Asked: 2011-05-28 00:19:45 +0800 CST2011-05-28 00:19:45 +0800 CST 2011-05-28 00:19:45 +0800 CST

为 SQL Server 2008 R2 设置分片以处理大型数据集的模式?

  • 772

我想在 SQL Server 2008 R2 中处理一个大型数据集(> 10 亿行)。我听说如果您设置“分片”或“水平分区”,它可以更快地处理大型数据集,因为它将表分成多个文件。

您以前使用过分片或水平分区吗?如果是这样,您能否建议任何模式,根据您的经验,与单个大型表相比,可以实现更好的结果?

sql-server sql-server-2008
  • 1 1 个回答
  • 3824 Views

1 个回答

  • Voted
  1. Best Answer
    ConcernedOfTunbridgeWells
    2011-05-28T00:23:08+08:002011-05-28T00:23:08+08:00

    首先,请注意,在普通商品服务器硬件上使用分区架构可以有效处理 10 亿行。对于这个数据卷,Exotic shared nothing 架构不是必需的,但是,您可能会从表分区中获得显着的好处。

    分片与水平分区不同,它意味着“无共享”架构,大多数版本的 SQL Server 1都不支持

    SQL Server 可以支持水平分区,共享磁盘体系结构足以容纳约 10 亿行。

    在 SQL Server 中,您创建一个分区函数,根据表上列中的值或值范围选择分区,例如

    create partition function F_AccPrdPart (int)
        as range left for values (
        180001                         -- Dummy value
       ,199012 ,199112 ,199212 ,199312, 199412 ,199512
       ,199612 ,199712 ,199812 ,199912 ,200012 ,200112
       ,200212 ,200312 ,200412 ,200512 ,200612 ,200712
       ,200812
       ,200901, 200902, 200903, 200904, 200905, 200906
       ,200907, 200908, 200909, 200910, 200911, 200912
       ,201001, 201002, 201003, 201004, 201005, 201006
       ,201007, 201008, 201009, 201010, 201011, 201012
       ,201101, 201102, 201103, 201104, 201105, 201106
       ,201107, 201108, 201109, 201110, 201111, 201112
       ,202012
       ,939999                         -- Dummy value
    )
    go
    

    然后创建一个或多个文件组来分配分区。对于大型数据集,这些文件组可以设置在不同的物理卷上。请注意,在几乎所有情况下,直接附加存储都比 SAN 快得多。在下面的示例中,我们将创建 6 个名为 PartVol1-PartVol6 的文件组。

    可以创建一个或多个分区方案来根据分区函数的值将表分区分配给文件组,例如

    create partition S_AccPrdPart as partition F_AccPrdPart
        TO ([PRIMARY]
          ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6] 
          ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
          ,[PartVol1], [PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6]
          ,[PartVol1]
          ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
          ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
          ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
          ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
          ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
          ,[PartVol2], [PartVol3], [PartVol4], [PartVol5], [PartVol6], [PartVol1]
          ,[PartVol2]
          ,[PRIMARY]
          ,[PRIMARY])
    go
    

    该方案旨在按会计期间进行分区。尽管可以使用任何键,但日期也经常用于此目的。

    您可以在分区方案上创建一个表,就好像它是一个文件组一样,例如

    Create table FooTrans (
           FooTransID        int identity (1,1) not null
          ,AccPeriod         int not null
          ,[...]
    ) on S_AccPrdPart (AccPeriod)
    go
    

    请注意,表是在分区方案而不是指定的文件组上创建的,并且子句指定要用作分区键的列。根据分区键,表中的行将分配给分区方案中的文件组之一。

    注意:设计分区方案的一个经验法则是,每个分区的行数应该在数百万的低位,比如在 10 到 5000 万之间,具体取决于行的宽度。分区所在的磁盘卷应该足够快,可以在几秒钟内扫描至少一个分区。

    分区、分片和无共享系统

    一些术语似乎是为了消除关于这个主题的一些讨论的歧义。

    • “无共享”系统是一个并行系统,其中节点没有共享 SAN 存储,但使用节点本地的存储。这种架构的典型例子是 Teradata。无共享系统可以很好地扩展到非常大的数据集,因为它们没有中央 I/O 瓶颈。I/O 吞吐量随系统中节点的数量而变化。

    • “共享磁盘”系统是一个或多个数据库服务器共享单个磁盘存储子系统的系统。数据库可以是具有本地存储或连接到 SAN 的单个服务器,也可以是连接到共享 SAN 的服务器集群。这种类型的系统受到存储子系统可用吞吐量的限制。

    • “分片”是一个术语,用于描述在无共享架构中的多个物理服务器之间拆分数据库。各种平台将对分片数据库提供或多或少的支持。在 Teradata 圈子中,未使用该术语,因为 Teradata 向客户端呈现透明的单一系统映像,即使物理架构是无共享类型。

      旧版本的 SQL Server 对通过分布式分区视图进行分片的支持有限。Microsoft 现在制作了一个 SQL Server 2008 R2 版本,该版本支持具有单个系统映像的无共享架构,但此版本仅适用于 OEM,并且只能以硬件捆绑包的形式购买。

    对于 10 亿行

    对于 10 亿行(除非个别行非常宽),无共享或分片架构在矫枉过正的领域中是很舒服的。如果具有足够快的磁盘子系统,则可以在具有合理规格的单个服务器上处理这种类型的卷。

    就性能价格而言,本地直接连接磁盘是迄今为止最具成本效益的。单个 SAS RAID 控制器可以带多个阵列,并且可以在服务器中安装多个控制器。根据配置,现代 24-25 插槽 SAS 阵列可以提供数千 IOPS 或 1GB+/秒的流传输性能;具有多个 PCI-e 总线和多个控制器的服务器理论上可以处理更多。

    使用商用服务器硬件和这种类型的直连存储可以很容易且廉价地实现使用 10 亿行数据库所需的性能类型。也可以使用 SAN,但您可能需要多个 SAN 控制器才能获得同等性能,而且硬件可能要贵一个数量级。

    作为一般建议,除非您需要非常好的正常运行时间,否则对 I/O 要求较高的应用程序使用直接附加存储。与现代数据中心运营中的硬件故障相比,配置和变更控制错误是造成计划外停机的更大原因。

    如果您拥有大量应用程序组合,SAN 可以为您提供更易于管理的存储平台,因为它们为您提供了一系列集中式存储管理设施。然而,这需要付出高昂的代价,并且从基于 SAN 的基础架构中获得高性能既困难又昂贵。

    1 Microsoft 确实制作了 SQL Server 的并行版本,但它只能通过与硬件捆绑的 OEM 渠道获得。现成的版本不支持此功能。

    • 23

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 是否有开发人员遵循数据库更改的“最佳实践”类型流程?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    您如何显示在 Oracle 数据库上执行的 SQL?

    • 2 个回答
  • Marko Smith

    如何选择每组的第一行?

    • 6 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    我可以查看在 SQL Server 数据库上运行的历史查询吗?

    • 6 个回答
  • Marko Smith

    如何在 PostgreSQL 中使用 currval() 来获取最后插入的 id?

    • 10 个回答
  • Marko Smith

    如何在 Mac OS X 上运行 psql?

    • 11 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Marko Smith

    将数组参数传递给存储过程

    • 12 个回答
  • Martin Hope
    Manuel Leduc PostgreSQL 多列唯一约束和 NULL 值 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler 什么时候应该将主键声明为非聚集的? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta 使用 psql 列出数据库权限 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - 哪个更好作为主键? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k 什么时候应该使用唯一约束而不是唯一索引? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick 如何优化大型数据库的 mysqldump? 2011-01-04 13:13:48 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve