【问题标题】:Seeking advice on how to structure the SQL Server 2008 DB table with large amount of data?寻求有关如何构建包含大量数据的 SQL Server 2008 DB 表的建议?
【发布时间】:2012-08-15 03:55:59
【问题描述】:

我正在计划一个管理记录事件数据库的 Web 应用程序(使用 ASP.NET 编程)。该数据库将在 SQL Server 2008 中进行管理。每个事件可能来自一组(我们称它们为“单元”)。用户将能够通过 ASP.NET 界面添加和删除这些“单元”。

每个“单元”可能记录多达一百万个条目,甚至更多。 (截止日期将通过日期进行管理。例如:

DELETE FROM [tbl] WHERE [date] < '01-01-2011'

我的问题是构建此类数据库的最佳方式是什么:

  1. 通过将所有“单位”的所有条目放在一个表中,如下所示:

    CREATE TABLE tblLogCommon (id INT PRIMARY INDEX, 
                               idUnit INT, 
                               dtIn DATETIME2, dtOut DATETIME2, etc INT)
    
  2. 或者,通过为每个“单元”分隔表格:

    CREATE TABLE tblLogUnit_1 (id INT PRIMARY INDEX, dtIn DATETIME2, dtOut DATETIME2, etc INT)
    CREATE TABLE tblLogUnit_2 (id INT PRIMARY INDEX, dtIn DATETIME2, dtOut DATETIME2, etc INT)
    CREATE TABLE tblLogUnit_3 (id INT PRIMARY INDEX, dtIn DATETIME2, dtOut DATETIME2, etc INT)
    --and so on
    CREATE TABLE tblLogUnit_N (id INT PRIMARY INDEX, dtIn DATETIME2, dtOut DATETIME2, etc INT)
    

从引用条目的角度来看,方法 #1 似乎更简单,因为使用方法 #2 我将不得不处理可变 N 个表(正如我所说的,用户将被允许添加和删除“单元”。)

但是方法 #1 可能会导致以后访问这些日志条目的效率非常低。我必须通过 ASP.NET 接口从这些日志中生成报告。

所以我想在开始编码之前听听您对此的看法?

编辑:我没有意识到表中的列数会有所不同。我的错!一个表的实际列数是 16。

【问题讨论】:

    标签: asp.net sql sql-server tsql


    【解决方案1】:

    我会采用方法 1,因为表格看起来不是很大(宽度方面)并且您可以应用索引来改进搜索/选择。

    除此之外,您还可以查看分区表和索引。

    Creating Partitioned Tables and Indexes

    【讨论】:

    • 谢谢。虽然,实际的桌子在宽度上要宽得多。我没有在这里包括所有列。实际表有 16 列。
    • 这似乎并不过分复杂。也许提供完整的表模式,因为某些列类型可能会影响性能。
    • 我实际上还没有在 SQL Server 中配置它。我在 VS2010 的测试网络应用程序中设置了它。不过,我不确定如何从中获取架构?
    • 我贴了一张来自 VS2010 的实际 DB 表结构的截图。
    • 即便如此,我还是更愿意使用单个表,并可能将表/索引分区视为性能增强。
    【解决方案2】:

    在单独的表中拆分将产生更好的插入和搜索速度。

    对于一个表,不同之处在于 idUnit 上的索引。使用该索引搜索速度将几乎与单独的表一样快(并且您可以跨 idUnits 进行搜索是单个查询)。一个表会受到打击的地方是插入,但这是一个很小的打击。

    【讨论】:

    • 是的,我明白这一切。我现在正在做一些测试,因为我在这里得到了相互矛盾的答案。尽管如此,我还是想弄清楚——每个人都指的是“大”表,但“大”表是什么?
    • 这完全取决于你的观点。对于 Facebook 开发者来说,10 亿是很小的。对我来说 10 亿很大,标准 SQL 仍然会处理它(在大多数情况下)。选择 count(*) 需要 2 分钟。在我看来,您正在进行推测性优化,而这只会产生复杂的代码。如果您遇到性能问题,请简单回答 1 个表并进行优化。
    【解决方案3】:

    很大程度上取决于您打算如何使用这些数据。如果您将数据拆分为多个表,您将查询多个表,还是所有查询都在定义的日期范围内。插入和更新数据的频率。

    也就是说,没有正确答案!

    另外,您能否为 SQL 企业提供许可证以使用分区表?

    【讨论】:

      【解决方案4】:

      我使用 SQL Server 2008 Express 对实际数据进行了一些测试,使用本地计算机连接,没有网络延迟。测试的计算机:台式机,Windows 7 Ultimate,64 位,CPU:i7,@2.8GHZ,4 核;内存:8GB;硬盘(操作系统):1TB,260GB 免费。

      首先,所有记录都位于“SINGLE”表中(方法 #1)。所有记录都是用随机数据生成的。处理每个特定“unitID”的复杂 SELECT 语句被尝试了两次(一个接一个),CPU 负载:12% 到 16%,RAM 负载:53% - 62%。结果如下:

      UnitID   NumRecords   Complex_SELECT_Timing
      1        486,810      1m:26s / 1m:13s
      3        1,538,800    1m:13s / 0m:51s
      4        497,860      0m:30s / 0m:24s
      5        497,860      1m:20s / 0m:50s
      

      然后相同的记录被分成四个具有相同结构的表(方法#2)。然后,我在同一台 PC 上以相同的 CPU 和 RAM 负载运行了两次 相同的 SELECT 语句。接下来是结果:

      Table   NumRecords   Complex_SELECT_Timing
      t1       486,810      0m:19s / 0m:12s
      t3       1,538,800    0m:42s / 0m:38s
      t4       497,860      0m:03s / 0m:01s
      t5       497,860      0m:15s / 0m:12s
      

      我想与感兴趣的人分享这个。这几乎可以为您提供答案...

      感谢所有贡献的人!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多