那种方法效率高呢?

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,%'
这两种方法效率好像都不高啊,它们之中哪一个效率更高呢?不知道还有别的方法没?
...全文
155 11 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
看来这和记录的多少有关系啊。
我的新闻系统也打算做成一篇新闻对应多个类别,新闻数量要几十万,这样的话,用以上两种方法可能都不好,第二种我试过了,很慢,第一种还没有试。
像这样的问题,哪位还有高见?

34,588

社区成员

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

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