在一次快照中向数据表添加多个空行(sql如何比循环更快地插入数据)

本文关键字:何比 sql 循环 数据 插入 快照 一次 添加 数据表 | 更新日期: 2023-09-27 18:21:24

如何在数据表中添加多个空行?我的情况是这样的。我有一个sql查询,它生成了一个数据集。它有4个表要连接,大约有100000行要显示。当向用户显示结果时,我需要在数据表中嵌入一些字段。所以我用我需要的字段创建一个新的数据表,在第一个字段中循环,在第二个字段中创建新行。我正在使用它作为网格的数据源。但我可以看到sql运行它的查询,并使结果集比我的循环更快(它处理查询并在RAM中创建行),比我的简单循环(仅创建行)快得多。为什么是这样?我该如何提高速度?我怀疑是条件检查,所以我把它们拿走了。尽管如此,我还是得到了同样的结果。

示例代码

这个问题太大了,如果我分享的话,这违反了公司的政策。因此,我将展示代码的一些部分,这些部分将解释的情况

select ItemCode,Sku from tblStock ts join tblItemGroup im on ts.ItemCode=im.ItemCode

正在获取数据集dsItems

创建表格dtGridItems

dtGridItems = new DataTable();
 dtGridItems.Columns.Add("ImgPath", typeof(String));
 dtGridItems.Columns.Add("ItemCode", typeof(String));
 dtGridItems.Columns.Add("sku", typeof(Long));

然后像一样填充数据表

foreach (DataRow drItem in dsItems.Tables[0].Rows)
{
 DataRow drGridItem = dtGridItems.NewRow();
if(drGridItem["ItemCode"]=="SHIRTS"){
drGridItem["ImgPath"] = Shirts path;
}else if(drGridItem["ItemCode"]=="Pants"){
drGridItem["ImgPath"] = Pants path;
}
drGridItem["ItemCode"] = drItem["ItemCode"];
drGridItem["sku"] = drItem["sku"];
dtGridItems.Rows.Add(drGridItem);
}

这就是我使用的方式。图片肯定不是我使用的专栏。但如果我需要解释实际的代码,我需要解释我们软件的很大一部分。那么只有我能解释为什么这个要求会出现在这里。

第二次编辑----

由于问题仍未明确

如果我的问题不清楚,很抱歉。我不是想把一张桌子复制到另一张桌子上。我正在尝试在.net中从表到数据集。我的问题不是sql server的效率。我的问题是数据表(在.net中)填充如何比手动填充数据集更快地工作。有没有一种方法可以一次在数据表中创建"n"行并通过循环填充它们?我可以在数据行中的单个快照中设置多列数据吗?

在一次快照中向数据表添加多个空行(sql如何比循环更快地插入数据)

将多行从另一个表插入到一个表中的快速SQL Only方法类似于。

SELECT Field1, Field2, Field3
INTO Table2(Field1, Field2, Field3)
FROM Table1
WHERE ...

请注意,生成数据的查询可能非常复杂,只需添加INTO Table(Field, Field)行即可将结果通过管道传输到表中,而不是返回到客户端。

使用原始SQL命令从.Net执行此操作应该需要相同的执行时间(加上将命令发送到服务器和解析响应的琐碎开销)。

当然,手动循环通过客户端的任何内容并按项目执行操作会慢得多——现在每行都有相同的开销。

ORM传统上也不擅长对数据进行批量更改,因为它们倾向于检查每个对象的状态并发出单独的更新语句(与循环中相同,只是通常每个项目处理更多)。

有一些方法可以减少开销(连接池是主要的候选者),但你只是在减轻问题。

简而言之,如果您希望SQL一次性完成所有处理,则需要向它发送一次性完成处理所需的所有信息。。。

编辑

我不知道框架使用的所有优化,但其中一个叫做LazyLoading。它在使用数据时填充数据,而不是在定义请求时填充数据。更多详细信息。

简而言之,它不是加载所有数据,而是用应该检索的数据的引用填充对象。

Eg而不是像。。。

DataSet = //SELECT Firstname, Lastname, Age from Contacts
Firstname = John, Lastname = Smith, Age = 32
Firstname = Mike, Lastname = Jones, Age = 18

等等。。。

它用填充它们

Firstname = (SELECT Firstname, Lastname, Age from Contacts)[0].Firstname,
Lastname = (SELECT Firstname, Lastname, Age from Contacts)[0].Lastname,
Age = (SELECT Firstname, Lastname, Age from Contacts)[0].Age

然后,当你实际使用该属性时。。。

String Name = String.format("{0} {1}", Data[0]['Firstname'], Data[0]['Lastname']);

它检索所需的特定值。在上面的例子中,从数据库中读取年龄从来都不麻烦。

看看IQueryable接口以及它是如何用于实现延迟加载的。