gpt4 book ai didi

sql-server - SQL Server columnstore 索引更新/插入存储过程

转载 作者:行者123 更新时间:2023-12-01 11:49:14 26 4
gpt4 key购买 nike

我在测试 sql server 2012 的 columnstore 索引功能时很开心。因为你不能更新/插入带有此类索引的表,所以我阅读了一些选项:保留一个单独的表并为每个批量插入或使用一个新分区禁用索引,执行更新/插入,然后重建索引。

对于我的测试,我选择了后一个选项并以这个存储过程结束:

-- Disable the columnstore index.
ALTER INDEX [All_Columns_Columnstore_Index] ON [dbo].[Tick] DISABLE

-- Insert data into tick table from staging table.
insert into Tick
select [Date],
SymbolID,
Price
from TickTemporary

-- Delete data from staging table.
delete from TickTemporary

-- Enable (rebuild) the columnstore index.
ALTER INDEX [All_Columns_Columnstore_Index] ON [dbo].[Tick] REBUILD

如果我手动执行这些行,一切正常。但是,如果我运行该过程,我会收到无法在具有列存储索引的表上执行更新/插入的错误。

这是为什么?

更新:

我遵循了我之前接受的答案中的建议,但我仍然得到同样的结果。

-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;

-- Disable the columnstore index.
EXEC DisableColumnStoreIndex

-- Insert data into tick table from staging table.
insert into Tick
select [Date],
SymbolID,
Price
from TickTemporary

-- Delete data from staging table.
delete from TickTemporary

-- Enable (rebuild) the columnstore index.
EXEC RebuildColumnStoreIndex

甚至尝试在存储过程调用周围放置“begin tran”和“commit tran”。

使用动态 sql,如:

declare @sql nvarchar(max)
set @sql =
'insert into Tick
select [Date],
SymbolID,
Price
from TickTemporary'
exec(@sql)

有效,但实际上,我想在没有动态 sql 的情况下过得去。在这种情况下是不可能的吗?

最佳答案

检查是在编译时完成的,而不是在执行时。将过程分离到它自己的过程中,或使用动态 SQL。

但作为一般性评论,这不是正确的方法。您应该插入到具有相同结构的不同表中,在这个相同的表上构建columnstore索引,然后使用分区切换将旧表替换为新表:用空表切换旧表,切换新表,丢弃旧数据。类似于 How to Update a table with a Columnstore Index 中描述的过程.由于使用分区切换,您的表的用户体验到的停机时间要短得多,因为旧表在插入和构建列存储阶段仍然在线并且可用。

关于sql-server - SQL Server columnstore 索引更新/插入存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13117478/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com