快速向表中插入100W行数据

本文介绍了一种在数据库中快速插入一百万行数据的方法。通过使用不同的策略和技术,包括递归CTE、位运算和批处理等手段,实现了在较短时间内完成大量数据的插入操作。这些方法有助于提高数据库性能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/*
方法1
用时21秒
快速向表中插入100w行数据
*/

if object_id('nums') is not null
drop table nums
go
create table nums (n int primary key);


declare @max int ,@rc int
select @max=1000000;
select @rc=1;
insert into nums (n) values (1);
while @rc*2<=@max
begin
insert into nums
select n+@rc from nums
set @rc=@rc*2
end
insert into nums select n+@rc from nums where n+@rc<=@max
--select count(*) from nums
/*
方法2
用时4分4秒
快速向表中插入100w行数据
*/
IF OBJECT_ID('NUMS1') IS NOT NULL
DROP TABLE NUMS1
go
create table nums1 (n int primary key);
GO
declare @max int, @rc int
select @max=1000000;
select @rc=1;
while @rc<=@max
begin
insert into nums1 values(@rc);
set @rc=@rc+1
end

----------------------------

--------------------
--------------------
declare @n as bigint
set @n=1000000;
with nums as
(
select 1 as n
union all
select n+1 from nums where n<@n ----递归---
)
select n from nums
option (maxrecursion 0) ----移除默认的100级递归限制-----
-----------------------
-----------------------8秒
declare @n as bigint
set @n=1000000;
with nums as
(
select 1 as n
union all
select n+1 from nums where n<ceiling(sqrt(@n))
),
expand as
(select 1 as c from nums as b1,nums as b2)
,
base as
(
select row_number() over(order by c) as n
from expand
)
select n from base
option (maxrecursion 0)

----------------------------------
----------------------------------9秒
declare @n as bigint
set @n=1000000;
with
L0 AS (SELECT 1 AS C UNION ALL SELECT 1),     --2行
L1 AS (SELECT 1 AS C FROM L0 AS A,L0 AS B),   --4行
L2 AS (SELECT 1 AS C FROM L1 AS A,L1 AS B),   --16行
L3 AS (SELECT 1 AS C FROM L2 AS A,L2 AS B),   --256
L4 AS (SELECT 1 AS C FROM L3 AS A,L3 AS B),   --65536
L5 AS (SELECT 1 AS C FROM L4 AS A,L4 AS B),
NUMS as (select row_number() over(order by c) as n from L5)
SELECT N FROM NUMS WHERE N<=@N

<think>嗯,用户问的是在DBeaver页面插入1万条数据到linshi中。首先,我需要确认DBeaver是什么。DBeaver是一个数据库管理工具,支持多种数据库,比如MySQL、PostgreSQL、Oracle等。所以用户可能在用DBeaver连接某个数据库,需要插入数据到临时。 接下来,插入1万条数据的方法可能有几种。常见的有使用INSERT语句循环生成,或者用生成数据的工具。不过,直接在DBeaver里执行SQL的话,可能需要考虑到不同数据库的语法差异。比如,MySQL和PostgreSQL在生成大量数据时的方法不同。 用户提到的linshi是临时吗?可能需要注意临时的创建方式,不同数据库的临时语法可能不一样,比如有的用CREATE TEMPORARY TABLE,有的用CREATE TEMP TABLE。 然后,插入1万条数据如果逐条插入效率会很低,应该建议批量插入或者使用生成数据的办法。例如,在MySQL中可以用INSERT INTO ... VALUES (多个值),或者用递归CTE生成数据。但递归CTE在MySQL 8.0以上才支持,而其他数据库如PostgreSQL可能支持不同的方法。 另外,用户可能不熟悉如何生成大量数据,可能需要示例代码。比如,使用数字生成函数或者序列。还要注意事务处理,批量提交以避免锁和性能问题。 还要考虑到DBeaver的执行限制,比如一次执行大量SQL是否会导致客户端内存问题,或者超时。可能需要分批次插入,比如每次插入1000条,执行10次。 另外,是否需要使用预处理语句或者脚本?比如在DBeaver中执行脚本,或者调用存储过程。但存储过程又因数据库而异,可能用户没有权限。 还要提醒用户注意数据类型和约束,确保插入的数据符合结构,避免插入失败。比如,如果有自增主键,可能需要排除主键字段,或者显式设置值。 最后,可能需要给出不同数据库的具体示例,比如MySQL、PostgreSQL、Oracle的不同方法,让用户根据自己使用的数据库选择适合的方式。</think>在 DBeaver 中向 `linshi` 插入 1 万条数据,可通过以下步骤实现: --- ### 一、准备工作 1. **确认结构** 执行以下 SQL 查看结构: ```sql DESCRIBE linshi; -- MySQL/PostgreSQL -- 或 SELECT column_name, data_type FROM information_schema.columns WHERE table_name = 'linshi'; -- 通用方法 ``` 2. **清理旧数据(可选)** ```sql TRUNCATE TABLE linshi; -- 快速清空 ``` --- ### 二、插入数据的 3 种方法 #### 方法 1:批量插入(推荐) ```sql -- MySQL 示例(批量插入 1000 条/批次) INSERT INTO linshi (column1, column2, ...) VALUES (value1_1, value1_2, ...), (value2_1, value2_2, ...), ... (value1000_1, value1000_2, ...); ``` - **优点**:性能最佳(减少事务开销) - **注意**:单批次建议不超过 1000 行,避免超出数据库包大小限制 --- #### 方法 2:生成模拟数据 ```sql -- PostgreSQL 示例(生成 1 万条序列数据) INSERT INTO linshi (id, create_time) SELECT generate_series(1,10000), CURRENT_TIMESTAMP - (random() * INTERVAL '365 days'); ``` ```sql -- MySQL 示例(递归生成数字序列) WITH RECURSIVE cte AS ( SELECT 1 AS n UNION ALL SELECT n + 1 FROM cte WHERE n < 10000 ) INSERT INTO linshi (id) SELECT n FROM cte; ``` --- #### 方法 3:编程式插入(Python 脚本) ```python import psycopg2 # 示例使用 PostgreSQL 驱动 conn = psycopg2.connect(database="your_db", user="user", password="pass", host="host") cur = conn.cursor() for i in range(1, 10001): cur.execute("INSERT INTO linshi (id, data) VALUES (%s, %s)", (i, f"test_data_{i}")) if i % 1000 == 0: # 每 1000 条提交一次 conn.commit() conn.commit() cur.close() conn.close() ``` --- ### 三、验证插入结果 ```sql SELECT COUNT(*) FROM linshi; -- 确认总行数 SELECT * FROM linshi LIMIT 10; -- 随机抽查数据 ``` --- ### 注意事项 1. **事务管理** 批量操作建议显式使用事务: ```sql BEGIN; -- 插入操作 COMMIT; ``` 2. **性能优化** - 关闭自动提交(DBeaver 设置中取消勾选 `Auto-commit`) - 增大 `max_allowed_packet`(MySQL)或 `work_mem`(PostgreSQL) 3. **数据类型匹配** 确保生成的数据类型与定义一致,特别关注: - 时间格式 `YYYY-MM-DD HH:MM:SS` - 数值范围(如 `BIGINT` vs `INT`) 如需更具体的语法帮助,请提供数据库类型(如 MySQL/PostgreSQL/Oracle)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值