标签: 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 更新col1、col2和col3。

在我的 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
查看次数