sql重新生成索引的时候可以强制结束吗

sql重新生成索引的时候可以强制结束吗,第1张

可以退出的,索引数据不是一个概念,不会影响数据的。

2023款上汽大众ID.6 X 品质七座纯电SUV

坐拥升级配置,便捷家庭出行。全新六座版大空间,综合补贴后售价253,288元起!

上海上汽大众汽车销售广告

上汽大众途观L2023款,焕新上市

外观设计动感升级,数字座舱处处精致,更搭载智能辅助驾驶科技配置,智能全面升级!

上海上汽大众汽车销售有限公司广告

更多专家

sql数据库重建索引能够中途退出吗

专家1对1在线解答问题

5分钟内响应 | 万名专业答主

马上提问

最美的花火 咨询一个电子数码问题,并发表了好评

lanqiuwangzi 咨询一个电子数码问题,并发表了好评

garlic 咨询一个电子数码问题,并发表了好评

188****8493 咨询一个电子数码问题,并发表了好评

篮球大图 咨询一个电子数码问题,并发表了好评

动物乐园 咨询一个电子数码问题,并发表了好评

AKA 咨询一个电子数码问题,并发表了好评

大家还在搜

礼炮机

齐家网装修怎么样

垃圾处理器

面部提升最好的方法

考研网校排名

手机赚钱软件日入百元

现在学什么手艺好

吸粪车

— 为你推荐更多精彩内容 —

连续索引页由从一个页到下一个页的指针链接在一起。当对数据的更改影响到索引时,索引中的信息可能会在数据库中分散开来。重建索引可以重新组织索引数据(对于聚集索引还包括表数据)的存储,清除碎片。这可通过减少获得请求数据所需的页读取数来提高磁盘性能。 在Microsoft�0�3 SQL Server�6�4 2000 中,如果要用一个步骤重新创建索引,而不想删除旧索引并重新创建同一索引,则使用 CREATE INDEX 语句的 DROP_EXISTING 子句可以提高效率。这一优点既适用于聚集索引也适用于非聚集索引。 以删除旧索引然后重新创建同一索引的方式重建聚集索引,是一种昂贵的方法,因为所有二级索引都使用聚集键指向数据行。如果只是删除聚集索引然后重新创建,则会使所有非聚集索引都被删除和重新创建两次。一旦删除聚集索引并再次重建该索引,就会发生这种情形。通过在一个步骤中重新创建索引,可以避免这一昂贵的做法。在一个步骤中重新创建索引时,会告诉 SQL Server 要重新组织现有索引,避免了删除和重新创建非聚集索引这些不必要的工作。该方法的另一个重要优点是可以使用现有索引中的数据排序次序,从而避免了对数据重新排序。这对于聚集索引和非聚集索引都十分有用,可以显著减少重建索引的成本。另外,通过使用 DBCC DBREINDEX 语句,SQL Server 还允许对一个表重建(在一个步骤中)一个或多个索引,而不必单独重建每个索引。 DBCC DBREINDEX 也可用于重建执行 PRIMARY KEY 或 UNIQUE 约束的索引,而不必删除并创建这些约束(因为对于为执行 PRIMARY KEY 或 UNIQUE 约束而创建的索引,必须先删除该约束,然后才能删除该索引)。

在日常工作中,我们发现很多实施案例中,sql server的数据库数据与索引在一起。我见过一个客户的,他的数据库总共大小才60g,但索引与数据完全混在一起,从管理数据库的直觉来看,性能方面肯定有问题,所以我建议他们,不管怎么样,把索引与数据库分开,对性能是有好处的!但是sql server的索引,想要通过重建的方式,把数据与索引分开,并不是一件容易的事怀,在使用rebuild时,并不能增加文件组选项。后来研究发现,可以通过以下方式把数据与非聚簇索引分开,具体如下:

set nocount on

declare @index table

(

object_id int,

objectName sysname,

index_id int,

indexName sysname,

fill_factor tinyint,

allow_row_locks bit,

allow_page_locks bit,

is_padded bit,

indexText varchar(max),

indexTextEnd varchar(max)

)

declare @indexColumn table

(

object_id int,

index_id int,

column_id int,

index_column_id int,

max_index_column_id int,

is_descending_key bit,

is_included_column bit,

columnName varchar(255),

indexText varchar(max) null

)

insert into @index

select

i.object_id,

object_name(i.object_id),

i.index_id,

i.name,

fill_factor,

allow_row_locks,

allow_page_locks,

is_padded,

'CREATE NONCLUSTERED INDEX [' + i.name + '] ON [dbo].[' + object_name(i.object_id) + '] ' + char(13),

'WITH (PAD_INDEX = ' +

CASE WHEN is_padded = 1 THEN ' ON ' ELSE ' OFF ' END +

', STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ' +

CASE WHEN allow_row_locks = 1 THEN ' ON ' ELSE ' OFF ' END +

', ALLOW_PAGE_LOCKS = ' +

CASE WHEN allow_page_locks = 1 THEN ' ON ' ELSE ' OFF ' END +

CASE WHEN fill_factor >0 THEN ', FILLFACTOR = ' + convert(varchar(3), fill_factor) ELSE '' END +

') ON [IndexFG]print('''+i.name+'@'+object_name(i.object_id)+''')' --+ CHAR(13) + ' GO'+ CHAR(13) --注意标红的地方,这是新的文件组的名称

from sys.indexes i

where i.type = 2 and not exists(select 1 from sys.key_constraints kc where kc.name=i.name)

and objectproperty(i.object_id , 'IsUserTable') = 1

order by object_name(i.object_id), i.name

insert into @indexColumn

select

i.object_id,

i.index_id,

ic.column_id,

ic.index_column_id,

max(ic.index_column_id) over (partition by i.object_id, i.index_id, is_included_column),

is_descending_key,

is_included_column,

'[' + c.name + ']',

null

from @index i

join sys.index_columns ic

on i.object_id = ic.object_id

and i.index_id = ic.index_id

join sys.columns c

on ic.object_id = c.object_id

and ic.column_id = c.column_id

order by i.object_id, i.index_id, ic.index_column_id

declare @fields varchar(max)

declare @object_id int, @index_id int

select @fields = null, @object_id = -1, @index_id = -1

update @indexColumn

set @fields = indexText =

case when object_id = isnull(@object_id, object_id) and index_id = isnull(@index_id, index_id)

then isnull(@fields + ', ', ' ') + columnName + case when is_descending_key = 0 then ' ASC' else ' DESC' end

else columnName + case when is_descending_key = 0 then ' ASC' else ' DESC' end

end,

@object_id = case when object_id <>@object_id

then object_id else @object_id end,

@index_id = case when index_id <>@index_id

then index_id else @index_id end

from @indexColumn

where is_included_column = 0

select @fields = null, @object_id = -1, @index_id = -1

update @indexColumn

set @fields = indexText =

case when object_id = isnull(@object_id, object_id) and index_id = isnull(@index_id, index_id)

then isnull(@fields + ', ', ' ') + columnName

else columnName

end,

@object_id = case when object_id <>@object_id

then object_id else @object_id end,

@index_id = case when index_id <>@index_id

then index_id else @index_id end

from @indexColumn

where is_included_column = 1

update @index

set indexText = i.indexText + '( ' + char(13) + char(9) + ic.indexText + char(13) + ') '

from @index i join @indexColumn ic

on i.object_id = ic.object_id

and i.index_id = ic.index_id

and ic.index_column_id = ic.max_index_column_id

and ic.is_included_column = 0

update @index

set indexText = i.indexText + 'INCLUDE ( ' + char(13) + char(9) + ic.indexText + char(13) + ') '

from @index i join @indexColumn ic

on i.object_id = ic.object_id

and i.index_id = ic.index_id

and ic.index_column_id = ic.max_index_column_id

and ic.is_included_column = 1

update @index

set indexText = indexText + indexTextEnd

from @index

select indexText, objectName, indexName

from @index

最后的查询结果第一行就是执行的命令!


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9954064.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存