테이블에 특정 인덱스가 있는지 어떻게 확인합니까?
이 같은:
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')
인덱스 존재를 감지하기위한 코딩 방식의 간결한 방법은 다음과 같습니다.
If IndexProperty(Object_Id('MyTable'), 'MyIndex', 'IndexId') Is Null
인덱스가 존재하면 IndexProperty는 Id를 반환하고, 그렇지 않으면 Id를 반환합니다.
AdaTheDEV, 나는 당신의 구문을 사용하고 다음과 그 이유를 만들었습니다.
문제점 : 색인 누락으로 인해 한 시간에 1 시간 씩 분기마다 프로세스가 실행됩니다.
수정 : 쿼리 프로세스 또는 프로 시저를 변경하여 인덱스를 확인하고 누락 된 경우 인덱스 생성 ... 쿼리와 프로 시저 끝에 동일한 코드가 배치되어 인덱스는 필요하지 않지만 분기별로 제거되므로 인덱스를 제거합니다. 여기에 드롭 구문 만 표시
-- 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
과 CREATE
색인 (예 : 배포 스크립트)에 유용 할 수 있습니다 .
create 문에 다음을 추가하여 존재 확인을 무시할 수 있습니다.
CREATE INDEX IX_IndexName
ON dbo.TableName
WITH (DROP_EXISTING = ON);
자세한 내용은 CREATE INDEX (Transact-SQL)-DROP_EXISTING 절을 참조하십시오.
NB 의견에서 언급했듯이이 절이 오류없이 발생하려면 색인이 이미 존재해야합니다.
색인이 존재하는지 빠르게 확인할 수있는 아래 기능을 작성했습니다. OBJECT_ID와 동일하게 작동합니다.
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를 반환하도록 설정할 수 있지만 유용하지는 않습니다.
질문의 숨겨진 목적이 큰 테이블을 DROP
만들기 전에 색인 INSERT
에 대한 것이라면 이것은 유용한 한 줄짜리입니다.
DROP INDEX IF EXISTS [IndexName] ON [dbo].[TableName]
이 구문은 SQL Server 2016부터 사용할 수 있습니다 IF EXISTS
.
대신 프라이머 키를 다루는 경우 다음을 사용하십시오.
ALTER TABLE [TableName] DROP CONSTRAINT IF EXISTS [PK_name]
-- 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
특정 테이블에 클러스터형 인덱스가 있는지 확인하려면 다음을 수행하십시오.
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
'IT' 카테고리의 다른 글
PHP에서 GET 요청을 보내는 방법은 무엇입니까? (0) | 2020.03.30 |
---|---|
다른 파일 확장자를 특정 언어로 처리하기 위해 VS Code를 만드는 방법은 무엇입니까? (0) | 2020.03.30 |
C의 포인터 : 앰퍼샌드와 별표를 언제 사용해야합니까? (0) | 2020.03.30 |
mysql에서 열이 비어 있는지 또는 null인지 확인하는 방법 (0) | 2020.03.30 |
전제 조건으로 표시하려면 'Assembly'* .dll '에 강력한 서명이 필요한 이유는 무엇입니까? (0) | 2020.03.30 |