索引问题

tbb_520 2010-04-21 04:45:51
请问这样的查询,怎么样建立索引速度才会比较快?现在没有任何索引,需要2分钟
t1表数据大概100w条,t3大概4000多条

select t1.brd_id, t1.org_id, max(t3.org_id2), max(t3.soldto), t1.pro_id, t1.year_month, isnull(sum(t1.sal_qty),0), isnull(sum(t1.sal_amt),0), isnull(sum(t1.sal_prm_amt),0), isnull(sum(t1.sal_cost_amt),0), isnull(sum(t1.sal_nos_prm_amt),0)
, isnull(sum(t1.inv_qty),0), isnull(sum(t1.inv_prm_amt),0), isnull(sum(t1.inv_cost_amt),0), isnull(sum(t1.start_inv_qty),0), isnull(sum(t1.start_inv_amt), 0)
from MONTH_SAL_INV_TEMP t1
,t05_org_info t3
where t1.org_id=t3.org_new_id
group by t1.brd_id, t1.org_id, t1.pro_id, t1.year_month

我刚才这样建立了索引,速度足足降低了一倍多,需要4分半了
create index MONTH_SAL_INV_TEMP_index on MONTH_SAL_INV_TEMP(org_id,brd_id, pro_id, year_month)
create index MONTH_SAL_INV_TEMP_org_id on MONTH_SAL_INV_TEMP(org_id)
create index MONTH_SAL_INV_TEMP_brd_id on MONTH_SAL_INV_TEMP(brd_id) create index MONTH_SAL_INV_TEMP_pro_id on MONTH_SAL_INV_TEMP(pro_id)
create index MONTH_SAL_INV_TEMP_year_month on MONTH_SAL_INV_TEMP(year_month)
...全文
93 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dichun 2010-04-22
  • 打赏
  • 举报
回复
在T1和T3上各建一个主键(t1.org_id,t3.org_new_id),
然后考虑把t1.brd_id, t1.org_id, t1.pro_id, t1.year_month
建立一个复合索引,后面这个也可以不要,你测试一下看;
索引不要建多了,反而不好;
东那个升 2010-04-22
  • 打赏
  • 举报
回复
t3 org_new_id列建立索引
T1 org_id,brd_id,pro_id,year_month建立复合索引

这2个足够了
htl258_Tony 2010-04-22
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 tbb_520 的回复:]
引用 5 楼 htl258 的回复:
参考:有关SQL Server 索引结构及其使用的说明和例子 http://blog.csdn.net/htl258/archive/2009/04/22/4101046.aspx

这篇文章我刚才看过了,但是具体到我现在的问题,,我不知道该怎么做
你可以示范一下吗
[/Quote]

--单独分开建试试
create index MONTH_SAL_INV_TEMP_index on MONTH_SAL_INV_TEMP(org_id)
create index MONTH_SAL_INV_TEMP_brd_id on MONTH_SAL_INV_TEMP(brd_id)
create index MONTH_SAL_INV_TEMP_pro_id on MONTH_SAL_INV_TEMP(pro_id)
create index MONTH_SAL_INV_TEMP_year_month on MONTH_SAL_INV_TEMP(year_month)
tbb_520 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 htl258 的回复:]
参考:有关SQL Server 索引结构及其使用的说明和例子 http://blog.csdn.net/htl258/archive/2009/04/22/4101046.aspx
[/Quote]
这篇文章我刚才看过了,但是具体到我现在的问题,,我不知道该怎么做
你可以示范一下吗
htl258_Tony 2010-04-21
  • 打赏
  • 举报
回复
另注意:索引在哪些情况下失效

1.只要对列使用函数,该列的索引将不起作用,如:substring(aa,1,2)='xx'
2.只要对列进行计算,该列的索引将不起作用,如:aa+10=20
3.某些情况下的LIKE操作,该列的索引将不起作用,如:aa LIKE '%10%'
4.某些情况使用反向操作,该列的索引将不起作用,如:aa <>2
5.在WHERE中使用OR时,有一个列没有索引,那么其它列的索引将不起作用
htl258_Tony 2010-04-21
  • 打赏
  • 举报
回复
参考:有关SQL Server 索引结构及其使用的说明和例子 http://blog.csdn.net/htl258/archive/2009/04/22/4101046.aspx
tbb_520 2010-04-21
  • 打赏
  • 举报
回复
只有create index MONTH_SAL_INV_TEMP_index on MONTH_SAL_INV_TEMP(org_id,brd_id, pro_id, year_month)的情况下,速度也足足下降了一倍
tbb_520 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 sql77 的回复:]
1在连接条件上加索引,

2create index MONTH_SAL_INV_TEMP_index on MONTH_SAL_INV_TEMP(org_id,brd_id, pro_id, year_month)

建立这个索引按照你查询的顺序创建

其它的索引看需求,不要建立过多浪费
[/Quote]
我在t1的 org_id上建立了非聚集索引,速度基本没变化
你的意思是在org_id上建立索引之后,再建立一个你写的第二个复合索引吗
tbb_520 2010-04-21
  • 打赏
  • 举报
回复
select t1.brd_id, t1.org_id, max(t3.org_id2), max(t3.soldto), t1.pro_id, t1.year_month, isnull(sum(t1.sal_qty),0), isnull(sum(t1.sal_amt),0), isnull(sum(t1.sal_prm_amt),0), isnull(sum(t1.sal_cost_amt),0), isnull(sum(t1.sal_nos_prm_amt),0)
, isnull(sum(t1.inv_qty),0), isnull(sum(t1.inv_prm_amt),0), isnull(sum(t1.inv_cost_amt),0), isnull(sum(t1.start_inv_qty),0), isnull(sum(t1.start_inv_amt), 0)
from MONTH_SAL_INV_TEMP t1
,t05_org_info t3
where t1.org_id=t3.org_new_id
group by t1.brd_id, t1.org_id, t1.pro_id, t1.year_month
SQL77 2010-04-21
  • 打赏
  • 举报
回复
1在连接条件上加索引,

2create index MONTH_SAL_INV_TEMP_index on MONTH_SAL_INV_TEMP(org_id,brd_id, pro_id, year_month)

建立这个索引按照你查询的顺序创建

其它的索引看需求,不要建立过多浪费

34,838

社区成员

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

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