首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server插入查询慢(1500行,4.5秒)

Server插入查询慢(1500行,4.5秒)
EN

Stack Overflow用户
提问于 2011-11-11 09:22:30
回答 6查看 10.2K关注 0票数 2

我正在运行一个本地Server服务器,我正在做一个大约1500行的插入查询,这花费了如此长的时间,我真的很惊讶。我已经在这里搜索和搜索了很多想法和解决方案,但仍然发现它是缓慢的方式,我是说它的1500行!

我的问题是,有没有其他方法来插入这个数额?是否真的有太多行不能插入,所以我需要从csv文件中加载它?

My computer是Win7 32位,4GB内存,Core2Duo 1.86GHZ Server版本10.50.1617

优先查询

代码语言:javascript
复制
USE CustomerDB;

IF OBJECT_ID('Customer', 'U') IS NOT NULL
DROP TABLE Customer;

CREATE TABLE Customer
( 
CustomerID int PRIMARY KEY IDENTITY,
CustomerName nvarchar(16),
...about 130 more columns...
);

INSERT INTO Customer VALUES
('FirstCustomerName', ...),
...1500 more rows...
('LastCustomerName', ...)

在超过10分钟之后,我仍然没有完成查询,因为这显然是错误的。

第二个查询:

代码语言:javascript
复制
USE CustomerDB;

IF OBJECT_ID('Customer', 'U') IS NOT NULL
DROP TABLE Customer;

CREATE TABLE Customer
( 
CustomerID int PRIMARY KEY IDENTITY,
CustomerName nvarchar(16),
...about 130 more columns...
);

INSERT INTO Customer VALUES
('FirstCustomerName', ...);
INSERT INTO Customer VALUES
('SecondCustomerName', ...);
...1500 more ...
INSERT INTO Customer VALUES
('LastCustomerName', ...);

好的,下降到6.5秒,好多了,但是对于1500行来说还是很慢的。

第三个查询:

代码语言:javascript
复制
USE CustomerDB;

IF OBJECT_ID('Customer', 'U') IS NOT NULL
DROP TABLE Customer;

begin transaction Insert;

CREATE TABLE Customer
( 
CustomerID int PRIMARY KEY IDENTITY,
CustomerName nvarchar(16),
...about 130 more columns...
);

INSERT INTO Customer VALUES
('FirstCustomerName', ...);
INSERT INTO Customer VALUES
('SecondCustomerName', ...);
...1500 more ...
INSERT INTO Customer VALUES
('LastCustomerName', ...);

commit transaction Insert;

好的,到4.5-5秒,更好,但还是有点慢,我认为

我不是DB/ Server专家,所以这是我自己来的时候,帮助是非常感谢的!

编辑:因为我不是专家,4.5秒对于运行1500行的普通pc来说是相当长的时间吗?

EN

回答 6

Stack Overflow用户

发布于 2011-11-11 23:57:43

这个插入是缓慢的,因为您每次添加1行,并且它是完全记录的。瓶颈不是写入数据,而是在日志中写入您正在做的事情。

删除逐行插入并插入带有表锁的集:

代码语言:javascript
复制
INSERT TABLENAME WITH(TABLOCK) (Column1,Column2,...)
 SELECT 'Column1Row1Value','Column2Row1Value'...
 UNION ALL
 SELECT 'Column1Row2value','Column2Row2Value'...
 UNION ALL
 SELECT 'Column1Row3value','Column2Row3Value'...

此外,查看最低日志记录事务的规则。

票数 3
EN

Stack Overflow用户

发布于 2011-11-11 20:16:21

与其执行单独的insert语句,您很可能希望这样做:

代码语言:javascript
复制
INSERT INTO Customer 
SELECT 'FirstCustomerName', ...
UNION
SELECT '2ndCustomerName', ...
UNION
SELECT '3rdCustomerName', ...
...1500 more rows...

这应该要快得多。

票数 1
EN

Stack Overflow用户

发布于 2014-11-26 08:24:02

根据我的理解,你的列数是有意义的。但你还是要检查以下几点对你有帮助。

  1. 如果一行大小超过8kb(页的大小),则sql被迫创建多一个页面来存储单个行。
  2. 检查未使用的char数据类型,其中存在可变数据长度值( char列的总长度将存储在该空间中,这将增加大小)。
  3. 除非和直到您期望行中有如此庞大的数据,否则请避免使用Varchar(max)。如果不启用row属性中的文本,则varchar(max)、nvarchar(max)、图像存储在不同的页面中。
  4. 这是一个基于行和数据大小的巨大时间。

请确认这些步骤,如果需要帮助,请回来.

就SQL :)而言,1500是一个非常小的数字。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8091894

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档