数据库中标签系统的查找疑问

[复制链接]
查看11 | 回复2 | 2010-11-28 20:06:03 | 显示全部楼层 |阅读模式
SourceID(int) TagID(int)
数据库的结构如上,要实现多个TagID的查找。即找到 TagID 为1,而且为2的SourceID,在百万级别的记录上怎么实现这个查找呢?
数据库为 SQL2005
数据内容为这样的
SourceID
TagID
100000
1
100000
2
100001
1
SourceID 和 TagID 是多对多关系
感谢 摆渡浮桥 的回答。 索引是肯定有的。 加了索引可以让查找单条的速度变快,比如说 TagID = 1,这样的速度非常快。
但是涉及到组合查询速度就慢了,特别是组合查询里面的某一项结果集特别大的时候。
我现在用的方法是:
WITH arg1 AS(
SELECT * FROM tab WHERE TagID IN (1,2)
), arg2 AS(
SELECT SourceID,COUNT(*) as iCount FROM arg1 GROUP BY SourceID
)
SELECT SourceID FROM arg2 WHERE iCount = 2 ORDER BY SourceID DESC
这样的写法可以找出结果,但是如果TagID=1对应的结果数量太多(超过百万),就会导致查询速度非常慢。在我的电脑上需要超过1分钟才能得出结果

回复

使用道具 举报

千问 | 2010-11-28 20:06:03 | 显示全部楼层
只要在TagID和SourceID上建索引,就能很快查到,哪怕是百万级的记录数量。create index ix_table1_TagID_SourceID on table1(TagID asc, SourceID asc)查询优化器会自动利用这个索引,很快就能找到对应的记录。学习一下索引的结构,你就会明白为什么在百万级的记录里也能快速找到对应的记录。 根据你举的例子,还可以在SourceID和TagID上也建立索引。另外,如果中间结果的记录比较多,你可以不用CTE,改用临时表,并在临时表上创建合适的索引,性能会明显提升。
回复

使用道具 举报

千问 | 2010-11-28 20:06:03 | 显示全部楼层
SELECT *... 如果字段很多开销很大的,列出需要的字段就可以了加了索引可以让查找单条的速度变快,比如说 TagID = 1,这样的速度非常快。 说明起作用了啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行