最快的方法是什么?
我现在做的是:
每秒导入大约60k-75k行,这还不够,但非常接近。我想打250.000排。
到目前为止还没有真正使用过。我得到20%的时间“网络I/O”块,有一个核心80%加载CPU端。光盘正在写入7MB-14兆字节,主要是闲置。6架猛禽中的10架RAID的平均队列长度是.0.25。
有谁知道如何加快速度吗?速度更快的服务器(到目前为止,它是虚拟的,8gb内存,4核,物理磁盘通过数据)。
增加一些澄清:
垂直分区是否会有所帮助,例如,通过一个字节(tinyint)将仪器宇宙分割成16个表,而我则同时执行多达16个插入操作?实际上,数据来自不同的交换,我可以在每个交换中创建一个分区。这将是一个自然分割的字段(实际上是在仪器中,但我可以在这里复制这些数据)。
一些更多的澄清:获得了更高的速度(90k),现在显然受到机器间网络IO的限制,这可能是VM交换。
我现在要做的是每32k行进行连接,设置一个临时表,用SqlBUlkdCopy插入到这个表中,然后使用一个sql语句复制到主表--最小化主表上的任何锁时间。
大多数等待时间现在仍在网络IO上。似乎我遇到了一些VM明智的问题。在未来几个月内将转向物理硬件;)
发布于 2011-01-27 20:39:26
如果你每秒管理70k行,那么到目前为止你是非常幸运的。但我怀疑这是因为你有一个非常简单的模式。
我真不敢相信你会问这样的负担
网络和CPU是共享的,IO受到限制:不能使用所有资源。你看到的任何负载统计数据都不是很有用。我怀疑您看到的网络负载是两个虚拟服务器之间的通信量,如果您解决这个问题,您将成为IO绑定
在我继续之前,先读一下这个从35 K tps中学到10次课程。他没有使用虚拟盒子。
这里是我要做的,假设没有SAN,没有DR能力,如果你想增加数量。
作为参考,我们的峰值负载是每小时1200万行(16核,16 in,SAN,x64),但是我们的负载很复杂。我们没有能力。
发布于 2012-07-18 17:43:25
从我在这里读到的答案来看,你似乎真的有硬件问题,而不是代码问题。理想情况下,通过提供更多磁盘I/O或网络带宽,或者在承载数据库的同一台虚拟机上运行程序,可以提高性能。
但是,我确实想分享这样的观点,即表参数插入对于大数据传输来说确实是理想的;虽然SqlBulkCopy看起来同样快,但它的灵活性要低得多。
我在这里写了一篇关于这个主题的文章:http://www.altdevblogaday.com/2012/05/16/sql-server-high-performance-inserts/
总的答案是,您大致想要创建一个表类型:
CREATE TYPE item_drop_bulk_table_rev4 AS TABLE (
item_id BIGINT,
monster_class_id INT,
zone_id INT,
xpos REAL,
ypos REAL,
kill_time datetime
)然后,创建一个存储过程,将表参数直接复制到实际表中,这样中间的步骤就更少了:
CREATE PROCEDURE insert_item_drops_rev4
@mytable item_drop_bulk_table_rev4 READONLY
AS
INSERT INTO item_drops_rev4
(item_id, monster_class_id, zone_id, xpos, ypos, kill_time)
SELECT
item_id, monster_class_id, zone_id, xpos, ypos, kill_time
FROM
@mytable后面的Server代码如下所示:
DataTable dt = new DataTable();
dt.Columns.Add(new DataColumn("item_id", typeof(Int64)));
dt.Columns.Add(new DataColumn("monster_class_id", typeof(int)));
dt.Columns.Add(new DataColumn("zone_id", typeof(int)));
dt.Columns.Add(new DataColumn("xpos", typeof(float)));
dt.Columns.Add(new DataColumn("ypos", typeof(float)));
dt.Columns.Add(new DataColumn("timestamp", typeof(DateTime)));
for (int i = 0; i < MY_INSERT_SIZE; i++) {
dt.Rows.Add(new object[] { item_id, monster_class_id, zone_id, xpos, ypos, DateTime.Now });
}
// Now we're going to do all the work with one connection!
using (SqlConnection conn = new SqlConnection(my_connection_string)) {
conn.Open();
using (SqlCommand cmd = new SqlCommand("insert_item_drops_rev4", conn)) {
cmd.CommandType = CommandType.StoredProcedure;
// Adding a "structured" parameter allows you to insert tons of data with low overhead
SqlParameter param = new SqlParameter("@mytable", SqlDbType.Structured);
param.Value = dt;
cmd.Parameters.Add(param);
cmd.ExecuteNonQuery();
}
}发布于 2011-01-20 13:59:05
表中是否有您可以不使用的索引?编辑:当你打字时询问。
是否有可能将价格转换为整数,然后除以1000或任何查询?
https://stackoverflow.com/questions/4747126
复制相似问题