업데이트 열이 인덱스에없는 업데이트 명령문에 대한 인덱스의 영향


16

나는 끊임없이 사람들이 그 인덱스는 천천히 말을보고 update, delete하고 insert. 마치 마치 마치 마치 마치 마치 총괄 진술로 사용됩니다.

성능을 개선하기 위해 데이터베이스를 조정하는 동안 논리적으로 저에게 해당 규칙과 모순되는 것처럼 보이는이 상황을 계속 겪고 있습니다.

SQL Server에서 대부분의 다른 DBMS를 믿거 나 추정 할 때 지정한 특정 열을 기반으로 인덱스가 생성됩니다. 삽입과 삭제는 항상 전체 행에 영향을 미치므로 인덱스에 영향을 미치지 않는 방법은 없지만 업데이트는 좀 더 독창적이며 특정 열에 만 영향을 줄 수 있습니다.

인덱스에 포함되지 않은 열이 있고 업데이트하면 해당 테이블의 다른 열에 대한 인덱스가있어 속도가 느려 집니까?

예를 들어, 내 User테이블에 하나 또는 두 개의 인덱스, 기본 키인 Identity / Auto Increment 열이 있고 다른 키가있을 수 있습니다.
전화 번호 또는 주소와 같이 인덱스가없는 열을 직접 업데이트하면이 상황에서 다른 열의이 테이블에 인덱스가 있기 때문에이 업데이트 속도가 느려 집니까? 내가 업데이트하는 열이 색인에 없으므로 논리적으로 색인을 업데이트해서는 안됩니다. WHERE 절의 인덱스를 사용하면 속도가 빠르다고 생각합니다.


so there is no way they will not affect the index필터링 된 인덱스를 제외하고 ...
usr

커버되지 않은 비 클러스터형 인덱스는 레코드에 대한 포인터를 포함하는 것으로 생각합니다 (일반적으로 테이블의 클러스터형 인덱스 리프 노드에서). (포함되지 않은 속성의) UPDATE 동안 속도 저하를 유발하는 한 가지 상황은 UPDATE로 인해 레코드가 클러스터형 인덱스 내에서 이동 한 상황 일 수 있다고 생각합니다. 이동으로 인해 포인터가 변경되는지 또는 포인터가 단순히 클러스터형 인덱스의 KEY 값인 경우 확실하지 않습니다.이 경우 시스템이 KEY 조회를 수행하기 때문에 가능한 위치 업데이트가 중요하지 않습니다. 레코드 값을 가져옵니다.
Jmoney38

답변:


6

색인화되지 않은 열을 업데이트해도 색인이 변경되지 않는 것이 맞습니다. 간단한 경우에는 테이블에 대한 전체적인 영향도 없습니다.

쿼리에서 인덱스를 사용하여 데이터를 조회 할 수있는 경우 조회 속도 빨라지지만 SQL 브랜드에 따라 정확한 동작은 다른 브랜드의 SQL과 다를 수 있습니다. (주로 Microsoft SQL Server를 사용합니다.)

물론, 상당히 많은 양의 데이터로 열을 업데이트하면 행이 다른 페이지로 이동 될 수 있습니다.


1
SQL Server가 OP에 언급, 난 당신이 SQL 서버 가정 할 수 있다고 생각하므로, 태그를 추가
팀 모니카 - 톰 V

10

비교적 빠른 최신 시스템의 경우 OLTP 테이블에 단일 인덱스를 추가하는 것은 대부분의 시스템에 대한 성능 관점에서 볼 수 없을 것입니다 . 즉, 불필요한 인덱스를 작성해서는 안되며 테이블의 모든 열에 대해 단일 열 인덱스를 작성해서는 안됩니다.

많은 쿼리에서 유용한 인덱스가 있으면 속도가 크게 향상된다는 가정하에 정확합니다.

귀하의 질문은 성능에 관한 것으로 보이지만 색인 추가와 관련하여 다음과 같은 여러 가지 잠재적 인 문제가 있습니다.

  1. 인덱스를 작성하는 데 필요한 시간은 인덱스가 테이블에 추가되는 동안 차단 될 수 있습니다. 자물쇠는 수명이 짧으며 큰 문제는 발생하지 않습니다.

  2. 인덱스 변경으로 인해 기본 테이블을 참조하는 계획에 대한 실행 계획이 무효화됩니다. 이러한 실행 계획을 다시 컴파일하면 일부 쿼리의 성능이 저하 될 수 있습니다.

  3. 인덱스 수정으로 인해 이전에 반환 된 것이없는 쿼리에서 오류가 반환 될 수 있습니다. varchar 필드에 포함 된 날짜를 반환하는 데 사용 된 필터링 된 인덱스의 경우를 생각해보십시오. 필터가 날짜가 아닌 행을 제거하고 이후에 해당 필터가 변경되면 날짜가 아닌 데이터를 변환하려고 할 때 해당 인덱스에 의존하는 쿼리가 실패 할 수 있습니다.

  4. 새로운 색인으로 인해 실행 순서가 변경되어 이전에 발생하지 않은 위치에서 교착 상태가 발생할 수 있습니다.


"인덱스에 영향을 미치지 않을 때 업데이트에 필요한 코드 경로를 여전히 평가해야합니다"이것은 사실이 아닙니다. 컴파일 / 최적화 단계는 어떤 인덱스를 업데이트해야하는지 잘 알고 있으며 그에 따라 계획을 만듭니다. INCLUDE 및 클러스터 된 키 열을 포함하여 인덱스의 열을 수정하지 않으면 (SET 목록에 선언 된) UPDATE 문은 해당 인덱스를 업데이트하지 않아도되며 실행 단계에서도 해당 인덱스를 건드리지 않습니다. DELETE와 INSERT는 분명히 모든 열을 논리적으로 만지고 모든 색인을 업데이트해야합니다.
Remus Rusanu

@RemusRusanu 그러나 업데이트해야 할 행을 찾는 데 인덱스를 사용할 수 있다면 평가할 필요가 없습니까?
Tom V-Team Monica

@RemusRusanu-일단 QO가 계획을 컴파일하면 더 이상 CPU가 필요하지 않다고 생각합니다. 그러나 계획을 작성하려면 반드시 그렇게해야합니다. 계획이 자주 컴파일되는 경우에는 약간의 차이가있을 수 있습니다.
Max Vernon

@TomV 인덱스를 사용하여 삭제 / 업데이트 후보 행 을 찾는 것은 완전히 다른 주제입니다. 이 경우 인덱스를 통해 행을 찾는 장점은 인덱스 유지 관리 비용 문제를 압도합니다.
Remus Rusanu

@MaxVernon 나는 DML (UPDATE)을 자주 재 컴파일하는 유효한 시나리오가 없다고 주장한다. 임시 쿼리를위한 유효한 (피할 수없는?) 재 컴파일 사례를 구입 했습니다 . 그러나 DML? 어떤 종류의 앱이 특별하고 고유 한 UPDATE 문을 만들 수 있습니까? DML로 자주 재 컴파일하면 "매개 변수 지정"이 크게 울립니다.
Remus Rusanu

-2

업데이트 작업이 정수와 같은 고정 크기의 색인화되지 않은 열을 대상으로하는 경우 일반적으로 느리지 않아야하지만 select 문과 비교하여 업데이트는 느린 디스크에도 작성해야합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.