Programing

테이블을 다른 파일 그룹으로 이동하려면 어떻게해야합니까?

lottogame 2020. 12. 8. 07:40
반응형

테이블을 다른 파일 그룹으로 이동하려면 어떻게해야합니까?


두 개의 큰 테이블이있는 SQL Server 2008 Ent 및 OLTP 데이터베이스가 있습니다. 서비스 중단없이이 테이블을 다른 파일 그룹으로 이동하려면 어떻게해야합니까? 이제이 테이블에서 약 100-130 개의 레코드가 삽입되고 30-50 개의 레코드가 매초 업데이트됩니다. 각 테이블에는 약 1 억 개의 레코드와 6 개의 필드 (1 개의 필드 지리 포함)가 있습니다.

Google을 통해 솔루션을 찾고 있지만 모든 솔루션에는 "두 번째 테이블 만들기, 첫 번째 테이블에서 행 삽입, 첫 번째 테이블 삭제, bla bla bla"가 포함되어 있습니다.

이 문제를 해결하기 위해 파티셔닝 기능을 사용할 수 있습니까? 감사합니다.


테이블을 새 파일 그룹으로 이동하려는 경우 원하는 새 파일 그룹의 테이블에 클러스터형 인덱스를 다시 만들어야합니다 (결국 : 클러스터형 인덱스 테이블 데이터 임).

예를 들어 다음과 같이 할 수 있습니다.

CREATE CLUSTERED INDEX CIX_YourTable
   ON dbo.YourTable(YourClusteringKeyFields)
   WITH DROP_EXISTING
   ON [filegroup_name]

또는 클러스터형 인덱스가 고유 한 경우 :

CREATE UNIQUE CLUSTERED INDEX CIX_YourTable
   ON dbo.YourTable(YourClusteringKeyFields)
   WITH DROP_EXISTING
   ON [filegroup_name]

이렇게하면 새 클러스터형 인덱스가 생성되고 기존 인덱스가 삭제되고 지정한 파일 그룹에 새 클러스터형 인덱스가 생성됩니다. 테이블 데이터가 새 파일 그룹으로 이동되었습니다.

지정할 수있는 모든 사용 가능한 옵션에 대한 자세한 내용 은 CREATE INDEXMSDN 문서를 참조하십시오 .

물론 이것은 아직 이별을 다루지는 않지만 그 자체로 완전히 다른 이야기입니다 ...


이 질문에 답하려면 먼저

  • 테이블에 인덱스가없는 경우 데이터를 이라고합니다.
  • 테이블에 클러스터형 인덱스가있는 경우 해당 인덱스는 사실상 테이블 데이터입니다. 따라서 클러스터형 인덱스를 이동하면 데이터도 이동됩니다.

첫 번째 단계는 이동하려는 테이블에 대한 자세한 정보를 찾는 것입니다. 이 T-SQL을 실행하여이를 수행합니다.

sp_help N'<<your table name>>'

출력에는 'Data_located_on_filegroup'이라는 제목의 열이 표시됩니다. 이것은 테이블 데이터가있는 파일 그룹을 알 수있는 편리한 방법입니다. 그러나 더 중요한 것은 테이블의 인덱스에 대한 정보를 보여주는 출력입니다. (테이블 인덱스에 대한 정보 만 보려면을 실행하십시오. sp_helpindex N'<<your table name>>') 테이블에 1) 인덱스가 없으므로 (힙), 2) 단일 인덱스 또는 3) 여러 인덱스가있을 수 있습니다. index_description이 'clustered, unique, ...'로 시작하면 이동하려는 인덱스입니다. 인덱스도 기본 키이면 괜찮습니다. 그래도 이동할 수 있습니다.

색인을 이동하려면 위의 도움말 쿼리 결과에 표시된 index_name 및 index_keys를 기록한 다음이를 사용 <<blanks>>하여 다음 쿼리 를 채 웁니다 .

CREATE UNIQUE CLUSTERED INDEX [<<name of clustered index>>]
ON [<<table name>>]([<<column name the index is on - from index_keys above>>])
WITH DROP_EXISTING, ONLINE
ON <<name of file group you want to move the index to>>

DROP EXISTING, ONLINE옵션이 중요합니다. DROP EXISTING인덱스가 중복되지 않았는지 확인 ONLINE하고 이동하는 동안 테이블을 온라인 상태로 유지합니다.

인덱스가있는 거 이동이 당신을하면 되지 클러스터 된 인덱스, 다음 교체 UNIQUE CLUSTERED위의와NONCLUSTERED

힙 테이블을 이동하려면 클러스터형 인덱스를 추가 한 다음 위의 문을 실행하여 다른 파일 그룹으로 이동 한 다음 인덱스를 삭제합니다.

이제 돌아가서 sp_help테이블에서 실행 하고 결과를 확인하여 테이블 및 인덱스 데이터가 현재 어디에 있는지 확인하십시오.

테이블에 인덱스가 두 개 이상 있는 경우 위의 문을 실행하여 클러스터형 인덱스를 이동하면 클러스터형 인덱스 sp_helpindex가 새 파일 그룹에 있지만 나머지 인덱스는 여전히 원래 파일 그룹에 있음을 표시합니다. 테이블은 계속 정상적으로 작동하지만 인덱스를 다른 파일 그룹에 배치하려는 이유가 있어야합니다. 테이블과 모든 인덱스가 동일한 파일 그룹 CREATE [NONCLUSTERED, or other] ... DROP EXISTING...에 있도록하려면 이동할 인덱스 유형에 따라 필요에 따라 대체하여 각 인덱스에 대해 위의 지침을 반복합니다 .


분할은 하나의 해결책이지만 다음을 사용하여 서비스 중단없이 클러스터형 인덱스를 새 파일 그룹으로 "이동"할 수 있습니다 (일부 조건에 따라 다름, 아래 링크 참조).

CREATE CLUSTERED /*oops*/ INDEX ... WITH (DROP_EXISTING = ON, ONLINE = ON, ...) ON newfilegroup

클러스터형 인덱스 데이터이며 파일 그룹 이동과 동일합니다.

CREATE INDEX를 참조하십시오.

이는 기본 키가 클러스터링되었는지 여부에 따라 달라지며, 이로 인해 수행 방법이 변경됩니다.


SQL Server 온라인 설명서에서 발췌 한이 내용은 다음과 같습니다. "클러스터형 인덱스의 리프 수준과 데이터 페이지가 정의상 동일하기 때문에 클러스터형 인덱스를 만들고 ON partition_scheme_name 또는 ON filegroup_name 절을 사용하면 파일 그룹에서 테이블이 효과적으로 이동됩니다. 새 파티션 구성표 또는 파일 그룹에 테이블이 생성되었습니다 . " (출처-http: //msdn.microsoft.com/en-us/library/ms188783.aspx ) from ( http://www.mssqltips.com/sqlservertip/2442/move-data-between-sql-server-database -filegroups / )

다음은 marc_s가 수락 한 답변과 같이 다른 친구들이 이미 말했듯이 스크린 샷은 SSMS GUI를 사용하여 다른 방법을 제공합니다.

스토리지 탭의 인덱스 속성에서 다른 파일 그룹으로 쉽게 이동할 수 있습니다. 여기에 이미지 설명 입력


클러스터형 인덱스를 다시 만들면 "기본"열만 이동된다는 점에 유의하십시오 int, bit, datetime.

이동 varchar(max), varbinary및 기타 "blob"열을 사용하려면 테이블을 다시 만들어야합니다. 고맙게도 SSMS에서이 작업을 반자동으로 수행하는 방법이 있습니다. 테이블 "design"창에서 "text filegroup"을 변경 한 다음 변경 사항을 저장하는 것입니다.

자세한 내용이 필요한 경우 https://www.jitbit.com/alexblog/153-moving-sql-table-textimage-to-a-new-filegroup/에서 이에 대해 블로그를 작성했습니다 .


테이블을 다른 파일 그룹으로 이동하려면 어떻게해야합니까?

NOTE: Moving a table to another filegroup only works with Enterprise Edition.

Step 1 :

Check on which filegroup table is residing:

-- Query to check the tables and their current filegroup:

SELECT    tbl.name AS [Table Name], 
          CASE WHEN dsidx.type='FG' THEN dsidx.name ELSE '(Partitioned)' END AS [File Group] 
FROM      sys.tables AS tbl 
JOIN      sys.indexes AS idx 
ON        idx.object_id = tbl.object_id 
AND       idx.index_id <= 1 
LEFT JOIN sys.data_spaces AS dsidx 
ON        dsidx.data_space_id = idx.data_space_id 
ORDER BY  [File Group], [Table Name] 

Step 2 :

Move an existing table / tables to the new Filegroup

If the filegroup you want to move the table to doesn’t already exist then please create the secondary filegroup and then move the table.

To move a table to a different filegroup involves moving the table’s clustered index to the new filegroup. The leaf level of the clustered index actually contains the table data. So moving the clustered index can be done in a single statement using the DROP_EXISTING clause as follows:

CREATE UNIQUE CLUSTERED INDEX [Index_Name] ON [SchemaName].[TableName]
(
    [ClusteredIndexKeyFields]
)WITH (DROP_EXISTING = ON, ONLINE = ON) ON [FilegroupName]
GO

Step 3:

Move the remaining Non-Clustered indexes to secondary filegroup

You have to move the Non-clustered indexes manually by using the below mentioned syntax:

--1st check the index information using the following sp
sp_helpindex [YourTableName]


--Now by using the following query you can move the remaining indexes to secondary filegroup
CREATE NONCLUSTERED INDEX [Index_Name] ON [SchemaName].[TableName]
(
    [IndexKeyFields]
)WITH (DROP_EXISTING = ON, ONLINE = ON) ON [FilegroupName]
GO

Moving a Heap to another filegroup:

As I know the only way to move the Heap to another filegroup is to temporarily add a clustered index on the new filegroup and then drop it (if necessary).


I think these steps are very simple and straight forward to move any table to a different file group (through Management Studio):

  • Move all non-clustered indexes to a new file group simply by changing the FileGroup property for each indexes

  • Change your cluster index to non-cluster and change its file group simply (like the previous step)

  • Add a new temporary cluster index with "new file group" through this command(or via IDE) :

       CREATE CLUSTERED INDEX [PK_temp]
    ON YOURTABLE([Id])
      ON NEWFILEGROUP
    

    (the above command causes to move all data to new file group)

  • Delete the above temporary PK (when it does its job prefectly!)

  • Change back your main cluster index to be cluster index again (through IDE again)

위 단계의 이점은 기존 FK 관계를 삭제할 필요가 없다는 것입니다. 또한 IDE를 사용하면 오류 상태에서 데이터 손실을 방지 할 수 있습니다.

참고 : 디스크 할당량이 파일 그룹에 대해 활성화되어 있지 않은지 확인하거나 잘못 설정하십시오. 그렇지 않으면 "파일 그룹이 가득 참"예외가 발생합니다!


CREATE CLUSTERED INDEX IXC_Products_Product_id
ON dbo.Products(Product_id)
WITH (DROP_EXISTING = ON) ON MyNewFileGroup

참고 URL : https://stackoverflow.com/questions/2438019/how-i-can-move-table-to-another-filegroup

반응형