SQL Server 2008 - 同时进行多个导入过程

时间:2011-08-17 16:43:24

标签: database performance sql-server-2008 import

我有一个场景,其中多个用户将执行导入过程,但所有用户都将为不同的客户端工作。

我有一个核心表,无论何时运行导入进程,它都会获得最多的匹配。我现在有两个选择

  1. 拥有一个核心表并通过为导入进程创建队列来执行顺序导入。
  2. 要拥有300个核心表,每个客户端一个,它将允许用户同时处理导入过程而无需相互等待。
  3. 任何人都可以建议哪一个更好,为什么?


    这次我更详细地提出了我的要求。您是否可以在完成要求后再次查看并提供您的意见。

    该查询涉及我的应用程序核心功能的数据建模。

    我有一个场景,多个用户将执行导入过程,但所有用户都将为不同的客户端工作。此外,同时客户端的数据可以显示给用户,也可以修改/插入,同时正在处理相同或不同客户端的导入过程。

    我有2个核心表,每当导入进程运行时都会获得最多的匹配。

    我现在有两个选择 1.拥有2个核心表,并通过为导入过程创建队列来执行顺序导入。

    表1

    ID 客户端ID 的SourceID 计数 AnotherCol1 AnotherCol2 AnotherCol3

    表2

    ID 客户端ID 订单ID 计数 AnotherCol4 AnotherCol5 AnotherCol6

    1. 要拥有1000个核心表,每个客户端2个(我可能最多有500个客户端),它将允许用户同时处理导入过程而无需相互等待。
    2. 有关导入过程的更多信息: 1.这些表不会在任何报告中使用。 2.每个导入过程将在每个表中插入20k-30k记录(7列)。一天将有大约40-50个这样的进口。 3.在导入过程中,可以由其他一些用户从这些表中检索数据,也可以INSERT OR UPDATED。 这些将成为应用程序中最可用的表之一。 5. BULK INSERT将用于插入。 6.聚簇索引位于主键上,该主键是标识列。 7.我们也在考虑表格分区。

      您能否建议哪个选项更好?为什么?

      此外,如果您建议使用选项2,那么在数据库中创建如此多的表不会影响性能吗?在这种情况下,我们应该为这1000个表创建一个单独的数据库吗?


      这次我更详细地提出了我的要求。您是否可以在完成要求后再次查看并提供您的意见。

      该查询涉及我的应用程序核心功能的数据建模。

      我有一个场景,多个用户将执行导入过程,但所有用户都将为不同的客户端工作。此外,同时客户端的数据可以显示给用户,也可以修改/插入,同时正在处理相同或不同客户端的导入过程。

      我有2个核心表,每当导入进程运行时都会获得最多的匹配。

      我现在有两个选择 1.拥有2个核心表,并通过为导入过程创建队列来执行顺序导入。

      表1

      ID 客户端ID 的SourceID 计数 AnotherCol1 AnotherCol2 AnotherCol3

      表2

      ID 客户端ID 订单ID 计数 AnotherCol4 AnotherCol5 AnotherCol6

      1. 要拥有1000个核心表,每个客户端2个(我可能最多有500个客户端),它将允许用户同时处理导入过程而无需相互等待。
      2. 有关导入过程的更多信息: 1.这些表不会在任何报告中使用。 2.每个导入过程将在每个表中插入20k-30k记录(7列)。一天将有大约40-50个这样的进口。 3.在导入过程中,可以由其他一些用户从这些表中检索数据,也可以INSERT OR UPDATED。 这些将成为应用程序中最可用的表之一。 5. BULK INSERT将用于插入。 6.聚簇索引位于主键上,该主键是标识列。 7.我们也在考虑表格分区。

        您能否建议哪个选项更好?为什么?

        此外,如果您建议使用选项2,那么在数据库中创建如此多的表不会影响性能吗?在这种情况下,我们应该为这1000个表创建一个单独的数据库吗?

2 个答案:

答案 0 :(得分:3)

这并不是一个确定答案的问题,因为每个人都有自己的利弊。

场景1:中央核心表

  • 优点:中心表,简单的全局修改
  • 缺点:导入较慢,客户级修改较困难

场景2:300个核心表

  • 优点:更快的导入,轻松的客户定制
  • 缺点:针对所有300个核心表更难部署更改,需要触及所有表的报告将更复杂,并且可能更慢

最后答案是真正适合你的

答案 1 :(得分:2)

另一种选择是第三种情况,你有一个表,但是你仍然可以通过在表中使用批处理标识符来并行进行导入,这会阻止人们互相踩踏。

在同一个表中拥有多个人的主要问题是你不能做像TRUNCATE这样的事情。

对我而言,决定将与数据最终的位置有关。这只是一个方便的临时表,因为在加载后会有一些用于转换或查找的SQL运行吗?是否可以在单独的数据库或模式中创建这样的表,并使用唯一的名称来清除它们,而不会干扰或膨胀主数据库中的事务日志>您是否需要批量插入,然后应用索引并最终删除表?如果您使用SSIS加载数据,这样的表甚至是必需的,您通常可以在管道中做很多工作而不需要临时表吗?

所有这些都会影响我在架构上的决策过程。