标签: bulk-insert

如何在重建非常大表的索引时保留较小的事务日志文件

我需要我所能获得的所有帮助才能成功重建索引。特别是有关事务日志管理的专家建议。

背景

目标数据库是在聚集列存储索引 (CCIX) 中托管 3 个大表的 DW 数据库。最大的表叫做模拟。它拥有约 370 亿行和约 600 GB 的高压缩数据。根据我们使用较小表的初步估计,150 GB CCIX 表可以扩展到 5 TB,因此我们为这次重建提供了额外的 29 TB。

  • SQL Server 企业版 2016
  • 恢复模式 = 简单

为什么我们必须这样做?

在我们的 ETL 服务的第一个版本中,数据在加载到 CCIX 之前没有先合并和排序。这导致 CCIX 的非最佳使用,因为许多行段在压缩之前没有完全填充。最佳段必须压缩 1,0485,76 行,并且必须按时间排序,以便基于时间的查询可以在 sql server 中获得最多的行组消除,并减少要处理的段。随着更多的文档可用,我们将学习更多的 CCIX。

我的对齐摘录在这里 https://drive.google.com/file/d/0BzGLNskaj70UQUtZYW9CZF9iUUk/view?usp=sharing

新的 ETL 保证数据在加载到 CCIX 之前及时整合和排序。所以未来的加载将被排序,我们在这里关注的是在首次加载期间加载的现有数据。

有关完整的案例描述,请阅读此处。 https://drive.google.com/open?id=0BzGLNskaj70URmZURlVDWVNYd2M

这是我们的第二次尝试,尽管新脚本具有基于分区的索引重建,但我可以看到日志文件仍在堆积。我们需要控制这一点。

我的问题是:

  1. 我已经执行了第二次尝试(正在进行),是否可以检查哪些分区已经被处理和排序?我在重建脚本中有 OFFLINE = ON 。

  2. 当基于分区的索引重建正在进行时,我们如何管理事务日志的大小?我们需要对此进行检查,并在可能的情况下定期截断每个分区。

  3. 由于日志文件中的空间不足,索引重建最初失败。我们添加了一个新的日志文件并使用单独的磁盘。但是我们如何确保这不会在第二次运行中再次发生?基于分区的重建是否足以保证我们能够成功重建?

感谢你的帮助。

按分区重建脚本(第二次尝试)——进行中

已用时间:17 小时 34 分钟

--create a new clustered row index (CRI)
CREATE CLUSTERED INDEX [Analog_ColumnStoreIndex] 
ON [dbo].[Analog]
( …
Run Code Online (Sandbox Code Playgroud)

sql-server transaction-log columnstore sql-server-2016 bulk-insert

5
推荐指数
1
解决办法
640
查看次数

配置和维护具有许多插入和删除的表的最佳方法,平均而言是空的?

存在一个“批量查询”表,它有两列(BatchID、RecordID),它们都是 TSQL 类型的“uniqueidentifier”。唯一的聚簇键在(BatchID,RecordID)上,并且没有二级索引。

我们使用 SqlBulkCopy 将数千或数百万个 id 快速插入到单个批处理 id 下的表中,以便各种查询可以加入它以使用与该批处理关联的记录 id 集执行过滤。这种方法比尝试多个查询快得多,所有查询都在查询字符串中发送 id 列表。查询完成后,该批记录 ID 将被删除。当没有查询运行时,该表平均为空,但可能有数百个活动批次,因为我们每秒处理数千个可能使用该表的 API 请求。

我的问题是,DBA 需要什么样的维护步骤(如果有)来维护这些表。例如,它是否会从定期索引重建中受益,或者 SQL Server 是否会自行处理已删除行的清理(释放页块等)。此外,表或聚集索引是否有任何特殊配置会有所帮助,特别是考虑到标识符是随机 Guids(唯一标识符)。

一般我们使用最新版本的SQL Server,企业版。有些服务器在 Azure 中,有些在 AWS 中。

我也有兴趣听取替代方案。例如,我认为这种方法最适合永久表,但我也可以创建一个会话本地临时表作为事务的一部分,该表在完成时被删除,而不是从永久表中插入和删除行。我只是不知道相比之下会如何表现。

performance sql-server delete index-maintenance bulk-insert performance-tuning

5
推荐指数
1
解决办法
117
查看次数

4
推荐指数
2
解决办法
708
查看次数

加载大量测试数据的快速方法

我试图用大量虚拟数据填充表,以便我可以进行优化等。

我有以下几点:

WHILE @RowCount < 3000000
BEGIN

    SELECT @Random = ROUND(@Upper * RAND(), 0)

    INSERT INTO [dbo].[Test]
               ([Id]
               ,[OtherKey]
               ,[Description])
         VALUES
               (@RowCount
               ,@Random
               ,CAST(@Random AS VARCHAR(max)))

    SET @RowCount = @RowCount + 1
END
Run Code Online (Sandbox Code Playgroud)

然而,这似乎很慢。

有没有更好的方法来自动将半随机行加载到数据库表中?

新脚本

这个似乎很快:

USE [Test]
GO

/****** Object:  Table [dbo].[Test]    Script Date: 17/10/2016 21:22:39 ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

USE [Test]
GO

CREATE TABLE [dbo].[Test](
    [Id] [int] NOT NULL,
    [OtherKey] [int] NOT NULL,
    [Description] [varchar](max) NOT NULL,
    [Time] [datetime] NOT NULL
) …
Run Code Online (Sandbox Code Playgroud)

performance sql-server optimization bulk-insert

4
推荐指数
1
解决办法
3495
查看次数

如果数据计数增加,SQL Server DB 表数据大小查询结果不会增加

我有一个查询,它将显示 SQL Server 中数据库表的记录的表名、行数和大小。当我执行查询时,我得到了一个结果显示

TableName            NumberOfRows   SizeinKB
TBL_PROCESS_AUDIT2   1              16
Run Code Online (Sandbox Code Playgroud)

但是当我使用相同的插入查询将更多记录插入同一个表并执行查询时,它显示更多的行数 (50) 但大小相同 (16kb)。

TableName            NumberOfRows   SizeinKB
TBL_PROCESS_AUDIT2   50             16
Run Code Online (Sandbox Code Playgroud)

实际上,当表的行数增加时,它的大小也应该增加。因此,对于 1 条记录,大小为 16KB,因此对于 50 条记录,大小应为 800KB。当我插入像大约 2000 条记录这样的批量记录时,大小会有所不同。

我的查询中的逻辑或问题是什么?我想要一个数据库表的记录的实际大小。

我的查询:

CREATE TABLE #RowCountsAndSizes (TableName NVARCHAR(128),rows CHAR(11),      
       reserved VARCHAR(18),data VARCHAR(18),index_size VARCHAR(18), 
       unused VARCHAR(18))

EXEC       sp_MSForEachTable 'INSERT INTO #RowCountsAndSizes EXEC sp_spaceused ''?'' '

SELECT     TableName,CONVERT(bigint,rows) AS NumberOfRows,
           CONVERT(bigint,left(reserved,len(reserved)-3)) AS SizeinKB
FROM       #RowCountsAndSizes 
ORDER BY   NumberOfRows DESC,SizeinKB DESC,TableName

DROP TABLE #RowCountsAndSizes
Run Code Online (Sandbox Code Playgroud)

sql-server insert database-size sql-server-2014 bulk-insert

4
推荐指数
1
解决办法
767
查看次数

批量插入多个表

我有两个表可以执行一些批量插入:

  1. 密钥:key_id (pk), key_name
  2. related_key: related_key_id (pk), key_id (fk)

第一INSERT

values_data = "($$key_1$$), ($$key_2$$)"

INSERT INTO key (key_name) VALUES values_data
Run Code Online (Sandbox Code Playgroud)

INSERT

values_data = "(1, `the id of the first value inserted in key`)
             , (1, `the id of the sec value inserted in key`)"

INSERT INTO related_key (related_key_id, key_id) VALUES values_data
Run Code Online (Sandbox Code Playgroud)

我不知道如何做第二个,INSERT因为我不知道如何为插入到key表中的行获取这些 id 。

或者有没有更好的方法来做到这一点?

postgresql cte postgresql-9.3 bulk-insert

3
推荐指数
1
解决办法
3218
查看次数

不显示从文件导入的特殊字符

该场景是一个 SQL Server 实例,一个主要使用 BULK INSERT 操作提供数据的数据库,并且插入的一些文本包含特殊字符,例如\xc3\xb1因为我在西班牙语环境中工作。

\n\n

因此,在最初的小测试之后,我意识到当我运行简单的时,这些特殊字符没有正确显示select,所以我开始检查我能想到的所有内容:

\n\n
    \n
  • 文件编码:要批量插入的文件具有正确的编码:ANSI
  • \n
  • 数据库编码:数据库具有正确的编码(感谢上帝):select collation_name from sys.databases where name='DBNAME';结果为SQL_Latin1_General_CP1_CI_AS\n\n
      \n
    • Latin1:使用的字符集。这很适合我
    • \n
    • 一般:这里没什么真正有趣的
    • \n
    • CP1:这意味着它使用代码页 1,简而言之,意味着用于编码 WIN-1252 的代码页 1252 <=> 代码页,与 Latin1 非常相似
    • \n
    • CI:不区分大小写
    • \n
    • AS:区分重音,因此 \xc3\xa1 与 a 不同
    • \n
  • \n
  • 将数据导出到文件并检查:文件编码是ANSI ,但数据显示不正确,没有特殊字符,而是我发现一些其他字符使文本难以阅读。
  • \n
\n\n

通过这些测试,我得出结论,数据未正确存储,这就是数据未正确显示和导出的原因。我在互联网上找到的几乎每个解决方案都建议使用nvarchar而不是varchar字符串数据类型字段,但这并不能解决这种情况。是什么破坏了我的插入?

\n

sql-server import encoding bulk-insert

3
推荐指数
1
解决办法
8415
查看次数

TSQL 大容量插入语法错误

我运行以下代码,收到语法错误。

SQL Server 2012 Express(版本 11)操作系统:Windows 7 家庭高级版(x64 位)

  1. 服务器抱怨我在 附近有语法错误ROWTERMINATOR='\n',我无法弄清楚问题的原因是什么。

  2. 我不明白如何在批量插入博客中使用引号 '''+@datapath+'access1.log''

我的理解是我应该使用双引号来表示单引号。

这是我的代码:

declare @datapath varchar(128);
set @datapath = 
    'C:\Users\admin121\sql-server-2014\sql2012_class3_20141028\WebLog\';

exec
('
  bulk insert weblog from '''+@datapath+'access1.log''
    with 
    (
      firstrow = 1,
      FIELDTERMINATOR ='  ',
      ROWTERMINATOR='\n', 
      MAXERRORS=99999999

    )
');
Run Code Online (Sandbox Code Playgroud)

sql-server bulk-insert

2
推荐指数
1
解决办法
419
查看次数

使用其他列中的静态数据在 Postgres 中导入 CSV

如何COPY在 Postgres 中创建 CSV 文件以及不在 CSV 中的列的静态数据?在 MySQL 中,我可以LOAD DATA INFILE ...对列名以及文件中不存在的列的任何值进行分析。我想用 Postgres 做类似的事情,但COPY命令不支持。

postgresql bulk-insert

2
推荐指数
1
解决办法
2501
查看次数

SQL Server 是否支持来自多个连接的并行批量插入?

SQL Server 是否支持对同一数据库表的并行批量插入?

对我的特定用例的一些说明:

  • 该表有一个由两个不同索引键组成的聚集索引和两个非聚集索引,每个索引由一个索引键组成。
  • 并行在这里意味着来自多个不同的连接。每个连接都是一个唯一的sqlalchemy.orm.session对象,每个Session使用该Session.bulk_insert_mappings()方法同时插入20k条数据。

我的具体问题:

  • 我试图了解 SQL Server 端的幕后情况。是否有所有批量插入的队列,并且每个批量插入都按照进来的顺序一个一个地执行?还是所有的插入都是同时进行的,并行的?
  • 我们还假设没有两个不同的连接会尝试插入相同的记录(基于主键),但是如果两个并行连接尝试插入会导致 PK 违规的记录怎么办?
  • 如果我们要求 SQL Server 2008 与 2017,上述问题的答案是否不同?
  • Microsoft 是否有关于此的任何类型的文档?

sql-server-2008 sql-server concurrency bulk-insert sql-server-2017

2
推荐指数
1
解决办法
318
查看次数