【问题标题】:SQL Server process each row in table - Cursor or While loopSQL Server 处理表中的每一行 - 游标或 While 循环
【发布时间】:2014-06-02 19:41:23
【问题描述】:

我正在使用 xp_dirtree. 将目录中的所有文件名转储到临时表中

CREATE TABLE #TempTable (Subdirectory VARCHAR(512), Depth INT, xFile INT);

INSERT INTO #TempTable (Subdirectory, Depth, xFile)
   EXEC xp_dirtree 'D:\log\Day_20140301',0,1

SELECT Subdirectory AS Filename 
FROM #TempTable 
WHERE subdirectory LIKE '%.log';

SELECT * FROM #TempTable

我使用此表中的每个文件名进行批量插入。

游标好还是while循环好?

目前使用while循环来循环遍历每条记录。

听到很多关于光标的负面消息。接受所有相同的建议。

【问题讨论】:

  • while 循环只是变相的光标......但在这种情况下,我真的看不到任何其他解决方案。无法以基于集合的方式执行此操作 - 您需要逐行执行循环并为每个文件执行批量插入。
  • 是的。使用游标会有所不同还是性能相同?该目录每天有大约 300-400 个文件。
  • 这两种方法将具有相似的性能特征,在 while 循环上使用光标不会有显着改善 ....
  • 您能否完全放弃游标方法,并为您打算收集的所有日志文件创建一个主日志文件?然后从那里插入一个。我认为您可以利用高级语言来执行文件的 IO 组合,然后像您所拥有的那样使用简单的 SQL 语句进行批量插入。甚至可能是 CLR?
  • 当人们在性能问题时问为什么会有游标时,这就是答案,在基于集合的解决方案不可用的情况下执行这类任务。

标签: sql sql-server tsql


【解决方案1】:

在这种情况下,“无所谓”可能是正确的答案。与批量插入使用的 IO 延迟和 CPU 相比,或者将光标悬停在 1k 条记录上几乎不会花费您任何费用。我想,优化加载的文件结构和相应的表应该是带头的。

【讨论】:

    猜你喜欢
    • 2020-08-26
    • 1970-01-01
    • 2015-03-11
    • 2020-03-01
    • 2023-03-10
    • 2023-03-24
    • 2019-09-25
    • 2017-06-29
    • 1970-01-01
    相关资源
    最近更新 更多