在数据库导入应用程序中实现最佳性能的核对表

时间:2009-01-12 22:48:12

标签: sql-server database database-design

我正面临一个旨在将大量数据导入Microsoft SQL Server 2000数据库的应用程序。该应用程序似乎需要很长时间才能完成,我怀疑应用程序设计存在缺陷。有人让我深入研究应用程序,找到并修复严重的瓶颈,如果有的话。我希望有一个结构化的方法来完成这项工作,并决定准备一份潜在问题的清单。我有一些SQL数据库的经验,到目前为止已经记下了一些要查找的内容。

但是对于一些外部灵感也会非常有帮助。您是否可以向我指出一些关于良好数据库架构设计和良好数据库应用程序设计的清单上的一些好资源?

我计划制定以下主要主题的清单:

  1. 数据库硬件 - 首先要确定服务器硬件是否合适?
  2. 数据库配置 - 下一步是确保配置数据库以获得最佳性能吗?
  3. 数据库架构 - 数据库架构是否具有声音设计?
  4. 数据库应用程序 - 应用程序是否包含声音算法?

3 个答案:

答案 0 :(得分:1)

我要添加到列表中的三个项目:

  1. 批量插入 - 您是使用批量提供程序(即BCP或SqlBulkCopy)还是通过单独的INSERT / UPDATE语句导入数据?
  2. 索引 - 您的目标表上是否有索引?它们可以在导入之前丢弃,然后在之后重建吗?
  3. 锁定 - 尝试导入数据时是否存在争用?

答案 1 :(得分:1)

良好的开端。以下是推荐的优先事项。

第一原则。除了源文件读取和SQL插入之外,导入应该执行很少或不执行任何处理。其他处理必须在加载之前完成。

  1. 应用程序设计是#1。应用程序是否在尝试加载之前的平面文件上尽可能多地执行操作?这是大型数据仓库负载中的秘诀:离线准备然后批量加载行。

  2. 数据库架构是#2。你有正确的表和正确的索引吗?加载不需要任何索引。大多数情况下,您希望删除并重建索引。

    负载最好不需要任何触发器。触发处理的所有操作都可以脱机完成,以便为加载文件做好准备。

    最好不要将加载作为存储过程。您希望使用Microsoft的简单实用程序来批量加载行。

  3. 配置。很重要,但比模式设计和应用程序设计要少得多。

  4. 硬件。除非你有钱烧,否则你不会走得太远。如果 - 在其他一切之后 - 你可以证明硬件是瓶颈,然后花钱。

答案 2 :(得分:1)

你遗漏了我开始寻找的第一个地方:用于导入数据的技术。

如果应用程序插入单行,是否有原因?它使用DTS或BULK INSERT还是BCP?它是加载到临时表还是带有触发器的表?它是批量加载还是试图加载并提交整个批次?在路上有广泛的转换或数据类型转换吗?是否将数据广泛转换为不同的模式或模型?

我不会担心1和2,直到我看到所使用的ETL技术是否合理,如果他们将数据导入现有模式,那么你将没有太多空间来改变任何与之相关的东西3.关于import和4,我不想在加载部分对数据做很多算法。

为了在大多数情况下获得最佳性能,请加载到具有良好可靠基本类型转换的平面临时表和当时完成的异常(使用SSIS或DTS)。对于非常大的数据(例如,数百万行每日负载),我加载100,000或1,000,000个记录批次(这可以在BCP或SSIS中轻松设置)。任何派生列都是在加载时创建的(SSIS或DTS),或者是在UPDATE之后创建的。运行异常,验证数据并创建约束。然后将数据作为一个或多个事务的一部分操作到最终模式 - 维度或实体的UPDATE,INSERT,DELETE,GROUP BY或其他任何事务。

显然,这有例外,它很大程度上取决于输入数据和模型。例如,在输入中使用EBCDIC打包数据时,在加载阶段没有良好可靠的基本类型转换,因此必须更加复杂和缓慢,因为必须更加显着地处理数据。

使用这种整体方法,我们让SQL做有用的事情,让客户端应用程序(或SSIS)做他们有用的事情。