查询优化问题?实例

insert2003 2005-09-25 03:41:41
有一表:
tb_list(c_Local_Type,c_No,c_CallNo,dt_Date,i_Time,c_Long_Type,c_VID,c_CID)

记录条数有1亿多条

一般的查询有:
1.
select sum(i_Time)
from tb_list
where c_Local_Type='本地'
and c_No='123456789'
and c_Long_Type='长'
and c_VID='1'
and c_CID='1'

2.
SELECT c_Local_Type,c_Long_Type,i_Time
FROM tb_list
WHERE (c_Local_Type <> '免')
and (c_VPMN_ID <> '1')
and (c_Call_ID <> '1')
and (c_MobileNo=@c_MobileNo)
ORDER BY dt_Call_Date

这是一个游标使用的select语句来的


c_Local_Type,c_Long_Type 字段取值大多都是相同的,

c_No 的取值大概有17W到18W个左右

c_VPMN_ID,c_Call_ID取值只有两个!


请问应该怎样加索引?
就以上查询语句应该怎样加?

针对这个表的查询,更新还有很多其他的!
...全文
211 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangkunhong 2005-09-27
  • 打赏
  • 举报
回复
大家先帮我先一个问题啊,急啊。

http://community.csdn.net/Expert/topic/4297/4297722.xml?temp=.3959314
insert2003 2005-09-27
  • 打赏
  • 举报
回复
数据量太大,建议对这个表作分区操作。
=====================================

请问怎么区?
子陌红尘 2005-09-26
  • 打赏
  • 举报
回复
数据量太大,建议对这个表作分区操作。
netmin 2005-09-26
  • 打赏
  • 举报
回复
up
benxie 2005-09-25
  • 打赏
  • 举报
回复
sql 的优化网上有很多,不过最重要还是set showplanon后对比各语句。
当然index 等那些是最基本的要求了。
zzxiaoma 2005-09-25
  • 打赏
  • 举报
回复
up
zlp321002 2005-09-25
  • 打赏
  • 举报
回复
1.多表操作在被实际执行前,查询优化器会根据连接条件,列出几组可能的连接方
案并从中找出系统开销最小的最佳方案。连接条件要充份考虑带有索引的表、行数多的
表;内外表的选择可由公式:外层表中的匹配行数*内层表中每一次查找的次数确定,乘
积最小为最佳方案。
---- 2.查看执行方案的方法-- 用set showplanon,打开showplan选项,就可以看到连
接顺序、使用何种索引的信息;想看更详细的信息,需用sa角色执行dbcc(3604,310,30
2)。



可见,所谓优化即where子句利用了索引,不可优化即发生了表扫描或额外开销。

---- 1.任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时
要尽可能将操作移至等号右边。
---- 2.in、or子句常会使用工作表,使索引失效;如果不产生大量重复值,可以考虑把
子句拆开;拆开的子句中应该包含索引。
---- 3.要善于使用存储过程,它使SQL变得更加灵活和高效。
---- 从以上这些例子可以看出,SQL优化的实质就是在结果正确的前提下,用优化器可
以识别的语句,充份利用索引,减少表扫描的I/O次数,尽量避免表搜索的发生。其实S
QL的性能优化是一个复杂的过程,上述这些只是在应用层次的一种体现,深入研究还会
涉及数据库层的资源配置、网络层的流量控制以及操作系统层的总体设计。
vivianfdlpw 2005-09-25
  • 打赏
  • 举报
回复
1. 建立组合索引,形成索引覆盖
create index index_name on tb_list(c_Local_Type,c_Long_Type,i_Time,c_VPMN_ID,c_Call_ID )

2. c_Local_Type <> '免'
==========>
c_Local_Type >'兔' or c_Local_Type < '免'

3. 游标操作可以用while循环代替
zlp321002 2005-09-25
  • 打赏
  • 举报
回复
缺省情况下建立的索引是非群集索引,但有时它并不是最佳的;合理的索引设计要
建立在对各种查询的分析和预测上。一般来说:
---- ①.有大量重复值、且经常有范围查询
(between, >,< ,>=,< =)和order by
、group by发生的列,可考虑建立群集索引;
---- ②.经常同时存取多列,且每列都含有重复值可考虑建立组合索引;
---- ③.组合索引要尽量使关键查询形成索引覆盖,其前导列一定是使用最频繁的列。
insert2003 2005-09-25
  • 打赏
  • 举报
回复
我也不想使用游标,但实际过程中如果不使用游标很难做到想要的结果!

SELECT c_Local_Type,c_Long_Type,i_Time
FROM
(select c_Local_Type,c_Long_Type,i_Time
from tb_list
where (c_Local_Type <> '免')
and (c_VPMN_ID <> '1')
and (c_Call_ID <> '1')
) A
where c_N=@c_MobileNo
ORDER BY dt_Call_Date

这个会缩短查询时间吗?
zlp321002 2005-09-25
  • 打赏
  • 举报
回复
1:在条件字段加索引!
如:
c_Local_Type,c_No,c_Long_Type,c_VID,c_CID
2:尽量缩小查询范围
如:

SELECT c_Local_Type,c_Long_Type,i_Time
FROM
(select c_Local_Type,c_Long_Type,i_Time
from tb_list
where (c_Local_Type <> '免')
and (c_VPMN_ID <> '1')
and (c_Call_ID <> '1')
) A
where c_MobileNo=@c_MobileNo
ORDER BY dt_Call_Date

--3:数据库中尽量减少使用游标的操作!

34,590

社区成员

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

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