2011-09-23 3 views
4

기본 키를 제외한 모든 인덱스를 삭제하려고합니다. 기본 키를 직접 만들었지 만 다른 모든 인덱스는 SQL Server의 제안이었습니다.단일 쿼리로 기본 키를 제외한 모든 인덱스를 삭제하는 방법

기본 키가 아닌 모든 인덱스를 삭제 한 후 데이터베이스 조정 권고 자용 SQL Server 프로파일 러 튜닝 템플릿을 사용하고 인덱스를 만들 계획입니다.

이렇게하면 사용되지 않는 색인이나 성능 저하 색인이 없도록 계획합니다.

어떻게 논리적입니까? 감사합니다.

답변

11
DECLARE @sql NVARCHAR(MAX) = N''; 

SELECT @sql += N'DROP INDEX ' 
    + QUOTENAME(SCHEMA_NAME(o.[schema_id])) 
    + '.' + QUOTENAME(o.name) 
    + '.' + QUOTENAME(i.name) + ';' 
    FROM sys.indexes AS i 
    INNER JOIN sys.tables AS o 
    ON i.[object_id] = o.[object_id] 
WHERE i.is_primary_key = 0 
AND i.index_id <> 0 
AND o.is_ms_shipped = 0; 

PRINT @sql; 
-- EXEC sp_executesql @sql; 
+0

코드에 대해 감사드립니다. :) – MonsterMMORPG

+0

외 1 개. 새 줄에 char 13을 추가하십시오 : D + '.' + QUOTENAME (i.name) + ';'+ char (13) – MonsterMMORPG

4

아마도 가장 쉬운 방법은 다음과 같습니다.이 쿼리를 실행하면 DROP INDEX ..... 문 목록이 출력됩니다.

SELECT 
    'DROP INDEX ' + name + ' ON ' + 
    OBJECT_SCHEMA_NAME(object_id) + '.' + OBJECT_NAME(object_Id) 
FROM sys.indexes 
WHERE is_primary_key = 0 
AND name IS NOT NULL 
AND OBJECT_SCHEMA_NAME(object_id) <> 'sys' 

복사 새 쿼리 창에 결과 그리드에서 그 DROP 문은, 어쩌면 그들을 확인을 조정할 한 다음 실제로 인덱스를 드롭을 실행합니다.

+0

실수로 MSDB 또는 master에서이 코드를 실행하면 sys 스키마에없는 시스템 개체에 대한 행이 반환됩니다. 명심해야 할 것이 있습니다. OBJECTPROPERTY (object_id, 'IsMsShipped') = 0'를 사용하면 쉽게 수정할 수 있습니다. –

+0

@AaronBertrand : 감사합니다 - 당신의 솔루션은 분명히 제 것보다 훨씬 잘 작동합니다 - 나는 미래의 그것에 대한 정신적 인 메모를해야 할 것입니다! 감사합니다 –

+1

내 문제는 데이터베이스에 많은 인덱스가있는 경우 전체 문자열을 미리 볼 수 없을 수도 있다는 것입니다. 그러나 절대적으로 위대한 경우가 아니라면 그것을 실행할 수 있습니다. –

관련 문제