1

我有一个自定义导入工具,可以在 temp 中批量插入数据(421776 行)。之后,该工具将未知行插入到目标表中,并根据散列键(2 列的组合)更新现有行。目标数据库的行数几乎相同。更新查询看起来像这样(大约少了 20 个更新列)

  update targetTable set 
        theDB.dbo.targetTable.code=temp.code,
        theDB.dbo.targetTable.name=temp.name,
  from [tempDB].[dbo].[targettable] as temp 
  where theDB.dbo.targetTable.hash=temp.hash COLLATE SQL_Latin1_General_CP1_CI_AS

我知道 nvarchar 与 collat​​e 比较有点糟糕,但不容易避免。哈希列仍然有它自己的唯一索引。在本地它也运行良好,但在我的这台服务器上,临时数据库不断增长到 21 gig。重新索引和缩小根本不起作用。

对于面临 tempdb 问题的其他人来说,这只是一个旁注。一个很好的阅读是http://bradmcgehee.com/wp-content/uploads/presentations/Optimizing_tempdb_Performance_chicago.pdf

4

3 回答 3

0

您可以暂时将事务日志记录从 Full 或 Bulk 更改为 simple。这将使所有内容都不会被记录以进行回滚。

于 2011-05-03T15:39:01.117 回答
0

看起来您正在将 tempdb 显式用于您放置在那里的数据。是否有理由像使用您自己的数据库一样使用 tempdb?

tempdb 增长的原因是您明确地将数据放在那里。420k 行听起来并不重,但最好将其保留在您自己的用户数据库中。

建议更改您的业务逻辑以从[tempDB].[dbo].[targettable]您自己的用户数据库中转移。

于 2011-05-03T15:39:07.330 回答
0

当没有明确的连接时,这是一个笛卡尔积吗?

于 2011-05-03T15:53:44.380 回答