那种方法效率高呢?

xunua 2005-06-14 09:38:15
A表的主键是aID,B表的主键是bID
A表中有5万条记录,B表是个类别表,有大概100条记录
A表中的记录要和B表中的多条记录关联,就是A表中的记录可以对用多个类别
方法1:创建一个关系表R,里面放aID和它对应的多个bID
方法2:在A表中放一个varchar的字段strBID,存放与它关联的bID的字符串,比如'3,4,26,188'
这样,如果我要检索包含bID为7的A表中的记录,
方法1就得用到in,如select * from A where aID in(select aID from R where bID = 7)
方法2就要用到like,如select * from A where ',' + strBID + ',' like '%,7,%'
这两种方法效率好像都不高啊,它们之中哪一个效率更高呢?不知道还有别的方法没?
...全文
162 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
hglhyy 2005-06-14
  • 打赏
  • 举报
回复
改为
select * from A where exists(select 1 from R where R.bID = 7 and R.aID=A.aID)

效率会高点,因为exists 不会扫描表记录!
xunua 2005-06-14
  • 打赏
  • 举报
回复
多谢
phantomMan 2005-06-14
  • 打赏
  • 举报
回复
对第一种方法,还可以建立索引来优化数据库设计,比如对AID建立索引(假如A表中AID的值比较集中而且修改不频繁,可以考虑建聚簇索引,这样速度更快);
然后在使用exists查询
子陌红尘 2005-06-14
  • 打赏
  • 举报
回复
纠正一下偶在楼上写错的地方:

用第一种方式查询会关联两张表A & R
用第二种方式查询只涉及一张表A
wangdehao 2005-06-14
  • 打赏
  • 举报
回复
第一种方法好,楼主可以改成exists的形式:
select * from A where exists(select 1 from R where R.bID = 7 and R.aID=A.aID)
性能可能有些提高
子陌红尘 2005-06-14
  • 打赏
  • 举报
回复
使用方法1时,查询涉及了3张表,记录比例估算为50,000:200,000[衍生出的关联表R]:100,合理的设计索引及建立主外键关联,查询会使用索引查找
使用方法2时,查询只涉及2张表,记录比例为50,000:100,查询会导致对A表的全表扫描

至于哪一个查询的效率更高:
假设在A表中的50,000条记录中4%符合查询条件,也就是说,方法1衍生出的关联表R中有约2,000条记录符合限定条件,那么使用第一个方法应该效率更高。
假设在A表中的50,000条记录中50%乃至更多符合查询条件,也就是说,方法1衍生出的关联表R中有约25,000条乃至更多记录符合限定条件,那么使用第一个方法到底还高不高就只能由查询分析器执行结果来论定了。

一个查询的效率是否高,不单与表结构的设计相关,也与表中的数据密切相关。

BTW:
查询
select * from A where aID in(select aID from R where bID = 7)
改为
select * from A where exists(select * from R where aID=A.aID and bID=7)
效率会高一些
xunua 2005-06-14
  • 打赏
  • 举报
回复
',' + strBID + ',' like '%,7,%'
在strBID的左右已经加上','了。

我在本机上做了一下测试,分别执行1000以上查询语句,无论是否在strBID上加索引(聚簇还是非聚簇),都是第1种方法快,要比第二种快1倍以上。不禁怀疑,既便in效率低,但是对字符串查询总比不上对数字查询
phantomMan 2005-06-14
  • 打赏
  • 举报
回复
不过我见到的大部分数据库程序都是按照第一种方式来写的;
系统数据库 msdb 好像也是这样写的
phantomMan 2005-06-14
  • 打赏
  • 举报
回复
Sorry,看错了,原来是 '%,7,%',
不过假如有'7,575,234'或者在后面'34,677,7'呢,不会每种情况都判断把
phantomMan 2005-06-14
  • 打赏
  • 举报
回复
第二种方法肯定是不行的,因为假如有 '7,77,77,123123'这种字符串,你怎么分辨呢?假如其他也有这种呢? '13123,75,7234,98'
xunua 2005-06-14
  • 打赏
  • 举报
回复
看来这和记录的多少有关系啊。
我的新闻系统也打算做成一篇新闻对应多个类别,新闻数量要几十万,这样的话,用以上两种方法可能都不好,第二种我试过了,很慢,第一种还没有试。
像这样的问题,哪位还有高见?
具体内容请参考我的BLOG:http://blog.csdn.net/smallwhiteyt/archive/2009/11/08/4784771.aspx 如果你耐心仔细看完本文,相信以后再遇到导出EXCLE操作的时候你会很顺手觉得SO EASY,主要给新手朋友们看的,老鸟可以直接飘过了,花了一晚上的时间写的很辛苦,如果觉得对你有帮助烦请留言支持一下,我会写更多基础的原创内容来回报大家。 C#导出数据到EXCEL表格是个老生常谈的问题了,写这篇文章主要是给和我一样的新手朋友提供两种导出EXCEL的方法并探讨一下导出的效率问题,本文中的代码直接就可用,其中部分代码参考其他的代码并做了修改,抛砖引玉,希望大家一起探讨,如有不对的地方还请大家多多包涵并指出来,我也是个新手,出错也是难免的。 首先先总结下自己知道的导出EXCEL表格的方法,大致有以下几种,有疏漏的请大家补充。 1.数据逐条逐条的写入EXCEL 2.通过OLEDB把EXCEL做为数据源来写 3.通过RANGE范围写入多行多列内存数据到EXCEL 4.利用系统剪贴板写入EXCEL 好了,我想这些方法已经足够完成我们要实现的功能了,方法不在多,在精,不是么?以上4中方法都可以实现导出EXCEL,方法1为最基础的方法,意思就是效率可能不是太高,当遇到数据量过大时所要付出的时间也是巨大的,后面3种方法都是第一种的衍生,在第一种方法效率低下的基础上改进的,这里主要就是一个效率问题了,当然如果你数据量都很小,我想4种方法就代码量和复杂程度来说第1种基本方法就可以了,或当你的硬件非常牛逼了,那再差的方法也可以高效的完成也没有探讨的实际意义了,呵呵说远了,本文主要是在不考虑硬件或同等硬件条件下单从软件角度出发探讨较好的解决方案。

34,871

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧