我们有什么(软件):
postgresql.conf
)硬件:
所以,我们必须加载到数据库 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
我正在尝试使用 3rd 方 SAP 附加组件帮助客户,该附加组件有发布故障并且已停止支持。
在某些情况下,它会将发帖队列表中未完成的帖子归档到发帖存档表。我需要将这些存档的结果移回队列中。
队列 ID 是一个身份列,我想保持不变。
问题是,如果我执行 identity_insert on/insert/identity_insert off,对于创建队列条目并期望自动生成标识列的进程的并发性,我可以期待什么?
任何有关演示此类行为的最佳方式的指针也将不胜感激。
在我的应用程序中,我的 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) 为什么第二个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
我想在类型为 的列中插入一个 IP 地址inet
。我可以以什么格式插入数据?它只是二进制还是有什么方法可以从文本中插入,例如"192.168.1.082"
?是否有任何帮助功能,以便我可以psql
在命令提示符下对其进行测试?
看看下面的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_id
和network_contact_id
字段包含链接到其他表的ID号码。
我希望能够运行INSERT IGNORE
查询,此表,但我想用的组合network_id
,并network_contact_id
作为唯一键来匹配。
因此,举例来说,如果我试图插入一个接触的是有network_id = 4
和network_contact_id = 12
中,INSERT IGNORE
查询将看到该条目已经存在,而忽略被抛出任何错误。
所以基本上,network_id
不是唯一的。network_contact_id
不是唯一的。但两者的结合是独一无二的。我该如何设置?我是否必须有一个其他字段作为其他两个字段的串联值?或者有没有办法为此表设置密钥,以便它可以满足我的需要?
我有一个流量非常高的网站,每小时可能会插入 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。你会推荐什么起始配置设置和方法来开始解决这个问题?
让我知道您可能需要更多信息。
谢谢
我是一名研究生,正在使用 Mondrian OLAP 研究 OLAP。所以我想在初始加载时更快地将数据插入 InnoDB (MySQL 5.5)。在这种环境下,唯一的用户是我,所以我认为可以对插入速度进行更宽松的设置。目前,我正在使用以下技术。
log_bin
skip-innodb-doublewrite
transaction_isolation
为READ-COMMITTED
或READ-UNCOMMITTED
(实际上READ-COMMITED
)innodb_flush_log_at_trx_commit
为0
或2
(实际上0
)innodb_buffer_pool_size
为 5GB(系统有 6GB RAM)有没有更多的技术可以在 InnoDB 上更快地插入?我必须修改innodb_io_read_thread
和innodb_io_write_thread
吗?如果您需要更多信息,请告诉我。
我有这个查询返回几行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。
好的,设置场景。我有三个表,( Table1
,Table2
和DataTable
),我想插入Table1
和Table2
使用DataTable
作为源。因此,对于每一行,DataTable
我都希望在Table1
and 中有一排Table2
,并且Table2
需要id
从Table1
...插入(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
.
是CURSOR
或WHILE
循环来做到这一点的唯一途径?
insert ×10
mysql ×4
innodb ×3
performance ×3
sql-server ×3
postgresql ×2
bytea ×1
datatypes ×1
deadlock ×1
identity ×1
inheritance ×1
java ×1
jdbc ×1
mysql-5.5 ×1
psql ×1