Consider moving clustered indexes into different file-group means the table itself moved new file-group. I believe, your scope is to move NON Clustered indexes into new file-group to improve the performance in SQL Server.
In that case you can use following query, which moves the existing index into new file-group. For more details..
CREATE NONCLUSTERED Index NonClusteredIndexName ON TableName (Column1, Column2)
WITH (DROP_EXISTING = ON)
on NewFileGroup;
As it mentioned by "George K" answer you need find a maintenance windows to perform this activity in production server as it required additional resources from the server that eventually effects on performance.
To make scope simpler, you may script-out existing indexes and plan for batch-wise move. Following query might help you to start with.
This query produce the Create Index
statement but without columns, i was planning use STRING_AGG to do that, Unfortunately that's not applicable to your SQL Version:
SELECT OBJECT_SCHEMA_NAME(T.[object_id],DB_ID()) AS [Schema],
T.[name] AS [table_name],
I.[name] AS [index_name],
AC.[name] AS [column_name],
ic.is_included_column,
collation_name,
I.[type_desc] AS IndexType,
'CREATE ' + I.[type_desc] + ' Index ' +
I.[name] collate SQL_Latin1_General_CP1_CI_AS +
' ON ' +
T.[name] AS SQLStatement
FROM sys.[tables] AS T
INNER JOIN sys.[indexes] I ON T.[object_id] = I.[object_id]
INNER JOIN sys.[index_columns] IC ON I.[object_id] = IC.[object_id]
INNER JOIN sys.[all_columns] AC ON T.[object_id] = AC.[object_id] AND IC.[column_id] = AC.[column_id]
WHERE T.[is_ms_shipped] = 0 AND I.type = 2