请各位分析,索引测试结果的数据,给个说法

zhou80bin 2004-04-21 01:45:21
以下是我用来做测试的表的结构,2张表一模一样,一个建了索引,一个没有
ID int 4 0
col1 varchar 8 0
col2 varchar 50 0
col3 varchar 8 0
col4 varchar 100 0
col5 varchar 8 1
col6 varchar 100 1
col7 varchar 20 0
col8 datetime 8 0
col9 varchar 8 1
col10 varchar 20 1
col11 varchar 8 1
col12 varchar 20 1
col13 varchar 8 1
col14 varchar 20 1
col15 varchar 8 1
col16 varchar 20 1
col17 varchar 8 1
col18 varchar 20 1
col19 int 4 0
col20 datetime 8 1
col21 varchar 50 1

分别建了3个索引
1 索引字段为 col1 索引选项除了文件组为primary外其他都没选
2 索引字段为 col19 同上
3 索引字段为 col2,4,6,7,8 同上

以下是在查询分析器中,用跟踪看到的结果
索引1 的测试
select count(*) from tableHasIndex where col1=30000
Duration cpu reads writes
SQL:StmtCompleted 44 24 46 0

select count(*) from tableNoIndex where col1=30000
SQL:StmtCompleted 104 95 108 0
...全文
69 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
Functions 2004-06-09
  • 打赏
  • 举报
回复
>主键本身是一个索引,而且经常是聚集索引,对查询的影响很大。
这个我知道。
可是,如果不创建主键,取而代之的是聚集唯一索引,效果是不是一样的?
CSDNM 2004-05-04
  • 打赏
  • 举报
回复
zhou80bin(彬彬):
复合查询可以建立复合索引,但是用like '%%'来匹配的字段不会用到索引,建了索引也不会起到作用。所以如果所有子短都是用like '%%'的,就不必建这样的复合索引了。

Functions(方程) :
主键本身是一个索引,而且经常是聚集索引,对查询的影响很大。
CSDNM 2004-05-04
  • 打赏
  • 举报
回复
对复合索引的影响其实是聚集索引,有聚集索引的表的复合索引的索引页记录聚集索引的键值,这样至少有两个好处:1、每个索引相比较短,节省空间而且索引的层次会降低。2、定位简单。
这也关系到聚集索引的选择问题,一般建议选择比较短、容易比较的字段作为聚集索引,int型应该是最好的选择。
上面强调主键是因为一般我们都是把主键建成聚集索引。


seekmoon 2004-04-27
  • 打赏
  • 举报
回复
mark
zhou80bin 2004-04-22
  • 打赏
  • 举报
回复
好的,我将建立主键,然后重新测试
那我问一下,如果遇到查询怎么办,查询的使用的是复合查询,而且,基本上
这些用来查询的字段是varchar的文本,需要用like '%%'进行匹配
这种情况怎么提高查询响应的时间呢
Functions 2004-04-22
  • 打赏
  • 举报
回复
主键也会对查询产生影响么?
使用索引替换不行么?
我以前一直以为,主键主要是用来关联外键的,可能会顺便生成一个索引。
laughsmile 2004-04-21
  • 打赏
  • 举报
回复
1.like '%1%'是肯定不会用到索引的,like'1%'才会用到索引
2.建索引的字段不要使用有很多重复值的字段来建,而你的索引3使用的索引字段为 col2,4,6,7,8,可能存在这样的字段,这样就可能造成建了索引,查询速度反而变慢了.
3.象 CSDNM(决定不当CSDN经理了) 所说的,建议建主键
internetcsdn 2004-04-21
  • 打赏
  • 举报
回复
我还不知道怎样进行跟踪的?
有人回答我吗?


帮你顶
JonathanLee 2004-04-21
  • 打赏
  • 举报
回复
关注一下
CSDNM 2004-04-21
  • 打赏
  • 举报
回复
我测试完了,你的测试3和测试4一定有一个错的


CSDNM 2004-04-21
  • 打赏
  • 举报
回复
我刚才测试了一下,同一个查询的不同次执行Duration和CPU都有可能有比较大的变化,而reads比较稳定。

你的测试可能有点问题:

索引3的测试
select * from tableHasIndex where col2 like '%1%'
SQL:StmtCompleted 230 11 108 0

select * from tableNoIndex where col2 like '%1%'
SQL:StmtCompleted 90 11 108 0

测试4结果
select * from tableNoIndex where col2 like '1%'
SQL:StmtCompleted 255 148 108 0
select * from table where col2 like '1%'
SQL:StmtCompleted 223 157 108 0

Reads完全相同,而我的测试不会出现这种情况,不知道是不是你的数据类型是varchar影响的,我正在测试


superryu 2004-04-21
  • 打赏
  • 举报
回复
有时候建了索引反而会使查询的速度下降,看来要具体问题具体分析
zhou80bin 2004-04-21
  • 打赏
  • 举报
回复
数据是有的,有3000多条
那可以这样说吗
查询的响应时间的指标也就是看cpu的数值是吗?
而Duration在什么情况下,是重要的参考指标呢?
CSDNM 2004-04-21
  • 打赏
  • 举报
回复
Reads都一样说明数据不够或者数据里没有col2 like '1%'的记录

换成like '8%'之类的,保证有数据试试
zhou80bin 2004-04-21
  • 打赏
  • 举报
回复
汗,表的ID没有建主键

CSDNM(读起来饶口),是怎么看出来的阿?佩服阿
CSDNM 2004-04-21
  • 打赏
  • 举报
回复
因为是查询语句,所以主要看:
Reads和CPU

CSDNM 2004-04-21
  • 打赏
  • 举报
回复
你的表id有没有主键?
CSDNM 2004-04-21
  • 打赏
  • 举报
回复
Duration 事件的持续时间。
Reads 由 SQL 语句发出的页读取数。
Writes 由 SQL 语句发出的页写入数。
CPU 由 SQL 语句使用的 CPU。
zhou80bin 2004-04-21
  • 打赏
  • 举报
回复
测试5结果
select * from tableNoIndex where col2 like '1%' and col4 like '%1%' SQL:StmtCompleted 156 187 108 0
select * from tableHasIndex where col2 like '1%' and col4 like '%1%' SQL:StmtCompleted 152 6 108 0

这里的cpu怎么只有6阿,才很多阿????
zhou80bin 2004-04-21
  • 打赏
  • 举报
回复
测试4结果
select * from tableNoIndex where col2 like '1%'
SQL:StmtCompleted 255 148 108 0
select * from table where col2 like '1%'
SQL:StmtCompleted 223 157 108 0
加载更多回复(6)

34,592

社区成员

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

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