sqlserver数据库,表 索引,查询效率问题
比如一张表,5个字段组成的组合主键,现在要查里面的数据,这张表可能会关联到其他表,怎麽提高速度?用索引的话,创建甚麽索引后面会追加的比如员工表employ表(A1,A2,...
比如 一张表, 5个字段组成的组合主键, 现在要查里面的数据,这张表可能会关联到其他表,怎麽提高速度? 用索引的话,创建甚麽索引
后面会追加的
比如 员工表 employ表 (A1 ,A2, A3 ,A4, A5 ,A6,.....) A1,A2,A3,A4,A5 是组合主键, 现在要查 表中部分数据,当然几个组合逐渐也要查询的,要怎麽建立索引? 不会, 实例 说下... 展开
后面会追加的
比如 员工表 employ表 (A1 ,A2, A3 ,A4, A5 ,A6,.....) A1,A2,A3,A4,A5 是组合主键, 现在要查 表中部分数据,当然几个组合逐渐也要查询的,要怎麽建立索引? 不会, 实例 说下... 展开
展开全部
sqlserver的主键默认是聚集索引,如果你还需要查询什么数据,也可以建立非聚集索引,但是你要注意,非聚集索引需要占额外的存储空间,而且是用时间长了容易产生索引碎片。
所以比较好的索引建立准则是:用来做表连接的id列上键非聚集索引,真正用来查询数据内容的列上建立聚集索引。
所以比较好的索引建立准则是:用来做表连接的id列上键非聚集索引,真正用来查询数据内容的列上建立聚集索引。
追问
能 直接实例 说下麽?
追答
就像你所说的,员工表 employ表 (A1 ,A2, A3 ,A4, A5 ,A6,.....) A1,A2,A3,A4,A5 是组合主键。
SELECT * FROM [employee] where a1>1 执行的是聚集索引查找,速度最快
SELECT * FROM[employee] where a1=2 and a2=1 and a3 = 'bo' 这个也是聚集索引查找
但是
SELECT * FROM [employee] where a1>1 and a3 = 'bob' and a4 between '2011-7-5' and '2011-7-7'
SELECT * FROM [employee] where a1-1>1 and a3 like 'b*'
执行的是聚集索引扫描,速度就慢一些了
想要用索引,要注意列的拍了,如果where a1=2 and a2=1 and a3 = 'bo' 改成where a2=1 and a3 = 'bo' 都不是聚集索引查找。
所以想要找到最合适的建立索引方法需要了解使用这个表或者视图的程序是如何进行查询的。有什么查询,添加什么索引。
详细的设计原则,你看看微软的文档吧,写的挺详细的。
http://msdn.microsoft.com/zh-cn/library/cc280372.aspx
展开全部
你确定使用到索引了吗?
你可以使用 执行计划 来看看有没有使用到索引
-------------------补充----------------------
首先:我不知道 SqlServer里查询oracle里的某个表是怎么个查法,这个我没做过,所以不大清楚。
第二:虽然上面的我不清楚,但想必道理一样,一个查询语句在oracle中执行。你就把查询语句直接放在oracle里运行一下,看下执行计划。
我以前需要查看查询语句是否用到了索引,因此才学会使用执行计划的,下面是我的总结,希望对你有所帮助。
组合索引(concatenated index)
由多个列构成的索引,如create index idx_emp on emp(col1, col2, col3, ……),则我们称idx_emp索引为组合索引。在组合索引中有一个重要的概念:引导列(leading column),在上面的例子中,col1列为引导列。当我们进行查询时可以使用”where col1 = ? ”,也可以使用”where col1 = ? and col2 = ?”,这样的限制条件都会使用索引,但是”where col2 = ? ”查询就不会使用该索引。所以限制条件中包含先导列时,该限制条件才会使用该组合索引。
在关系数据库中,表中建立主键就会自动生成一个索引。在oracle中,如果一个表有多个主键的话,是建一条索引应用到联合主键所有列上,使用部分列不会应用到该主键索引,甚至,即使条件中包含了联合主键所有列,但如果顺序不对或者其中某一列上应用了函数,也不会应用到索引。
如何查看查询语句是否使用到了索引
在查询语句前加上'set autotrace on'可以看到Execution Plan,可以从中分析使用使用到了索引。还可以用
set autotrace traceonly
set timing on
还可以额外的查看执行语句所花费的时间。
你可以使用 执行计划 来看看有没有使用到索引
-------------------补充----------------------
首先:我不知道 SqlServer里查询oracle里的某个表是怎么个查法,这个我没做过,所以不大清楚。
第二:虽然上面的我不清楚,但想必道理一样,一个查询语句在oracle中执行。你就把查询语句直接放在oracle里运行一下,看下执行计划。
我以前需要查看查询语句是否用到了索引,因此才学会使用执行计划的,下面是我的总结,希望对你有所帮助。
组合索引(concatenated index)
由多个列构成的索引,如create index idx_emp on emp(col1, col2, col3, ……),则我们称idx_emp索引为组合索引。在组合索引中有一个重要的概念:引导列(leading column),在上面的例子中,col1列为引导列。当我们进行查询时可以使用”where col1 = ? ”,也可以使用”where col1 = ? and col2 = ?”,这样的限制条件都会使用索引,但是”where col2 = ? ”查询就不会使用该索引。所以限制条件中包含先导列时,该限制条件才会使用该组合索引。
在关系数据库中,表中建立主键就会自动生成一个索引。在oracle中,如果一个表有多个主键的话,是建一条索引应用到联合主键所有列上,使用部分列不会应用到该主键索引,甚至,即使条件中包含了联合主键所有列,但如果顺序不对或者其中某一列上应用了函数,也不会应用到索引。
如何查看查询语句是否使用到了索引
在查询语句前加上'set autotrace on'可以看到Execution Plan,可以从中分析使用使用到了索引。还可以用
set autotrace traceonly
set timing on
还可以额外的查看执行语句所花费的时间。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果是联合主键,则将经常查询的内容设置为非聚簇索引,主要是字段长的要设上啊,其实短的倒无所谓,还有就是你数据表的大小很有关啊,记录超过10000条设置索引有意义,记录太少了就没意义了,最好给实例啊
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
主键本身就是一个唯一索引,
你可以在关联字段上加一个索引
你可以在关联字段上加一个索引
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询