使SQL Server更快地处理数据 - 关闭事务日志记录?

时间:2009-02-21 00:18:15

标签: sql-server sql-server-2005

我使用SQL Server 2005作为数据存储,用于我分析工作的大量数据。这不是一个事务性数据库,因为我没有使用更新或捕获实时数据。我从客户端获取了一些数据,将它们加载到SQL Server中并进行一系列操作。然后我抓住这些数据并将它们拉入R,我将进行大部分分析。然后我将一些数据推送到SQL Server中的表中,也许可以进行一两次连接。

我有一段时间SQL Server中的日志变得越来越大,我认为创建它们需要一定程度的开销。如何配置SQL Server以便它在很少或没有日志记录的情况下运行?如果事情变得腐败,我很高兴从一开始就开始。任何想法如何使这一切更快?

顺便说一句,没必要告诉我如何缩小日志,我已经这样做了。但我希望我不必首先制作原木。我只使用数据库来存放数据,因为它太大而无法容纳到R中的内存中。

我应该使用比Sql Server更简单的数据库吗?随意告诉我,我正用大锤杀死一只蚂蚁。但请推荐一个更合适尺寸的锤子。 :)

6 个答案:

答案 0 :(得分:9)

  

如何配置SQL Server以便在很少或没有日志记录的情况下运行?我

我不相信你能。

但是,如果为简单备份配置数据库(服务器上的每个数据库可能不同),则在备份之前日志文件不会增长。这可以通过将恢复模式设置为“简单”来完成。

通过简单备份,日志仅用于保存事务状态,直到它们完全写入主数据库。

答案 1 :(得分:8)

在处理大型数据集时避免记录的一种方法是使用SELECT / INTO。它将创建一个新表,但不会记录任何表。

这样做有一些注意事项:

  • 计算列成为常规数据列
  • 也需要建立索引和标识列

如果操作正确,它不仅可以节省空间,还可以节省处理时间。

替代方案就像我现在所做的那样,例如:

UPDATE [MyTable] 
SET    [Message] = REPLACE([Message], N'Content_Type', N'Content-Type')

工作正常,但更新整个表创建一个巨大的事务集,而不是你可以做:

DECLARE @IDs TABLE ([id] int)
DECLARE @Batch TABLE ([id] int)

INSERT INTO @IDs ([ID]) SELECT [ID] FROM [MyTable]

WHILE EXISTS (SELECT TOP 1 [ID] FROM @IDs)
BEGIN
  INSERT INTO @Batch ([ID]) SELECT TOP 1000 [Id] FROM @IDS

  UPDATE [MyTable] 
  SET    [Message] = REPLACE([Message], N'Content_Type', N'Content-Type') 
  WHERE  [Id] IN (SELECT [Id] FROM @Batch)

  DELETE @IDs WHERE [Id] IN (SELECT [Id] FROM @Batch)
  DELETE @Batch
END

一次更新表格1,000行,保持交易规模下降。

答案 2 :(得分:5)

您可以通过将数据库恢复模型更改为简单来最小化SQL Server中的日志消耗,请参阅此link。既然您没有处理并发和事务,您是否考虑过Microsoft Access?

答案 3 :(得分:3)

通过关闭事务日志记录,您不会使SQL Server快得多,但可以通过转换为其他人已建议的简单或批量日志恢复模式来缩小日志大小。

我对此的看法是你永远不应该完全恢复模式,除非在像你这样的特殊情况下它绝对不需要。

主要原因是,如果您没有备份或所有数据都不在备份中,意外执行UPDATE,DELETE或TRUNCATE,则完全恢复的事务日志可能是您恢复的唯一希望。

这个主题有几个主题,其中读取事务日志是恢复的最后希望。

How can I rollback an UPDATE query in SQL server 2005?

How to undo a delete operation in SQL Server 2005?

同样,在您的具体情况下,这可能不是问题,但我的猜测是,它对其他人有用。

答案 4 :(得分:2)

最小化日志记录使用简单恢复模型并批量完成工作。

答案 5 :(得分:-1)

使用EntityFramework配置数据库的代码,如Richards回答描述:

using (var dbInstance = new YourEntityFrameworkDB_Context())
{
    var sqlConfigConn = dbInstance.Database.Connection as SqlConnection;
    sqlConfigConn.Open();

    using (var sqlCmd = new SqlCommand())
    {
        sqlCmd.Connection = sqlConfigConn as SqlConnection;
        sqlCmd.CommandText = String.Format("ALTER DATABASE model SET RECOVERY SIMPLE");
        var result = sqlCmd.ExecuteNonQuery();
    }
    sqlConfigConn.Close();
}

要检查它是否成功,只需启动Management Studio并运行: Screenshot Management Studio


2018年2月编辑

关于恢复模式的

MSDN描述

╔══════════╦══════════════════════╦══════════════════════════════════════════╗
║ Recovery ║    Description       ║      Recover to a point in time?         ║
║  model   ║                      ║                                          ║
╠══════════╬══════════════════════╬══════════════════════════════════════════╣
║ Simple   ║ No log backups       ║ Can recover only to the end of a backup. ║
║          ║                      ║                                          ║
║ Full     ║ Requires log backups ║ Can recover to a specific point in time, ║
║          ║                      ║ assuming that your backups are complete  ║
║          ║                      ║ up to that point in time.                ║
║          ║                      ║                                          ║
║ Bulk     ║ Requires log backups ║ Can recover to the end of any backup.    ║
║ logged   ║                      ║                                          ║
╚══════════╩══════════════════════╩══════════════════════════════════════════╝