标签: insert

加速插入

我需要一种快速、同步、持续时间最短的插入表的方法。我试过的(“盲”)是:

  • 表上没有任何索引
  • 切换到简单日志记录(从完整日志记录)

我使用的测试场景由 100 个连接组成,每个连接都运行一个 INSERT,然后等待 0.1 秒,然后无限期地再次等待。每个“插入器”记录执行时间。

查看执行时间,我有时会在插入时看到 1.5 秒甚至 10 秒(作为例外情况),否则我看到的是典型的 0.2 秒。

进一步的背景:

  • SQL Server 2008 R2 Express(afaik Express 版本仅限制 DB 大小 (4GB)、RAM (1GB) 和逻辑 CPU (1))
  • 机器:带有 7200 RPM HDD、8 GB RAM 和 8 个逻辑 CPU 的笔记本电脑,托管服务器和客户端
  • 该表由 1 个 BigInt ID(身份)、一个 NVARCHAR(100) 字段和 NVARCHAR(MAX)(此上的 INSERT 具有 10k 有效负载)和一个 NVARCHAR(MAX)(30k 有效负载在 INSERT)列组成

我应该在哪里寻找对此类流程性能的进一步改进?

performance sql-server-2008 sql-server optimization insert

7
推荐指数
1
解决办法
3510
查看次数

列的顺序对 INSERT 有显着影响吗?

对于这两个查询,我们是否体验到明显的性能差异?

INSERT INTO table (col1, col2, col3, col4, col5) ...
Run Code Online (Sandbox Code Playgroud)

INSERT INTO table (col5, col3, col1, col2, col4) ...
Run Code Online (Sandbox Code Playgroud)

是否需要INSERT按照表中列的顺序排列列?

mysql innodb performance query insert query-performance

7
推荐指数
1
解决办法
5024
查看次数

sqlcmd 慢于 SQL Server 2008 R2

我正在尝试导入一个较长的 SQL 脚本(350 万行,大小为 1.5 GB),其中主要包含使用数据的短 INSERT INTO 语句,sqlcmd -E -d <database> -S 127.0.0.1 -i <scriptfile>并且它几乎爬行到停止(大约每秒 150 行)而没有推断出任何明显的SQL 服务器主机上的负载(所有 CPU 内核几乎空闲,磁盘吞吐量约为 200 KB/s)。

由于源文件位于 NFS 共享上,我首先怀疑这是罪魁祸首,但本地可用的相同脚本以相同的速度运行。

数据库基本上是空的,表是由完全相同的脚本创建的,没有触发器或其他花哨的东西——只是原始的,主要是数字或 varchar 数据。

SQLCMD 在等什么?有什么办法可以加快速度吗?

编辑:

我们在更改 SQL 脚本文件中的数据方面的手段有限。数据由第三方为进口程序提供。我相信它最初是使用 Management Studio 2005 的“Script table as...”功能导出的。

由于文件庞大,编辑文件很乏味——使用普通文本编辑器,任何操作都会花费很长时间,尽管通过将两个文件复制到一起来完成“SET NOCOUNT ON”的准备——并且它带来了大约 50% 的加速。

由于文本编码 (Unicode-LE),在不转换的情况下无法使用通用的 GNU textutils 集进行编辑(否则它可以很好地处理大文件) - 而且我不愿意转换,因为数据保真度问题可能会来吧。

因此,我对如何应用有关插入 BEGIN TRAN/COMMIT TRAN 块或将单个插入项转换为更大集合的建议有些困惑。

sql-server-2008 insert

7
推荐指数
1
解决办法
7122
查看次数

只插入死锁

我们有一个将数据插入表中的应用程序。不幸的是,我们遇到了死锁,而且死锁仅来自插入。我们看到插入在非聚集索引上以不同的顺序获取键锁,这导致了问题。

为什么插入会这样,我们应该怎么做才能缓解死锁?任何帮助或见解表示赞赏。

在下面的示例中,只涉及两个插入,但我们在死锁中涉及多达 4 个不同的插入。

这是死锁图:

    <deadlock>
    <victim-list>
        <victimProcess id="process3ab355868" />
    </victim-list>
    <process-list>
        <process id="process3ab355868" taskpriority="0" logused="1184" waitresource="KEY: 5:72057594043629568 (6234ed5bf036)" waittime="7493" ownerId="92332106" transactionname="implicit_transaction" lasttranstarted="2014-10-13T12:37:43.060" XDES="0x123699668" lockMode="X" schedulerid="3" kpid="3540" status="suspended" spid="89" sbid="0" ecid="0" priority="0" trancount="2" lastbatchstarted="2014-10-13T12:37:44.333" lastbatchcompleted="2014-10-13T12:37:44.333" lastattention="1900-01-01T00:00:00.333" clientapp="Microsoft JDBC Driver for SQL Server" hostname="" hostpid="0" loginname="" isolationlevel="read committed (2)" xactid="92332106" currentdb="5" lockTimeout="4294967295" clientoption1="671088672" clientoption2="128058">
            <executionStack>
                <frame procname="adhoc" line="1" stmtstart="278" stmtend="818" sqlhandle="0x0200000053a65d302154b91e9fee55234669030a42479c050000000000000000000000000000000000000000">
                    INSERT INTO table (col1, col2, col3, col4, col5, col6, col7, col8, col9) VALUES (@P0, @P1, @P2, @P3, @P4, @P5, …
Run Code Online (Sandbox Code Playgroud)

sql-server deadlock insert sql-server-2012

7
推荐指数
1
解决办法
1457
查看次数

SQL Server 聚集索引、索引平衡和使用 NewID 的插入性能

我有一个大(6db)的跟踪表。它有一个通过 GETDATE() 创建的聚集键 (DateTime)。

连接到这个数据库/表的连接池在 10 台计算机的集群中平均上升到 50,因此平均我们有大约 500 个并发连接尝试插入。

数据库适合内存,几乎看不到任何 IO。

我试图弄清楚在持续的 INSERT 负载下,聚集索引是否会达到重新平衡树的程度,以及这是否会导致系统可以维持的插入次数减慢。

关于重新平衡索引是否是 SQL Server 对聚集索引(甚至是非聚集索引)执行的操作,我有一些疑问。

问题-

  1. 是否有任何原因导致插入性能的周期性/循环放缓?
  2. 重新平衡操作会自动触发聚集索引吗?
  3. 重新平衡操作会在非聚集索引上自动触发吗?

其他信息

  • SQL Server 2008
  • 真正的大型服务器 - 256Gb、40 核、40mbit LAN...

performance sql-server clustered-index insert nonclustered-index

7
推荐指数
2
解决办法
1635
查看次数

对于类型字符变化(5),我如何更正这个值太长?

我创建了一个用于实践的小型开发数据库。它有一个cities包含列cityname和的表state。该cityname中有“辛辛那提”,长的名字吧?

mytestdb=# SELECT * FROM cities;
 cityid |  cityname  | state
--------+------------+-------
 12345  | Cincinnati | Ohio
(1 row)
Run Code Online (Sandbox Code Playgroud)

我不清楚在尝试添加“旧金山”时如何以及为什么会收到此错误消息。

mytestdb=# INSERT INTO cities VALUES ('San Francisco','CA');
ERROR:  value too long for type character varying(5)
Run Code Online (Sandbox Code Playgroud)

postgresql insert postgresql-9.4

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

MySQL - 插入延迟 &lt;- 已弃用 现在怎么办?

我一直在看 MySQL 文档的https://dev.mysql.com/doc/refman/5.7/en/insert-delayed.html

我打算使用 INSERT DELAYED,但我发现这已被弃用。

我仍然需要这个功能来与一些处理一些非常大的数据传输的 PHP 代码兼容。我很高兴更新我的 PHP,但我现在不知道如何实现相同的功能。

既然它已被弃用,我们将如何实现与传统 INSERT DELAYED 相同的结果?

mysql insert mysql-5.7 bulk-insert

7
推荐指数
1
解决办法
5201
查看次数

仅当记录不存在时如何插入记录?

我有一张PaymentInformation桌子

ID   NAME       Start       End
1    Tina       1/7/2014    1/17/2014
2    Alice      3/7/2014    3/17/2014 
3    John       5/7/2014    5/17/2014 
4    Michelle   7/7/2014    7/17/2014 
Run Code Online (Sandbox Code Playgroud)

我正在动态构建我的 SQL 查询,如下所示:

SQLiteDataBaseQueryHolder3 = "INSERT INTO " + SQLiteHelper.TABLE2_NAME + "(" +
                            "name, Start, End" +
                            ")VALUES('" +
                            tempName + "'" +
                            ",'" +start + "'" +
                            ",'" + end + "" +
                            "')" +
                            " WHERE NOT EXISTS ( SELECT * FROM " +SQLiteHelper.TABLE2_NAME +" WHERE name = '"+
                            tempName+"' AND Start = '"+Start+"')"
Run Code Online (Sandbox Code Playgroud)

这给出了以下结果(为了可读性而格式化): …

sqlite insert duplication

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

PostgreSQL/Psycopg2 upsert 语法更新列

当出现 id 冲突时,我想让 Psycopg2 更新col1col2col3

在我的 Python 代码中,我目前的插入 SQL 为:

insert_sql = '''INSERT INTO {t} (id,col1,col2,col3)
        VALUES (%s,%s,NULLIF(%s, 'nan'), NULLIF(%s, 'nan'))
        ON CONFLICT (id)
        DO NOTHING;'''
Run Code Online (Sandbox Code Playgroud)

基本上我想设置而不是什么都不做:

(col1,col2,col3) = (%s,NULLIF(%s, 'nan'), NULLIF(%s, 'nan'))

忽略插入 ID 并更新 col1、col2 和 col3。问题是%s使用 Psycopg2 在 Python 中传递元组变量:

cur.execute(insert_sql.format(t='my_table'),(int(id),new_col1,new_col2,new_col3))
Run Code Online (Sandbox Code Playgroud)

用于引用%s对应于 col1、col2 和 col3 以更新 ON CONFLICT的语法是什么?

postgresql insert python upsert

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

规范是否允许 INSERT 上的列数不匹配?

我只是想知道如果您插入列数少于表提供列数,规范是否允许在INSERT语句中排除 column-list 子句我看到 PostgreSQL 有,而 MySQL 和 SQL Server 没有。

使用 PostgreSQL,(有效)

# CREATE TABLE t (a int, b int);
CREATE TABLE
# INSERT INTO t VALUES (42);  -- (b is set to DEFAULT)
INSERT 0 1
Run Code Online (Sandbox Code Playgroud)

使用 SQL Server,我得到

Msg 213 Level 16 State 1 Line 1
Column name or number of supplied values does not match table definition.
Run Code Online (Sandbox Code Playgroud)

使用 MariaDB,我得到

Column count doesn't match value count at row …
Run Code Online (Sandbox Code Playgroud)

postgresql mariadb sql-server insert sql-standard

6
推荐指数
1
解决办法
808
查看次数