不迎不送,来去自便,无茶无酒,谈笑随缘

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
 

当某个表中存在标志表格中记录不同状态的判断性字段的时候,可以采用两种不同的数据库组织形式。

方法一、将两种不同状态的记录分别存储到两个表格中,然后通过C#判断选择某一个表格并执行查询操作。

方法二、.将所有记录同时存储到一个表中,添加字段State来区分表格中记录的两种状态,查询全部交给数据库管理系统。
究竟这两种方法哪一种查询速度更快,一直以来都没有时间验证,趁着跳槽报道前有一段休息时间,研究一下。。。

设计实验如下:
创建表Product,结构如下:
Create Table Product
(
 Product_ID bigint IDENTITY(1,1) Primary Key,
 Name Varchar(100) not null,
 Type int,  /*产品类型*/
 OldPrice float , /*原有价值 这里为书籍定价*/
 Quantity int,  /*产品数量 默认是1*/
 Address Varchar(100), /*产品产地 这里为出版社地址*/
 ImagePath Varchar(100), /*图片地址*/
 Date DateTime,  /*产品登记时间*/
 Detail Text,  /*产品简单描述*/
 State int,  /*产品状态 0:仓库中 1:发布*/
 IsRepair int,  /*是否保修*/
 IsInvoice int,  /*是否有发票*/
 NewOld float,  /*新旧程度*/
 State varchar(10) /*状态*/
)
Product中的State属性只取"Have"或"Want"两个值分别表示记录的两种不同状态,两种状态的记录总数基本相同。创建HaveProduct和WantProduct两个表格,除没有State字段外,两个表格结构与Product相同。通过C#中的Random类随机插入100万条数据到表Product中,State字段随机填入"Have"和"Want",然后再分别向表HaveProduct和WantProduct随机插入50W条记录。

对表Product执行20000次如下操作,并每操作1000次记录一次执行时间。
string strState=GetRandomState();  //随机生成状态
string strID=GetRandomID();   //随机生成主键ID
SqlCommand sqlComm=...
string strSQL="Select * From Product Where State='"+strState+"' And Product_Id='"+strID+"'";
sqlComm.ExecuteNonQuery(strSQL)
重复执行6次上述操作,记录数据如下,单位为千分之一秒。
试验1:
BeginTime:35:59:515
485、421、391、422、391、375、390、391、390、407、390、391、375、391、375、421、375、547、407、468
OverTime:36:8:218
平均时间:410.15

试验2:
BeginTime:39:17:46
422、407、437、406、391、391、406、390、375、407、375、390、391、391、390、391、406、406、407、390
OverTime:39:25:15
平均时间:398.45

试验3:
BeginTime:39:48:671
422、407、421、375、391、406、391、391、421、407、437、422、391、390、391、391、406、375、390、391
OverTime:39:56:687
平均时间:400.8

试验4:
BeginTime:40:5:187
422、406、469、391、390、391、375、390、407、375、406、391、390、391、390、391、375、391、406、375
OverTime:40:13:109
平均时间:396.1

试验5:
BeginTime:40:21:234
422、422、422、375、390、391、375、390、375、391、391、390、407、406、390、391、406、391、391、390
OverTime:40:29:140
平均时间:395.3

试验6
BeginTime:40:35:531
437、407、453、390、375、391、406、391、406、422、391、406、422、406、375、391、390、406、391、391
OverTime:40:43:578
平均时间:402.35

6次实验平均执行时间:400.525


对表HaveProduct和WantProduct执行20000次如下操作,并每操作1000次记录一次执行时间。
string strState=GetRandomState();  //随机生成状态
string strID=GetRandomID();   //随机生成主键ID
if (strState=="Have")
   strSQL="Select * From HaveProduct Where Product_Id='"+strID+"'";
else if (strState=="Want")
   strSQL="Select * From WantProduct Where Product_Id='"+strID+"'";
sqlComm.ExecuteNonQuery(strSQL)
重复执行6次上述操作,记录数据如下,单位为千分之一秒。
试验1:
BeginTime:19:40:0
453、437、422、953、594、547、828、437、407、453、437、703、516、469、515、454、437、422、422、515
OverTime:19:51:421
平均时间:521.05

试验2:
BeginTime:22:6:656
437、469、484、469、469、453、422、422、484、406、407、422、421、438、406、422、422、484、422、438
OverTime:22:15:453
平均时间:439.85

试验3:
BeginTime:22:25:218
453、438、469、422、421、422、407、421、422、422、406、422、422、422、422、406、422、406、422、406
OverTime:22:33:671
平均时间:422.65

试验4:
BeginTime:23:1:781
453、437、438、422、437、485、406、406、422、406、407、406、406、422、422、406、406、407、406、422
OverTime:23:10:203
平均时间:421.1

试验5:
BeginTime:23:41:468
453、438、469、422、406、422、422、421、407、437、422、422、437、407、422、437、422、422、406、422
OverTime:23:49:984
平均时间:425.8

试验6:
BeginTime:23:55:937
453、453、438、453、437、422、422、422、422、422、422、422、421、422、407、406、422、406、406、422
OverTime:24:4:437
平均时间:425

6次实验平均执行时间:442.575 

从上面的实验数据可以看出来,就执行速度而言,完成同样的任务,第一种方法执行1000次所需时间比第二种方法少用了0.04205秒,速度提高了9.89% 。由此可见,在数据量不大(小于100W条)的情况下,无论从数据库的易维护性还是查询执行效率来看,能够合并成一个表格时应该尽量合并成一个表格。表格中字段过多造成的操作不便,可以采用创建视图的方法来处理,尽量避免建立新的表格。 

posted on 2006-12-27 21:47  wude  阅读(207)  评论(0编辑  收藏  举报