标签: insert

为大量 INSERTS 和 bytea 更新优化 PostgreSQL

我们有什么(软件):

  • 带有基本配置的PostrgeSQL 9.3(在 中没有变化postgresql.conf
  • 视窗 7 64 位

硬件:

  • 英特尔酷睿 i7-3770 3.9 GHz
  • 32 Gb 内存
  • WDC WD10EZRX-00L4HBATa 驱动器(1000Gb,SATA III)

所以,我们必须加载到数据库 aprox。100.000.000行与bytea列,以及更简单的500.000.000行(无 LOB)。varchar第一个表上有 2 个索引(长度为 13、19),varchar第二个表上有 2个索引(长度为 18、10)。每个表也有生成 id 的序列。

到目前为止,这些操作使用 8 个并行连接和 50 个 JDBC 批处理大小进行。下图展示了系统负载:它对postgresql进程是零负载。加载 24 小时后,我们只加载了 10.000.000 行,这是非常缓慢的结果。

在此处输入图片说明

我们寻求帮助调整PostrgreSQL配置的目的是:

1)为了超快加载这个数量的数据,它是一次性操作,所以它可以是临时配置

2) 对于生产模式,通过它们的索引对这 2 个表执行中等数量的 SELECT,无需连接和排序。

performance insert database-tuning postgresql-9.3 bytea performance-tuning

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

IDENTITY_INSERT 如何影响并发?

我正在尝试使用 3rd 方 SAP 附加组件帮助客户,该附加组件有发布故障并且已停止支持。

在某些情况下,它会将发帖队列表中未完成的帖子归档到发帖存档表。我需要将这些存档的结果移回队列中。

队列 ID 是一个身份列,我想保持不变。

问题是,如果我执行 identity_insert on/insert/identity_insert off,对于创建队列条目并期望自动生成标识列的进程的并发性,我可以期待什么?

任何有关演示此类行为的最佳方式的指针也将不胜感激。

sql-server-2005 sql-server insert identity

12
推荐指数
1
解决办法
3078
查看次数

大批量插入速度

在我的应用程序中,我的 INSERT 似乎占用了大部分时间。我在内存中有大量对象(~40-50,000),我想将它们插入到表中。

让我们拿一个样本表

CREATE TABLE bill (
id BIGINT(20) PRIMARY KEY,
amount INT(11) DEFAULT 0,
bill_date DATETIME DEFAULT NOW(),
INDEX (bill_date)
) ENGINE=InnoDB
Run Code Online (Sandbox Code Playgroud)

以 3 行作为我的批量大小,以下是我能想到的插入方法

方法 1 - 构建并触发 3 个原始插入

INSERT INTO bill (amount, bill_date) VALUES (10, '2012-01-01 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (20, '2012-01-02 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (40, '2013-02-05 00:00:00');
Run Code Online (Sandbox Code Playgroud)

方法 2 - 将值合并到 1 个查询中

INSERT INTO bill (amount, bill_date) VALUES 
(10, '2012-01-01 00:00:00'),
(20, '2012-01-02 00:00:00'),
(40, '2013-02-05 …
Run Code Online (Sandbox Code Playgroud)

mysql innodb insert jdbc java

11
推荐指数
1
解决办法
1万
查看次数

基数估计不佳会使 INSERT 不符合最少日志记录吗?

为什么第二个INSERT语句比第一个语句慢 5 倍?

从生成的日志数据量来看,我认为第二个不符合最小日志记录的条件。但是,数据加载性能指南中的文档指出两个插入都应该能够被最低限度地记录。因此,如果最小日志记录是关键性能差异,为什么第二个查询不符合最小日志记录?可以做些什么来改善这种情况?


查询 #1:使用 INSERT...WITH (TABLOCK) 插入 5MM 行

考虑以下查询,该查询将 5MM 行插入到堆中。此查询在 中执行1 second并生成64MB由 报告的事务日志数据sys.dm_tran_database_transactions

CREATE TABLE dbo.minimalLoggingTest (n INT NOT NULL)
GO
INSERT INTO dbo.minimalLoggingTest WITH (TABLOCK) (n)
SELECT n
-- Any table/view/sub-query that correctly estimates that it will generate 5MM rows
FROM dbo.fiveMillionNumbers
-- Provides greater consistency on my laptop, where other processes are running
OPTION (MAXDOP 1)
GO
Run Code Online (Sandbox Code Playgroud)


查询 #2:插入相同的数据,但 SQL 低估了行数

现在考虑这个非常相似的查询,它对完全相同的数据进行操作,但碰巧从SELECT基数估计太低的表(或在我的实际生产案例中具有许多连接的复杂语句)中提取。此查询在事务日志数据中执行 …

performance sql-server insert transaction-log sql-server-2014

11
推荐指数
2
解决办法
353
查看次数

如何在 PostgreSQL 的 inet 列中插入 IP 地址?

我想在类型为 的列中插入一个 IP 地址inet。我可以以什么格式插入数据?它只是二进制还是有什么方法可以从文本中插入,例如"192.168.1.082"?是否有任何帮助功能,以便我可以psql在命令提示符下对其进行测试?

postgresql datatypes insert psql

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

如何通过表字段的组合使用唯一键?

看看下面的sqlfiddle:http ://sqlfiddle.com/#!2/dacb5/1

CREATE TABLE contacts 
    (
     id int auto_increment primary key, 
     name varchar(20), 
     network_id int,
     network_contact_id int
    );

INSERT INTO contacts
(name, network_id, network_contact_id)
VALUES
('John', 4, 10),
('Alex', 4, 11),
('Bob', 4, 12),
('Jeff', 4, 45),
('Bill', 7, 11),
('Walter', 7, 45),
('Jessie', 7, 360) ;
Run Code Online (Sandbox Code Playgroud)

我有一个基本的联系人表。该network_idnetwork_contact_id字段包含链接到其他表的ID号码。

我希望能够运行INSERT IGNORE查询,此表,但我想用的组合network_id,并network_contact_id作为唯一键来匹配。

因此,举例来说,如果我试图插入一个接触的是有network_id = 4network_contact_id = 12中,INSERT IGNORE查询将看到该条目已经存在,而忽略被抛出任何错误。

所以基本上,network_id不是唯一的。network_contact_id不是唯一的。但两者的结合是独一无二的。我该如何设置?我是否必须有一个其他字段作为其他两个字段的串联值?或者有没有办法为此表设置密钥,以便它可以满足我的需要?

mysql uniqueidentifier insert unique-constraint

10
推荐指数
2
解决办法
2万
查看次数

如何配置 MySQL Innodb 以每小时处理 1000 次插入?

我有一个流量非常高的网站,每小时可能会插入 1000 条新记录。

这一错误使网站瘫痪:

PDOException: SQLSTATE[40001]: Serialization failure: 1213 
Deadlock found when trying to get lock; 
try restarting transaction: INSERT INTO {location_instance} 
(nid, vid, uid, genid, lid) VALUES (:db_insert_placeholder_0, 
:db_insert_placeholder_1, :db_insert_placeholder_2, 
:db_insert_placeholder_3, :db_insert_placeholder_4); 
Array ( [:db_insert_placeholder_0] => 1059 [:db_insert_placeholder_1] => 
1059 [:db_insert_placeholder_2] => 0 [:db_insert_placeholder_3] => 
cck:field_item_location:1059 [:db_insert_placeholder_4] => 1000 )
Run Code Online (Sandbox Code Playgroud)

如果 MySQL 无法处理这种类型的负载,我会感到非常惊讶。那么,我的问题是,这是一个数据库问题,我该如何配置 MySQL 才能处理这么多流量?

我在开发服务器上设置了我的网站副本,其中包含模拟添加到网站的内容负载的脚本。我正在运行带有 16GB RAM 的 Ubuntu、LAMP 堆栈。

诚然,我对数据库不是很了解。事实上,我从“apt-get install”完成后随附的默认 my.cnf 开始。表都是Innodb。你会推荐什么起始配置设置和方法来开始解决这个问题?

让我知道您可能需要更多信息。

谢谢

mysql innodb performance deadlock insert

10
推荐指数
2
解决办法
2万
查看次数

InnoDB 插入速度更快

我是一名研究生,正在使用 Mondrian OLAP 研究 OLAP。所以我想在初始加载时更快地将数据插入 InnoDB (MySQL 5.5)。在这种环境下,唯一的用户是我,所以我认为可以对插入速度进行更宽松的设置。目前,我正在使用以下技术。

  • 禁用 log_bin
  • 使能够 skip-innodb-doublewrite
  • 设置transaction_isolationREAD-COMMITTEDREAD-UNCOMMITTED(实际上READ-COMMITED
  • 设置innodb_flush_log_at_trx_commit02(实际上0
  • 设置innodb_buffer_pool_size为 5GB(系统有 6GB RAM)

有没有更多的技术可以在 InnoDB 上更快地插入?我必须修改innodb_io_read_threadinnodb_io_write_thread吗?如果您需要更多信息,请告诉我。

mysql innodb insert mysql-5.5

10
推荐指数
2
解决办法
2万
查看次数

从 SELECT 与单个值组合的 INSERT

我有这个查询返回几行item_id

select item_id from properties where name like 'body';   
Run Code Online (Sandbox Code Playgroud)

我有第二个返回 1 行的tag_id

select id from tags where name ilike '%hoax%';   
Run Code Online (Sandbox Code Playgroud)

我想使用这两个结果在第三个表中创建新行,item_tags以便我可以将item_id第一个查询中的每个结果插入tag_id到第二个查询中。

我会有类似的东西:

INSERT INTO item_tags (item_id, tag_id) VALUES (item_id1, tag_id);  
INSERT INTO item_tags (item_id, tag_id) VALUES (item_id2, tag_id);
INSERT INTO item_tags (item_id, tag_id) VALUES (item_id3, tag_id);   
 ...     
Run Code Online (Sandbox Code Playgroud)

第一个查询返回超过 800 行。如何自动化插入?
psql 9.1.11,Postgres 9.1.4。

postgresql insert postgresql-9.1

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

使用 INSERT_IDENTITY 将 select 插入到多个相关表中

好的,设置场景。我有三个表,( Table1Table2DataTable),我想插入Table1Table2使用DataTable作为源。因此,对于每一行,DataTable我都希望在Table1and 中有一排Table2,并且Table2需要idTable1...插入(PK)

如果我要这样做...

INSERT INTO Table1 SELECT A, B, C FROM MyTable
INSERT INTO Table2 SELECT IDENTITY_INSERT(), D, E, F FROM MyTable
Run Code Online (Sandbox Code Playgroud)

我将ID最后插入的记录的Table1.

CURSORWHILE循环来做到这一点的唯一途径?

sql-server insert inheritance

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