当前位置:数据库 > SQLServer >>

关于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<string> item = new List<string>();
                    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("========
Oracle
MySQL
Access
SQLServer
DB2
Excel
SQLite
SYBASE
Postgres
如果你遇到数据库难题:
请访问www.zzzyk.com 试试
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,