sql 기본 키 및 인덱스
기본 키로 설정된 데이터베이스에 ID 행(int)이 있다고 가정합니다.자주 ID를 조회할 경우 인덱스도 작성해야 합니까?아니면 프라이머리 키가 되면 이미 인덱스가 작성되어 있는 것입니까?
MS SQL Server에서는 앞서 말한 바와 같이 이 ID에 인덱스를 작성할 수 있기 때문입니다.
편집: 추가 질문 - 기본 키를 추가로 인덱싱해도 문제가 없습니까?
맞습니다. SQL Server를 통해 동일한 필드에 중복 인덱스를 만들 수 있습니다.그러나 다른 인덱스를 생성할 수 있다고 해서 PK 인덱스가 이미 존재하지 않는 것은 아닙니다.
인덱스를 추가하는 것은 도움이 되지 않지만, 유일한 손해(매우 작음)는 파일 크기와 행 생성 오버헤드입니다.
다른 모든 사용자가 이미 말했듯이 기본 키는 자동으로 색인화됩니다.
기본 키 열에 더 많은 인덱스를 만드는 것은 기본 키 및 기타 특정 열을 사용하는 쿼리를 최적화해야 하는 경우에만 유효합니다.프라이머리 키열에 다른 인덱스를 만들고 여기에 다른 열을 포함하면 쿼리에 대해 원하는 최적화에 도달할 수 있습니다.
예를 들어, 많은 열이 있는 테이블이 있지만 ID, 이름 및 주소 열만 쿼리하고 있습니다.ID를 프라이머리 키로 하여 ID를 기반으로 하지만 Name 및 Address 열을 포함하는 다음 인덱스를 생성할 수 있습니다.
CREATE NONCLUSTERED INDEX MyIndex
ON MyTable(ID)
INCLUDE (Name, Address)
따라서 이 쿼리를 사용할 경우:
SELECT ID, Name, Address FROM MyTable WHERE ID > 1000
SQL Server는 사용자가 만든 인덱스만 사용하여 결과를 제공하고 실제 테이블에서는 아무 것도 읽지 않습니다.
메모: 이 답변은 전체 엔터프라이즈 클래스의 개발을 대상으로 합니다.
이것은 SQL Server뿐만 아니라 RDBMS의 문제이며 동작은 매우 흥미로울 수 있습니다.우선, 프라이머리 키가 자동적으로(고유하게) 인덱스 되는 것이 일반적이지만, 절대적인 것은 아닙니다.프라이머리 키를 일의로 색인화하지 않는 것이 중요한 경우가 있습니다.
대부분의 RDBMS에서는 프라이머리 키가 존재하지 않는 경우 고유 인덱스가 자동으로 생성됩니다.따라서 프라이머리 키로 선언하기 전에 프라이머리 키열에 독자적인 인덱스를 작성할 수 있습니다.그러면 프라이머리 키 선언을 적용할 때 데이터베이스 엔진에서 해당 인덱스가 사용됩니다(가능한 경우).기본 키를 만들고 기본 고유 인덱스를 만든 다음 해당 열에 자체 대체 인덱스를 만든 다음 기본 인덱스를 삭제할 수 있습니다.
여기서 재미있는 점은 고유한 기본 키 인덱스를 원하지 않는 경우입니다.테이블이 인덱스를 관리하는 데 비용이 너무 많이 들 정도로 충분한 데이터(행)를 획득하는 경우 인덱스를 원하지 않으며 사용할 수 없습니다.이는 하드웨어, RDBMS 엔진, 테이블과 데이터베이스의 특성 및 시스템 부하에 따라 달라집니다.단, 일반적으로 테이블이 몇 백만 행에 도달하면 나타납니다.
중요한 문제는 행을 삽입하거나 기본 키 열을 업데이트할 때마다 고유성을 보장하기 위해 인덱스 스캔이 발생한다는 것입니다.이 고유 인덱스 스캔(또는 RDBMS에서는 동등한 것)은 테이블이 커짐에 따라 테이블의 성능을 지배할 때까지 훨씬 더 비싸집니다.
저는 하루에 20억 개의 행, 8TB의 스토리지, 4,000만 개의 행 삽입에 이르는 테이블에서 이 문제를 여러 번 다뤄 왔습니다.저는 관련된 시스템을 재설계하는 임무를 맡았습니다. 여기에는 실질적으로 1단계로서 고유한 주요 인덱스를 폐기하는 것이 포함됩니다.실제로 이 지수를 떨어뜨리는 것은 재설계에 근접하기 전에 단순히 운영 중단으로부터 복구하기 위해 필요했습니다.이 재설계에는 기본 키의 고유성을 보장하고 데이터에 신속하게 액세스할 수 있는 다른 방법을 찾는 것이 포함되었습니다.
기본 키는 기본적으로 항상 인덱싱됩니다.
SQL Server Management Studio 또는 Transact-SQL을 사용하여 SQL Server 2012에서 기본 키를 정의할 수 있습니다.기본 키를 만들면 해당 고유, 클러스터 또는 비클러스터된 인덱스가 자동으로 생성됩니다.
http://technet.microsoft.com/en-us/library/ms189039.aspx
MSDN으로부터의 패스워드는 다음과 같습니다.
테이블에 PRIMAY KEY 제약조건을 지정하면 데이터베이스 엔진은 기본 키 열에 대해 고유한 인덱스를 생성하여 데이터의 고유성을 적용합니다.또한 이 인덱스를 사용하면 기본 키가 쿼리에 사용되는 경우 데이터에 빠르게 액세스할 수 있습니다.따라서 선택한 기본 키는 고유한 인덱스 생성 규칙을 따라야 합니다.
비클러스터를 지정하지 않으면 PK는 클러스터된 인덱스가 됩니다.
의 선언PRIMARY KEY
★★★★★★★★★★★★★★★★★」UNIQUE
SQL Server에 대해 설명하겠습니다.
제약 조건을 일치시키지 않고 고유한 인덱스를 생성할 수 있지만 고유한 인덱스가 없으면 제약 조건(기본 키 또는 고유)이 존재할 수 없습니다.
여기서부터 제약조건을 작성하면 다음과 같이 됩니다.
- 같은 이름의 인덱스를 작성하다
- 생성된 인덱스가 없으면 제약 조건이 존재할 수 없으므로 인덱스를 삭제하지 않음
동시에 제약 조건을 해제하면 관련 인덱스가 삭제됩니다.
그렇다면, 실제적인 차이가 있을까요?PRIMARY KEY
또는UNIQUE INDEX
:
NULL
값은 에서 사용할 수 없습니다.PRIMARY KEY
, 단, 허용됩니다.UNIQUE
인덱스 및 집합 연산자(UNION, EXCEPT, CRESS)의 경우와 같음, 여기서NULL = NULL
즉, 하나의 값만 2로 가질 수 있습니다.NULL
는 서로 중복된 것으로 검출됩니다.- 단 하나.
PRIMARY KEY
999개의 고유 인덱스를 생성할 수 있는 동안 테이블당 존재할 수 있습니다. - 언제
PRIMARY KEY
제약조건이 생성되고 테이블에 클러스터된 인덱스가 존재하지 않는 한 클러스터된 인덱스로 생성됩니다.NONCLUSTERED
의 정의에 사용됩니다.UNIQUE
인덱스가 생성되고 다음으로 생성됩니다.NONCLUSTERED
특정하지 않는 한CLUSTERED
그리고 그러한 것은 이미 존재하지 않는다.
이 키를 기본 키로 만들면 해당 키에 대한 인덱스가 자동으로 생성됩니다.
SQL Server에서는 일반적으로 기본 키가 자동으로 인덱싱됩니다.이는 사실이지만 더 빠른 쿼리를 보장하지는 않습니다.프라이머리 키는 프라이머리 키로서 필드가1개밖에 없는 경우에 뛰어난 퍼포먼스를 제공합니다.그러나 기본 키로 여러 필드가 있는 경우 인덱스는 해당 필드를 기반으로 합니다.
예를 들어 다음과 같습니다.필드 A, B, C가 프라이머리 키이기 때문에 WHERE CLAUSE의 이들 3개의 필드를 기반으로 쿼리하면 퍼포먼스는 양호하지만 WHERE CLAUSE의 Only C 필드를 사용하여 쿼리하는 경우에는 퍼포먼스가 향상되지 않습니다.따라서 성능을 활성화하고 실행하려면 C 필드를 수동으로 인덱싱해야 합니다.
대부분의 경우 100만 개 이상의 레코드가 기록될 때까지 이 문제를 볼 수 없습니다.
저는 인덱스가 없는 대용량 데이터베이스를 가지고 있습니다.
프라이머리 키를 사용하여 쿼리하면 모든 집중적인 목적으로 즉시 결과가 나타납니다.
기본 키는 자동으로 색인화됩니다.
용도에 따라 pk를 사용하여 추가 인덱스를 생성할 수 있습니다.
- 인덱스 zip_code, id는 zip_code와 id로 선택하는 경우가 많으면 도움이 될 수 있습니다.
언급URL : https://stackoverflow.com/questions/462477/sql-primary-key-and-index
'programing' 카테고리의 다른 글
Xcode 6 버그: Interface Builder 파일의 알 수 없는 클래스 (0) | 2023.04.22 |
---|---|
정적 상수 문자열(클래스 멤버) (0) | 2023.04.22 |
c# 코드로 Data Template를 빌드하려면 어떻게 해야 하나요? (0) | 2023.04.17 |
Swift 어레이 할당에 일관성이 없는 이유(레퍼런스나 딥 카피 모두)가 있습니까? (0) | 2023.04.17 |
셸 스크립트의 YYY-MM-DD 형식 날짜 (0) | 2023.04.17 |