设为首页 加入收藏

TOP

关于SQL函数效率的一些测试与思考 (一)
2014-11-24 00:34:12 来源: 作者: 【 】 浏览:26
Tags:关于 SQL 函数 效率 一些 测试 思考
在项目中我们经常能遇到 数据库有“一对多”的关系,比如下面两张表:


Student:

ID StuName ClassID
1 张三 1
2 张三 2
3 李四 1
4 王五 2
5 王五 1



Class:

ID ClassName
1 数学
2 语文
3 英语



Class-Student就这样构成了一个简单的一对多关系。当然在实际的项目中,也可以再建立一张Relation表来保存他们之间的关系,在这里为了简单,就不做Relation表了。


现在在项目中,我需要将Class表中的数据list显示,当然也想显示选择了这门课的Student的StuName。也可以说是将一对多关系转换为一对一关系。我所期望的显示格式是这样的:

ID ClassName StuName
1 数学 张三,李四,王五
2 语文 张三,王五
3 英语 NULL


要做到这一点并不难,大体有两种思路:

1、在数据库中写一个函数
2、在程序中获取表Class与表Student所有数据,然后对比ClassID

那么,那种方法效率比较高呢?于是我写了下面的代码来进行一个简单的测试
View Code
class Program
{
static void Main(string[] args)
{
Sql sql = new Sql();
Stopwatch time1 = new Stopwatch();
Stopwatch time2 = new Stopwatch();
for (int j = 0; j < 10; j++)
{
time2.Start();
for (int i = 0; i < 1000; i++)
{
string sql1 = "select ID,[StuName],[ClassID] FROM [Student]";
string sql2 = " SELECT ID,ClassName from Class";
List item = new List();
string bl="";
DataTable dt1 = sql.getData(sql1);
DataTable dt2 = sql.getData(sql2);
foreach (DataRow dtRow2 in dt2.Rows)
{
foreach (DataRow dtRow1 in dt1.Rows)
{
if (dtRow1["ClassID"].ToString() == dtRow2["ID"].ToString())
{
bl+=dtRow1["StuName"].ToString()+",";
}
}
item.Add(bl);
bl = "";
}
}
time2.Stop();
Console.WriteLine(time2.Elapsed.ToString());

time1.Start();
for (int i = 0; i < 1000; i++)
{
string sql3 = "SELECT C.ID, C.ClassName, dbo.f_getStuNamesByClassID(C.ID)as stuName FROM Class C";
DataTable dt = sql.getData(sql3);
}
time1.Stop();
Console.WriteLine(time1.Elapsed.ToString());

float index = (float)time1.Elapsed.Ticks / (float)time2.Elapsed.Ticks;
Console.WriteLine("效率比" + index.ToString());
Console.WriteLine("=============================");
}

Console.ReadLine();
}
}
复制代码
View Code
class Sql
{
public DataTable getData(string sql)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Data Source=.\\SQLEXPRESS;Initial Catalog=Test;User Id=sa;Password=1;";
SqlCommand comm = new SqlCommand(sql, conn);
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(comm);
DataSet ds = new DataSet();
da.Fill(ds, "ds");
conn.Close();
return ds.Tables[0];
}
}
复制代码
View Code
--根据课程ID,返回选此课程的学生的名字,以逗号隔开
ALTER function [dbo].[f_getStuNamesByClassID] (@ID int)
RETURNS nvarchar(50)
begin
declare @Result nvarcha
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇数据库约束和视图问题 下一篇将视图查询出来的结果存入数据库..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: