1

我正在计划一个管理记录事件数据库的 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。

4

4 回答 4

3

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

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

创建分区表和索引

于 2012-08-15T03:58:27.193 回答
1

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

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

于 2012-08-15T13:49:48.280 回答
0

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

换句话说,没有正确的答案!

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

于 2012-08-15T08:06:51.867 回答
0

我使用 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

我想和有兴趣的人分享这个。这几乎给了你答案......

感谢所有贡献的人!

于 2012-08-16T08:36:38.647 回答