我需要我所能获得的所有帮助才能成功重建索引。特别是有关事务日志管理的专家建议。
背景
目标数据库是在聚集列存储索引 (CCIX) 中托管 3 个大表的 DW 数据库。最大的表叫做模拟。它拥有约 370 亿行和约 600 GB 的高压缩数据。根据我们使用较小表的初步估计,150 GB CCIX 表可以扩展到 5 TB,因此我们为这次重建提供了额外的 29 TB。
为什么我们必须这样做?
在我们的 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
这是我们的第二次尝试,尽管新脚本具有基于分区的索引重建,但我可以看到日志文件仍在堆积。我们需要控制这一点。
我的问题是:
我已经执行了第二次尝试(正在进行),是否可以检查哪些分区已经被处理和排序?我在重建脚本中有 OFFLINE = ON 。
当基于分区的索引重建正在进行时,我们如何管理事务日志的大小?我们需要对此进行检查,并在可能的情况下定期截断每个分区。
由于日志文件中的空间不足,索引重建最初失败。我们添加了一个新的日志文件并使用单独的磁盘。但是我们如何确保这不会在第二次运行中再次发生?基于分区的重建是否足以保证我们能够成功重建?
感谢你的帮助。
按分区重建脚本(第二次尝试)——进行中
已用时间: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
存在一个“批量查询”表,它有两列(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
是否可以删除和索引并重建它,而不是禁用它并重建?
performance sql-server sql-server-2014 bulk-insert query-performance
我试图用大量虚拟数据填充表,以便我可以进行优化等。
我有以下几点:
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) 我有一个查询,它将显示 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) 我有两个表可以执行一些批量插入:
第一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 。
或者有没有更好的方法来做到这一点?
该场景是一个 SQL Server 实例,一个主要使用 BULK INSERT 操作提供数据的数据库,并且插入的一些文本包含特殊字符,例如\xc3\xb1因为我在西班牙语环境中工作。
因此,在最初的小测试之后,我意识到当我运行简单的时,这些特殊字符没有正确显示select,所以我开始检查我能想到的所有内容:
select collation_name from sys.databases where name='DBNAME';结果为SQL_Latin1_General_CP1_CI_AS\n\n通过这些测试,我得出结论,数据未正确存储,这就是数据未正确显示和导出的原因。我在互联网上找到的几乎每个解决方案都建议使用nvarchar而不是varchar字符串数据类型字段,但这并不能解决这种情况。是什么破坏了我的插入?
我运行以下代码,收到语法错误。
SQL Server 2012 Express(版本 11)操作系统:Windows 7 家庭高级版(x64 位)
服务器抱怨我在 附近有语法错误ROWTERMINATOR='\n',我无法弄清楚问题的原因是什么。
我不明白如何在批量插入博客中使用引号 '''+@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) 如何COPY在 Postgres 中创建 CSV 文件以及不在 CSV 中的列的静态数据?在 MySQL 中,我可以LOAD DATA INFILE ...对列名以及文件中不存在的列的任何值进行分析。我想用 Postgres 做类似的事情,但COPY命令不支持。
SQL Server 是否支持对同一数据库表的并行批量插入?
对我的特定用例的一些说明:
Session.bulk_insert_mappings()方法同时插入20k条数据。我的具体问题:
sql-server-2008 sql-server concurrency bulk-insert sql-server-2017
bulk-insert ×10
sql-server ×8
performance ×3
postgresql ×2
columnstore ×1
concurrency ×1
cte ×1
delete ×1
encoding ×1
import ×1
insert ×1
optimization ×1