我做一个小项目已经有两个星期了。
我们希望合并几个远程服务器数据库中的几个表,以便独立于一个DIY迷你数据仓库的实时databases....kind上运行查询和报告。
我们有三个Server 2008远程服务器,我正在将数据编译到一个本地服务器上,运行三个单独的2017实例。
Server数据库都已设置完毕,我已经成功地测试了如何使用几种不同的方法复制所需的表,包括:
这两种方法都成功地复制了表和数据,但没有复制键、索引和其他约束。
我只是最近才在数据库中工作,所以我自己也不知所措,Google给出了上述复制建议,但在服务器间传输表时,我找不到任何包含键、索引和其他约束的内容。
发布于 2019-07-15 16:51:58
由于您希望有选择地写出某些表,所以可以使用双酚以编程方式编写表、触发器的脚本等使用Export-DbaScript。
或者,您也可以尝试Export-DbaDacPackage和-table参数。
由于您使用的是链接服务器,我在哪个更有效:从链接服务器中选择还是插入到链接服务器中?上的回答也会有所帮助。
发布于 2019-07-15 16:59:21
我有一个类似的需求,在我的一个网站:我需要创建一个报告数据库的生产每晚在维护期间。我没有使用链接服务器,但是如果您在远程服务器上有特权来添加索引和主键,那么这种方法应该同样工作。在数据加载步骤之后,如果不存在索引,则运行create和主键命令。
-- do the data loading
INSERT INTO dbo.table
SELECT *
FROM remoteserver.remotedatabase.dbo.remotetable;
-- create the indexes if they do not exist
if NOT exists ( select * FROM [remoteserver].[remotedatabase].[dbo].[sysindexes] where name = 'pk_remotetable' )
ALTER TABLE [remoteserver].[remotedatabase].[dbo].[remotetable] ADD CONSTRAINT [pk_remotetable] PRIMARY KEY CLUSTERED ( [remotetable_ID] ASC );
go
if NOT exists ( select * FROM [remoteserver].[remotedatabase].[dbo].[sysindexes] where name = 'nc_index1' )
CREATE NONCLUSTERED INDEX [nc_index1] ON [remoteserver].[remotedatabase].[dbo].[remotetable] (
[col1] ASC) INCLUDE ( [col2], [col3])
go您可能需要尝试数据加载时间,以及删除索引、执行数据加载、然后重新创建它们或在数据加载之前创建索引是否更快。我相信在没有索引的情况下,您会发现数据加载速度更快,但是创建索引还需要时间。
例如,您可以尝试以下方法
if exists ( select * FROM [remoteserver].[remotedatabase].[dbo].[sysindexes] where name = 'pk_remotetable' )
ALTER TABLE [remoteserver].[remotedatabase].[dbo].[remotetable] DROP CONSTRAINT [pk_remotetable]
go
if exists ( select * FROM [remoteserver].[remotedatabase].[dbo].[sysindexes] where name = 'nc_index1' )
DROP INDEX IX_index1 ON [remoteserver].[remotedatabase].[dbo].[remotetable]
go然后执行数据加载,然后创建如上所示的pk和nc索引。
注意:我的回答有点理论性,因为在我的例子中,我的数据加载是通过还原prod的备份(不是通过链接服务器)完成的,但是在我的SQL Agent工作中,我做了大量删除生产OLTP数据库所需的索引,但是在报告和创建与报告相关的索引时,这些索引都是错误的,并帮助报告运行得更快。换句话说,我确实会在源数据库中自动重新创建相同的索引,但是我确实在目标中创建了专门为报告需要而设计的新索引,而不是OLTP需求。
发布于 2019-07-15 19:34:51
就我个人而言,我使用SSIS为我需要传输的项生成创建脚本(通过右键单击您的数据库、选择任务、生成脚本)(特别是如果我不得不删除和重新创建,而不是正常创建,因为这将处理由外键关联的表序列、禁用/删除未被操作的表等)、在目标DB上执行创建脚本,然后使用SSIS数据转移操作来传输数据,这通常比从一个系统大量传输数据到另一个系统的其他方法更快。
https://dba.stackexchange.com/questions/242910
复制相似问题