Sql-Server

將表從一台伺服器複製到另一台伺服器,包括鍵和索引

  • July 18, 2019

我已經在一個小項目上工作了大約兩個星期。

我們希望整合來自多個遠端伺服器數據庫的一些表,以便在獨立於實時數據庫的情況下執行查詢和報告……有點像 DIY 迷你數據倉庫。

我們有三台 SQL Server 2008 遠端伺服器,我正在將數據編譯到一臺本地伺服器上,該伺服器執行三個單獨的 SQL Server Express 2017 實例。

SQL Server Express 數據庫都已設置完畢,我已經成功測試了使用幾種不同方法複製所需的表,包括:

  • SSMS 導入/導出嚮導
  • 以及使用新數據庫中的連結伺服器編寫腳本:
INSERT INTO dbo.table
 SELECT *
 FROM remoteserver.remotedatabase.dbo.remotetable

這兩個都成功複製了表和數據,但不是鍵、索引和其他約束。

我最近才在數據庫中工作,所以我自己也不知所措,Google提出了上述複製建議,但在伺服器之間傳輸表時,我找不到任何包含鍵、索引和其他約束的東西。

由於您想選擇性地編寫某些表的腳本,您可以使用dbatools 以程式方式編寫表、觸發器等,使用Export-DbaScript.

或者,您也可以嘗試Export-DbaDacPackage使用 -table參數。

由於您使用的是連結伺服器,我的回答是哪個更有效:從連結伺服器中選擇還是插入連結伺服器?也會有所幫助。

我在我的一個站點也有類似的需求:我需要在維護期間每晚從生產環境中創建一個報告數據庫。我沒有使用連結伺服器,但方法應該是一樣的,假設您在遠端伺服器上有權限來添加索引和主鍵。在數據載入步驟之後,如果索引不存在,則執行您的創建索引和主鍵命令。

-- 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 代理工作中,我做了很多 OLTP 數據庫所需的索引刪除在生產中,但在報告中鋪墊,然後創建與報告相關的索引並幫助報告執行得更快。換句話說,我會在源數據庫中自動重新創建相同的索引,但我會在目標中創建專門用於報告需求而非 OLTP 需求的新索引。

引用自:https://dba.stackexchange.com/questions/242910