首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从.NET代码插入Server表的最快方法?

从.NET代码插入Server表的最快方法?
EN

Stack Overflow用户
提问于 2011-01-20 12:30:20
回答 6查看 4.5K关注 0票数 11

最快的方法是什么?

  • 一个表,没有不能预先填充的引用(即那里有一个引用键,但我已经填写了所有的数据)
  • 很多数据。我们每天讨论数亿行,通过API动态地进入。
  • 在近乎实时的情况下,请求必须/应该在可行的情况下尽快处理(即不将文件写入文件以供每天上传一个)。2秒是正常的最大延迟。
  • 数据/应用程序和Server的独立机器

我现在做的是:

  • 将最多32*1024行聚合到一个数组中,然后将其排队。
  • 以2-3个线程读取队列。使用SqlBulkCopy插入数据库。

每秒导入大约60k-75k行,这还不够,但非常接近。我想打250.000排。

到目前为止还没有真正使用过。我得到20%的时间“网络I/O”块,有一个核心80%加载CPU端。光盘正在写入7MB-14兆字节,主要是闲置。6架猛禽中的10架RAID的平均队列长度是.0.25。

有谁知道如何加快速度吗?速度更快的服务器(到目前为止,它是虚拟的,8gb内存,4核,物理磁盘通过数据)。

增加一些澄清:

  • 这是一个2008 R2企业server,位于2008年R2服务器上。机器有4个核心,8gb内存。全部64位。80%的负载平均来自这台机器,显示了大约20%的cpu负载。
  • 该表很简单,没有主键,只有关系引用上的索引(仪器引用)和唯一的(在一组仪器中,因此不强制执行)时间戳。
  • 表中的字段是:时间戳、仪器引用(没有强制外键)、数据类型(char 1,表明发布了什么数据的许多字符之一)、价格(double)和数量(int)。如你所见,这是张很薄的桌子。所涉及的数据是金融工具的滴答数据。
  • 问题还在于硬件等--主要是因为我没有看到真正的瓶颈。我正在插入多个事务,它给了我一个好处,但一个小的。光盘,CPU没有显示出很大的负载,网络io等待很高(300 is /秒,目前是30% ),但这是在同一个虚拟化平台上运行JSUT两台服务器,并有足够的核心运行所有。我很乐意“买另一台服务器”,但我想先找出瓶颈.特别是在一天结束的时候,我并没有抓住瓶颈是什么。日志记录与此无关--批量插入不会以数据形式进入数据日志(没有聚集索引)。

垂直分区是否会有所帮助,例如,通过一个字节(tinyint)将仪器宇宙分割成16个表,而我则同时执行多达16个插入操作?实际上,数据来自不同的交换,我可以在每个交换中创建一个分区。这将是一个自然分割的字段(实际上是在仪器中,但我可以在这里复制这些数据)。

一些更多的澄清:获得了更高的速度(90k),现在显然受到机器间网络IO的限制,这可能是VM交换。

我现在要做的是每32k行进行连接,设置一个临时表,用SqlBUlkdCopy插入到这个表中,然后使用一个sql语句复制到主表--最小化主表上的任何锁时间。

大多数等待时间现在仍在网络IO上。似乎我遇到了一些VM明智的问题。在未来几个月内将转向物理硬件;)

EN

回答 6

Stack Overflow用户

发布于 2011-01-27 20:39:26

如果你每秒管理70k行,那么到目前为止你是非常幸运的。但我怀疑这是因为你有一个非常简单的模式。

我真不敢相信你会问这样的负担

  • 虚拟服务器
  • 单阵
  • SATA磁盘

网络和CPU是共享的,IO受到限制:不能使用所有资源。你看到的任何负载统计数据都不是很有用。我怀疑您看到的网络负载是两个虚拟服务器之间的通信量,如果您解决这个问题,您将成为IO绑定

在我继续之前,先读一下这个从35 K tps中学到10次课程。他没有使用虚拟盒子。

这里是我要做的,假设没有SAN,没有DR能力,如果你想增加数量。

  • 购买两台大型植物服务器,CPU内存类型无关,最大内存,去x64安装。
  • 磁盘+控制器=最快的主轴,最快的SCSI。或者是巨大的NAS
  • 1000+NIC
  • RAID 10,磁盘为6-10,用于一个日志文件,用于仅用于数据库的
  • 剩余磁盘RAID 5或RAID 10用于数据文件

作为参考,我们的峰值负载是每小时1200万行(16核,16 in,SAN,x64),但是我们的负载很复杂。我们没有能力。

票数 4
EN

Stack Overflow用户

发布于 2012-07-18 17:43:25

从我在这里读到的答案来看,你似乎真的有硬件问题,而不是代码问题。理想情况下,通过提供更多磁盘I/O或网络带宽,或者在承载数据库的同一台虚拟机上运行程序,可以提高性能。

但是,我确实想分享这样的观点,即表参数插入对于大数据传输来说确实是理想的;虽然SqlBulkCopy看起来同样快,但它的灵活性要低得多。

我在这里写了一篇关于这个主题的文章:http://www.altdevblogaday.com/2012/05/16/sql-server-high-performance-inserts/

总的答案是,您大致想要创建一个表类型:

代码语言:javascript
复制
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
)

然后,创建一个存储过程,将表参数直接复制到实际表中,这样中间的步骤就更少了:

代码语言:javascript
复制
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代码如下所示:

代码语言:javascript
复制
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&#039;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();
    }
}
票数 2
EN

Stack Overflow用户

发布于 2011-01-20 13:59:05

表中是否有您可以不使用的索引?编辑:当你打字时询问。

是否有可能将价格转换为整数,然后除以1000或任何查询?

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

https://stackoverflow.com/questions/4747126

复制
相关文章

相似问题

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