大哥们!大量数据 中使用 distinct 或 Group By ,应该怎么办呀?

Longchao 2009-03-09 06:50:40
我两个表,
一个是 分类表 Cls
一个是 产品表 Pro

分类表 Cls 里有 8000 条信息
产品表 Pro 里有 400多万条信息

产品表 Pro 里有一个字段 Pro.ClsId 用来关联Cls.Id的

现在要执行:
Select distinct(ClsId) From [Pro] Where CONTAINS(Name , '锁')

Select ClsId From [Pro] Where CONTAINS(Name , '锁') Group By ClsId

总是查询超时,请问各位大大,有没有办法解决呢?
能解决就可以了。不管用什么方法!
急急急。。。。
...全文
437 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
htl258_Tony 2009-03-10
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 sdhdy 的回复:]
除了索引外,再想想别的办法,比如为什么Pro表要放400W记录?
[/Quote]
赞同,应该想想办法,比如创建一个历史表,把不常查询的存放在历史表,查询的时候同样可以调用。
sdhdy 2009-03-10
  • 打赏
  • 举报
回复
除了索引外,再想想别的办法,比如为什么Pro表要放400W记录?
wojiaochenglong 2009-03-10
  • 打赏
  • 举报
回复
索引是应该建了,另外,CONTAINS(Name , '锁')耗时多
Longchao 2009-03-10
  • 打赏
  • 举报
回复
UP
sigmod 2009-03-09
  • 打赏
  • 举报
回复
这是fulltext search,不是 like '%锁%', 全文索引会被利用的

[Quote=引用 7 楼 ruihuahan 的回复:]
CONTAINS(Name , '锁')
==========================
这个条件很不好,能换成类似 like ‘锁%'吗?
[/Quote]
ruihuahan 2009-03-09
  • 打赏
  • 举报
回复
CONTAINS(Name , '锁')
==========================
这个条件很不好,能换成类似 like ‘锁%'吗?
肥龙上天 2009-03-09
  • 打赏
  • 举报
回复

没有必要时不要用DISTINCT和ORDER BY,这些动作可以改在客户端执行。它们增加了额外的开销。这同UNION和UNION ALL一样的道理。

一般在GROUP BY和HAVING字句之前就能剔除多余的行,所以尽量不要用它们来做剔除行的工作。他们的执行顺序应该如下最优:
select 的Where字句选择所有合适的行,Group By用来分组个统计行,Having字句用来剔除多余的分组。
这样Group By和Having的开销小,查询快.对于大的数据行进行分组和Having十分消耗资源。如果Group BY的目的不包括计算,只是分组,那么用Distinct更快
Longchao 2009-03-09
  • 打赏
  • 举报
回复
建立索引了
等不到来世 2009-03-09
  • 打赏
  • 举报
回复
换其它条件也超时吗?
重建一下全文索引试试。调整一下因子
sigmod 2009-03-09
  • 打赏
  • 举报
回复
读多,还是写多?
如果读多,建materialized view

IF OBJECT_ID('dbo.m_view_pro') IS NOT NULL
DROP VIEW dbo.m_view_pro;
GO

CREATE VIEW dbo.m_view_pro
WITH SCHEMABINDING
AS
Select distinct(ClsId) From [Pro] Where CONTAINS(Name , '锁')
Go

CREATE VIEW dbo.m_view_pro_distinct
WITH SCHEMABINDING
AS
SElECT ClsId FROM [Pro] WHERE CONTAINS(Name , '锁') Group BY ClsId
Go

CREATE UNIQUE CLUSTERED INDEX idx_clsid
ON dbo.m_view_pro_distinct(ClsId);
Go

CREATE UNIQUE CLUSTERED INDEX idx_clsid
ON dbo.m_view_pro(ClsId);
Go
htl258_Tony 2009-03-09
  • 打赏
  • 举报
回复
CREATE INDEX au_id_ind ON  [Pro] (name)
--再
Select distinct(ClsId) From [Pro] Where CONTAINS(Name , '锁')
--或
Select ClsId From [Pro] Where CONTAINS(Name , '锁') Group By ClsId
htl258_Tony 2009-03-09
  • 打赏
  • 举报
回复
400多万的表有建立索引吗?
Name ,ClsId

27,579

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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