테이블에 특정 인덱스가 있는지 확인하려면 어떻게 해야 합니까?
다음과 같은 경우:
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
:
대신 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
'programing' 카테고리의 다른 글
데이터베이스의 각 테이블에 있는 레코드 수를 나열하기 위한 쿼리 (0) | 2023.04.07 |
---|---|
SQL Server SELECT LAST N 행 (0) | 2023.04.07 |
AngularJs $watch on $location.reloadOnSearch가 false인 경우 검색이 작동하지 않음 (0) | 2023.04.02 |
UI 그리드 상수를 사용하여 스크롤 막대 사용 안 함 (0) | 2023.04.02 |
불변성 실패:외부에서는 사용하지 마십시오. (0) | 2023.04.02 |