社区
MS-SQL Server
帖子详情
with drop_existing 重建了聚集索引后,还需要手动重建每一个非聚集索引吗?
samyp1234
2018-06-06 02:24:59
sqlserver2008;一个表,有聚集索引、和非聚集索引;
现在想重建全部索引;
先执行类似这个SQL,进行了聚集索引的重建,
create unique clustered index PK_1 on t1(id ) with ( drop_existing=on) ,
我的问题是: 这个SQL,会自动重建全部的 非聚集索引吗?还是需要 我再手动重建每一个 非聚集索引呢 ?
...全文
1376
7
打赏
收藏
with drop_existing 重建了聚集索引后,还需要手动重建每一个非聚集索引吗?
sqlserver2008;一个表,有聚集索引、和非聚集索引; 现在想重建全部索引; 先执行类似这个SQL,进行了聚集索引的重建, create unique clustered index PK_1 on t1(id ) with ( drop_existing=on) , 我的问题是: 这个SQL,会自动重建全部的 非聚集索引吗?还是需要 我再手动重建每一个 非聚集索引呢 ?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
samyp1234
2018-06-09
打赏
举报
回复
引用 6 楼 yenange 的回复:
with drop_existing 重建了聚集索引后, 不手动去重建非聚集索引,那么,非聚集索引 还能正常使用吗? 简单来说,就是 原来 走非聚集索引的 SQL,现在还是正常走非聚集索引吗 ? 不需要重建非聚集索引,只要它们还能正常工作 就行;
吉普赛的歌
版主
2018-06-08
打赏
举报
回复
薛定谔的DBA
2018-06-08
打赏
举报
回复
非聚集索引不会重建,统计信息也不会更新,与 rebuild 索引一样。 只有直接删除聚集索引,再创建聚集索引,非聚集索引才自动跟踪重建。
dbLenis
2018-06-07
打赏
举报
回复
肯定的回答你,会重建所有非聚集索引。
下面是证明:
1) 找到该表的所有索引
2 ) 在没有重建聚集索引之前,分析非聚集索引的存储结构,并保存
3) 在重建完聚集索引之后,重复第2)步,分析索引的存储结构
1) 找到该表的所有索引:将红色字体部分替换为你的表
select * from sys.indexes where object_id = object_id
(N'dbo.homehistory')
2)在没有重建聚集索引之前,分析非聚集索引的存储结构,并保存
dbcc ind(home,'
dbo.homehistory
',0)
dbcc ind(home,
'dbo.homehistory
',2)
如果有其他非聚集索引,按照 index_id 来替换上述命令中的0和2,即可查看该索引的存储结构
这里的 m_pageId = (3:24) 就是原先没有重建聚集索引之前的数据页,而重建之后,这个页码有变化,请仔细对比
写过一篇啰嗦的文章,讲内部存储,有兴趣不妨一看
https://blog.csdn.net/wujiandao/article/details/51501522
samyp1234
2018-06-07
打赏
举报
回复
没人知道吗 ?
samyp1234
2018-06-07
打赏
举报
回复
with drop_existing 重建了聚集索引后, 对于非聚集索引,如果不重建非聚集索引,还能正常使用吗?
卖水果的net
版主
2018-06-06
打赏
举报
回复
一个一个来。
SQL Server 2000数据库中如何
重建
索引
在SQL Server 2000中,如果要用
一个
步骤重新创建索引,而不想删除旧索引并重新创建同一索引,则使用CREATE INDEX语句的
DROP
_
EXIS
TING
子句可以提高效率。这一优点既适用于
聚集索引
也适用于
非
聚集索引
。以删除旧索引然后重新创建同一索引的方式
重建
聚集索引
,是一种昂贵的方法,因为所有二级索引都使用聚集键指向数据行。如果只是删除
聚集索引
然后重新创建,则会使所有
非
聚集索引
都被删除和重新创建两次。一旦删除
聚集索引
并再次
重建
该索引,就会发生这种情形。通过在
一个
步骤中重新创建索引,可以避免这一昂贵的做法。
唯一
非
聚集索引
变量传入时索引失效解决方案
场景一: 确认1.碰到了
一个
一个
非常慢的SQL server语句,发现是变量查询时很慢 SQL语句: DECLARE @SN VARCHAR(12) SET @SN = '30F335CD0045' SELECT [Mac2] FROM SF_Cp_Detail WHERE [Mac2] = @SN 确认2.查看索引是:唯一
非
聚集索引
CREATE UNIQUE NONCLUSTERED INDEX [IX_SF_CP_Detail_MAC2] ON [dbo].[SF_Cp_Detail] ( [Mac2] ASC ) WHERE ([MAC2]'' AND [MAC2] IS NOT NULL) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF,
DROP
_
EXIS
TING
= OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) GO 确认3.执行计划如下: 执行计划 SET STATISTICS IO ON ; (0 行受影响) Table 'SF_Cp_Detail'. Scan count 33, logical reads 1267942, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 场景二: 为什么用不到索引IX_SF_CP_Detail_MAC2]呢? 尝试1: 把唯一
非
聚集索引
改为
非
聚集索引
, Done,用到索引了.
Drop
index ……. CREATE NONCLUSTERED INDEX [IX_SF_Cp_Detail_Mac2] ON [dbo].[SF_Cp_Detail] ( [Mac2] ASC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
DROP
_
EXIS
TING
= OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) GO 尝试2: 可是还
需要
验证唯一性怎么办呢? 试了半天未达到目标, 根据别人提示, 恢复唯一非聚集 CREATE UNIQUE NONCLUSTERED INDEX [IX_SF_CP_Detail_MAC2] ON [dbo].[SF_Cp_Detail] ( [Mac2] ASC ) WHERE ([MAC2]'' AND [MAC2] IS NOT NULL) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF,
DROP
_
EXIS
TING
= OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) GO 然后 修改查询: DECLARE @SN VARCHAR(12) SET @SN = '30F335CD0045' SELECT [Mac2] FROM SF_Cp_Detail WHERE [Mac2] = @SN option (recompile) 预计查询计划 看样子不行, 但是,看一下实际查询计划: OK ,Done,可以了. 尝试3. 但是我不可能去每个程序加option (recompile)呀, 而且随着数据量的增大,每次重新编译索引, 本身就导致SQL语句变慢. 最终解决方案: 唯一
非
聚集索引
留着, 再添加
一个
非
聚集索引
,保留两个索引, 终于搞定了. CREATE UNIQUE NONCLUSTERED INDEX [IX_SF_CP_Detail_MAC2] ON [dbo].[SF_Cp_Detail] ( [Mac2] ASC ) WHERE ([MAC2]'' AND [MAC2] IS NOT NULL) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF,
DROP
_
EXIS
TING
=
YOLOv5实战训练自己的数据集(Windows和Ubuntu演示)
课程实战分为两个项目:单目标检测(足球目标检测)和多目标检测(足球和梅西同时检测)。 本课程的YOLOv5使用ultralytics/yolov5,在Windows和Ubuntu系统上分别做项目演示。包括:安装YOLOv5、标注...
SqlServer2008实例28索引预览之使用
DROP
EXIS
TING
改变既有索引
ALTER INDEX可以用来改变索引选项、
重建
或重组织索引以及禁用索引,但不可以用来实际地添加、删除或重排索引中的列。 可以使用CREATE INDEX...
DROP
EXIS
TING
来改变既有索引的列定义。这个选项还拥有在单条命令中删除和
重建
索引的优点(取代同时使用
DROP
INDEX和CREATE INDEX)。而且,在
聚集索引
上使用
DROP
EXIS
TING
也不会引起既有的
非
聚集索引
自动
重建
,除非索引列定义已发生改变。 USE AdventureWorks GO --
重建
非聚集索...
sql 索引
聚集索引
和
非
聚集索引
,复合索引
1.
聚集索引
--索引 优化数据查询和处理速度 快速定位到我们要查找的数据 --缺点,占储存空间 索引并不是越多越来好 合理利用索引可以有效提高数据查询效率 --
聚集索引
(主键索引) create clustered index pk_productinfos on pi(id) --为表pi的列id创建索引 with (
drop
_
exis
ting
=on --先删除原来,create
一个
新的 ) --删除主键索引 alter table pi
drop
pk_producti
MS-SQL Server
34,591
社区成员
254,589
社区内容
发帖
与我相关
我的任务
MS-SQL Server
MS-SQL Server相关内容讨论专区
复制链接
扫一扫
分享
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章