关于聚集索引

wzp144650 2011-11-25 02:49:28
加精
如果说聚集索引的B-TREE叶节点上包含的是数据行,那么,岂不是创建一个聚集索引将会复制整个表的数据?
就相当于一个表有10M大小,创建的聚集索引也是10M了?
...全文
1039 93 打赏 收藏 转发到动态 举报
写回复
用AI写文章
93 条回复
切换为时间正序
请发表友善的回复…
发表回复
wine12 2011-12-09
  • 打赏
  • 举报
回复
应该不是楼主说得那样的吧
memoryshy 2011-12-06
  • 打赏
  • 举报
回复
从头看到尾,还是不懂,我要去钻一下
游北亮 2011-12-05
  • 打赏
  • 举报
回复
bs楼主,分给的不合理
hankanling123 2011-12-05
  • 打赏
  • 举报
回复
缺媳妇的郝 2011-12-04
  • 打赏
  • 举报
回复
正在学数据库中,关于大牛写的命令还不太懂,努力学习中……
ZHL351720237 2011-12-03
  • 打赏
  • 举报
回复
帮顶一下,看起来很费劲
zkj880917 2011-12-03
  • 打赏
  • 举报
回复
我去研究下啊
gaoyanan392071275 2011-12-03
  • 打赏
  • 举报
回复
还是没搞懂!!!!
gw6328 2011-12-02
  • 打赏
  • 举报
回复
建索引时要看你的写法了,你写一行就只有一个,如果你包含很多,那也就是你说的情况
如一个表三个字段

create index ixu_xxx on tb(c1) include(c2,c3)
或都直接就三列索引 on tb(c1,c2,c3)
就是全把表的三列都复制进去的,
zzg_gangge 2011-12-02
  • 打赏
  • 举报
回复
各位大侠usage是如何定义的在mfc usb串口编程中,急急急没分啦,所以不能发帖啦
zhang2xiaogang 2011-12-02
  • 打赏
  • 举报
回复
索引是非常重要的,那是不能马虎的。
learn_123 2011-12-02
  • 打赏
  • 举报
回复
君妞不给分我,junjun1984给分我!
游北亮 2011-12-02
  • 打赏
  • 举报
回复
你说的是非聚集索引了

[Quote=引用 79 楼 jinfengyiye 的回复:]
建索引时要看你的写法了,你写一行就只有一个,如果你包含很多,那也就是你说的情况
如一个表三个字段

create index ixu_xxx on tb(c1) include(c2,c3)
或都直接就三列索引 on tb(c1,c2,c3)
就是全把表的三列都复制进去的,
[/Quote]
昵称被占用了 2011-12-01
  • 打赏
  • 举报
回复
好像完美大叔都解释清楚了

补充一下:数据插入、更新都可能引起聚集索引的索引页和数据页的页拆分,大量的页拆分可能引起性能问题,所以在选择聚集索引字段就会有一些原则,比如一般情况下经常中间插入的字段不是很好的聚集索引字段,需要修改的字段一般就不能作为聚集索引字段等等。
米娅 2011-12-01
  • 打赏
  • 举报
回复
也研究研究
monkaaaaa 2011-12-01
  • 打赏
  • 举报
回复
这个东西有点意思
wzp144650 2011-11-30
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 lweia 的回复:]

引用 56 楼 perfectaction 的回复:
引用 54 楼 lweia 的回复:

插入4
把4放新页里 当头
5从原页里拿出来
当新页尾


没有这个说法。



做个测试就可以

create table a_test
(aa int primary key)

insert into a_test(aa)
values(1)

inse……
[/Quote]

我测试了,真不多一页。
lweia 2011-11-30
  • 打赏
  • 举报
回复
不好意思

应该是
insert into a_test(aa)
values(5)


lweia 2011-11-30
  • 打赏
  • 举报
回复
[Quote=引用 56 楼 perfectaction 的回复:]
引用 54 楼 lweia 的回复:

插入4
把4放新页里 当头
5从原页里拿出来
当新页尾


没有这个说法。
[/Quote]


做个测试就可以

create table a_test
(aa int primary key)

insert into a_test(aa)
values(1)

insert into a_test(aa)
values(2)


declare @i int
set @i=10

while @i<100000
begin
insert into a_test(aa)
values(@i)

set @i=@i+1
end

然后
DBCC CHECKTABLE (a_test)

再然后
insert into a_test(aa)
values(2)


DBCC CHECKTABLE (a_test)

你会发现多了一页

游北亮 2011-11-30
  • 打赏
  • 举报
回复
DBCC IND和DBCC PAGE用法:
DBCC IND('数据库', '表名', 索引id)--即sys.indexes里的index_id

DBCC TRACEON (3604);
GO
DBCC PAGE (数据库, PageFID, PagePID, printopt={0|1|2|3}); --前2个参数是DBCC IND里的信息
GO

详细参考:
http://www.sqlskills.com/blogs/paul/post/Inside-the-Storage-Engine-Using-DBCC-PAGE-and-DBCC-IND-to-find-out-if-page-splits-ever-roll-back.aspx
加载更多回复(49)

34,587

社区成员

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

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