programing

테이블에 특정 인덱스가 있는지 확인하려면 어떻게 해야 합니까?

starjava 2023. 4. 7. 20:47
반응형

테이블에 특정 인덱스가 있는지 확인하려면 어떻게 해야 합니까?

다음과 같은 경우:

SELECT
* 
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
WHERE CONSTRAINT_NAME ='FK_TreeNodesBinaryAssets_BinaryAssets'
and TABLE_NAME = 'TreeNodesBinaryAssets'

인덱스용입니다.

다음과 같이 직선 선택을 사용하여 수행할 수 있습니다.

SELECT * 
FROM sys.indexes 
WHERE name='YourIndexName' AND object_id = OBJECT_ID('Schema.YourTableName')

SQL 2008 이후의 경우 인덱스 존재를 검출하는 보다 간결한 방법은 내장 함수를 사용하는 것입니다.

INDEXPROPERTY ( object_ID , index_or_statistics_name , property )  

가장 간단한 사용법은IndexID속성:

If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexID') Is Null

인덱스가 존재하면 위의 ID가 반환되고, 존재하지 않으면 ID가 반환됩니다.NULL.

AdaTheDEV, 당신의 구문을 사용하여 다음과 같은 이유를 작성했습니다.

문제:누락 인덱스로 인해 프로세스가 분기마다 한 번씩 실행됩니다.

수정:인덱스를 확인하고 누락된 경우 생성하는 쿼리 프로세스 또는 절차 변경...인덱스는 필요하지 않고 분기별로 필요하므로 쿼리 및 제거 절차의 끝에 동일한 코드가 배치됩니다.여기에 삭제 구문만 표시

-- drop the index 
begin

  IF EXISTS (SELECT *  FROM sys.indexes  WHERE name='Index_Name' 
    AND object_id = OBJECT_ID('[SchmaName].[TableName]'))
  begin
    DROP INDEX [Index_Name] ON [SchmaName].[TableName];
  end

end

질문의 숨은 목적이 있다면DROP만들기 전의 색인INSERT큰 테이블로 이동하면 유용한 원라이너입니다.

DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]

이 구문은 SQL Server 2016부터 사용할 수 있습니다.문서:IF EXISTS:

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

대신 primary 키를 취급하는 경우는, 다음과 같이 해 주세요.

ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name] 

그러나 원래의 질문에서 약간 벗어난 것은 이곳에 도착하는 미래의 사람들에게 유용할 수 있습니다.DROP그리고.CREATE배포 스크립트의 인덱스.

create 문에 다음 항목을 추가하는 것만으로 기존 체크를 생략할 수 있습니다.

CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);

자세한 내용은 여기를 참조하십시오: CREATE INDEX (Transact-SQL) - DROP_Existing

N.B. 코멘트에서 언급한 바와 같이, 이 절이 오류를 발생시키지 않고 작동하려면 인덱스가 이미 존재해야 합니다.

OBJECT_처럼 동작하는 인덱스가 존재하는지 빠르게 확인할 수 있는 아래 함수를 작성했습니다.아이디

CREATE FUNCTION INDEX_OBJECT_ID (
    @tableName VARCHAR(128),
    @indexName VARCHAR(128)
    )
RETURNS INT
AS
BEGIN
    DECLARE @objectId INT

    SELECT @objectId = i.object_id
    FROM sys.indexes i
    WHERE i.object_id = OBJECT_ID(@tableName)
    AND i.name = @indexName

    RETURN @objectId
END
GO

편집: OBJECT_만 반환됩니다.테이블의 ID이지만 인덱스가 존재하지 않으면 NULL이 됩니다.index_id를 반환하도록 설정할 수 있지만 그다지 유용하지는 않습니다.

-- Delete index if exists
IF EXISTS(SELECT TOP 1 1 FROM sys.indexes indexes INNER JOIN sys.objects 
objects ON indexes.object_id = objects.object_id WHERE indexes.name 
='Your_Index_Name' AND objects.name = 'Your_Table_Name')
BEGIN
    PRINT 'DROP INDEX [Your_Index_Name] ON [dbo].[Your_Table_Name]'
    DROP INDEX [our_Index_Name] ON [dbo].[Your_Table_Name]
END
GO
EXEC sp_helpindex '[[[SCHEMA-NAME.TABLE-NAME]]]'
GO

클러스터된 인덱스가 특정 테이블에 있는지 확인하려면:

SELECT * FROM SYS.indexes 
WHERE index_id = 1 AND name IN (SELECT CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE TABLE_NAME = 'Table_Name')

언급URL : https://stackoverflow.com/questions/2689766/how-do-you-check-if-a-certain-index-exists-in-a-table

반응형