扫描DataTable的速度测试

近日要做了两个小项目,都是针对大数据表(mssql 一般在千W以上)进行扫描,收集信息.

自我感觉对于全表扫描也有了小小的感觉.现将其总结于下.

功能介绍:假设内存中加载了1000条数据,仅有字段UrlPath (varchar),实现的功能等于sql语句:select urlpath,count(urlpath) from urldata group by urlpath ,勿喷,向下看.

个人使用的两种方法:

1,使用字段标记(select top 1000 urlpath,0 as Dealed from urldata)

2.使用Remove将处理过的DataRow移出DataTable

我要的是测试他们的运算时间是多少!!!

下面附上代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Data;
using System.Data.SqlClient;

namespace DBTest
{
class Program
{
private static DataTable table;

static void Main(string[] args)
{
GetTable();
Start();
Console.Read();
}

static void GetTable()
{
Stopwatch sw = new Stopwatch();
sw.Start();
string connstr = "Data Source=localhost;Initial Catalog=BigTable;Persist Security Info=True;User ID=***;Password=***";
SqlConnection conn = new SqlConnection(connstr);

SqlCommand command = new SqlCommand("select top 1000 * ,0 as dealed from urldata ",conn);
SqlDataAdapter sda = new SqlDataAdapter(command);
DataSet ds = new DataSet();
sda.Fill(ds);
table = ds.Tables[0];
sw.Stop();
Console.WriteLine("加载数据:{0}",sw.ElapsedMilliseconds);
}

static void Start()
{
Stopwatch sw = new Stopwatch();
sw.Start();
SignTest();
sw.Stop();
Console.WriteLine("字段标记:{0}",sw.ElapsedMilliseconds);

sw.Reset();
sw.Start();
RemoveTest();
sw.Stop();
Console.WriteLine("记录移出:{0}",sw.ElapsedMilliseconds);

}

static void RemoveTest()
{
DataRow[] rows;
string urlpath=string.Empty;

while (table.Rows.Count > 0)
{
//Console.Write(table.Rows.Count);
rows=null;
urlpath=table.Rows[0]["UrlPath"].ToString();
//将使用hashtable/Dictionary来处理
rows=table.Select("urlpath='"+urlpath+"'");
foreach(DataRow row in rows)
{
table.Rows.Remove(row);
}
}
}

static void SignTest()
{
DataRow[] rows;
string urlpath = string.Empty;
foreach (DataRow row in table.Rows)
{
if (row["dealed"].ToString() == "1")
continue;
urlpath = row["Urlpath"].ToString();
rows = table.Select("urlpath='" + urlpath + "'");

foreach (DataRow row2 in rows)
{
row2["dealed"] = 1;
}
}
}
}
}

现在看一下执行结果

到了这里,请容我说句脏话,好JB慢.

内容到此结束.

在此厚颜求高手指教更好的全表扫描的方法,只用SQL完成不行(1000W的记录分个组就搞死人家数据库了难过),只要有理,请喷!!!

转载请注明出处.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在C#中,DataTable是一个用于存储和操作表格数据的类。如果你想在DataTable中进行递归操作,可以使用递归函数来实现。以下是一个示例代码,展示如何通过递归遍历DataTable的所有行和列: ```csharp public static class DataTableHelper { public static void RecursivePrint(DataTable dataTable) { RecursivePrint(dataTable, 0, ""); } private static void RecursivePrint(DataTable dataTable, int level, string indent) { foreach (DataRow row in dataTable.Rows) { Console.WriteLine($"{indent}Level: {level}"); foreach (DataColumn column in dataTable.Columns) { Console.WriteLine($"{indent}{column.ColumnName}: {row[column]}"); } if (row.GetChildRows("ChildRelation").Length > 0) { RecursivePrint(row.GetChildRows("ChildRelation")[0].Table, level + 1, indent + "\t"); } } } } ``` 在上面的代码中,`RecursivePrint`方法用于递归遍历DataTable的行和列。它接受一个DataTable对象作为参数,并使用一个额外的私有递归函数`RecursivePrint`来实现递归。 在递归函数中,我们首先打印当前层级(level),然后遍历每一行并打印每一列的值。如果当前行有子行(通过一个名为"ChildRelation"的关系进行关联),我们会继续递归调用`RecursivePrint`并传递子行所属的表格、下一个层级(level + 1)和缩进字符串(indent + "\t")。 以下是一个示例用法: ```csharp DataTable dataTable = new DataTable(); dataTable.Columns.Add("ID", typeof(int)); dataTable.Columns.Add("Name", typeof(string)); dataTable.Columns.Add("ParentID", typeof(int)); dataTable.Rows.Add(1, "Item 1", 0); dataTable.Rows.Add(2, "Item 2", 0); dataTable.Rows.Add(3, "Subitem 1", 1); dataTable.Rows.Add(4, "Subitem 2", 1); dataTable.Rows.Add(5, "Subitem 3", 2); DataRelation relation = new DataRelation("ChildRelation", dataTable.Columns["ID"], dataTable.Columns["ParentID"]); dataTable.ChildRelations.Add(relation); DataTableHelper.RecursivePrint(dataTable); ``` 上面的代码创建了一个包含ID、Name和ParentID列的DataTable,并添加了一些行。然后,创建了一个关系("ChildRelation"),将ID列与ParentID列关联起来。 最后,调用`RecursivePrint`方法来递归打印DataTable的内容,结果将会以层级结构打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值