2017-12-11 13 views
0

SQL Server에 대한 의문점이 있습니다. 60 개 이상의 열과 1Millon 이상의 행이있는 테이블이 있습니다. 내가 5 행 또는 6 열을 기반으로 행을 hade하면 모든 열이 필요하므로 (선택 항목이므로 *) 인덱스를 가지고 있지만 select * SqlServer가 사용하지 않는 인덱스를 찾을 수 있도록 노력합니다. 그것은 찾기와 너무 많은 시간이 걸리는 것처럼, "id"를 먼저 선택하고 발견 한 id로 다른 select *를 선택하지만, 이제는 두 개의 쿼리가 있습니다.SQL Server가 중복 찾기 (모든 열 가져 오기)를 향상시킵니다.

PD : 쿼리가 최대 절전 모드

윌 느릅 나무로 만들어진 것은 모든 행이 할 수있는 가장 좋은 방법이 될?

+0

그래서 테이블 자체에 합류하고 있는데이 테이블의 5-6 열을 사용하여 중복 된 데이터를 확인하려고합니다. 맞습니까? – Naros

+0

그래, 기본적으로,하지만 내 동면 응용 프로그램에서 이렇게, 먼저 기준과 ID를 찾은 다음 나머지 행 – Eber

+0

바로 내 대답을 참조하십시오. 아이디어는 반드시 하위 쿼리를 사용하여 필수 조건에 대한 자체 조인을 수행 한 다음 외부 쿼리의 in 절 내부에 포함시킵니다. 이를 수행하기 위해 2 개의 쿼리를 실행할 필요가 없으며 하나만 실행하고 하위 쿼리 필터링을 활용하면됩니다. – Naros

답변

0

SQL Server는 기본 키가있는 테이블에 대해 인덱스를 자동으로 구성하므로 테이블에 기본 키가 올바르게 구성되었는지 확인하십시오.

두 번째로, 중복 된 항목을 필터링하는 데 사용중인 5 또는 6 열의 인덱스 또는 각 열의 인덱스를 개별적으로 구성해야합니다. 문제가되는 값의 밀도에 대해 더 많은 정보를 알지 못하면 어떤 인덱스 스키마 유형이 더 효율적인지 알려주지 않습니다.

데이터베이스가 이러한 인덱스를 사용하여 결과 세트에 필요한 행에 대한 데이터 페이지 오프셋을 결정하고 이에 따라 간단히 가져 오는 것이 매우 쉽습니다.

또한, 그래 당신은 그것을보다 효율적으로 실행하기 위해 찾을 수 있습니다과 같은 쿼리를 효과적으로 단순히 인덱스를 조작하는 것 같은 서브 쿼리 동안 데이터 페이지를 타격하지 않도록 때문에

SELECT * FROM Table t 
WHERE t.id IN (
    /* your filter criteria that simply returns ID after joining the table with 
     itself using the 5 or 6 columns to filter the data 
    */ 
) 

이유는 인 임시 테이블은 최종 결과 집합을 결정하기 위해 폭이 매우 좁습니다. SELECT *을 실행하면 하위 쿼리의 데이터 페이지가 분명히 손상되어 성능 문제가 발생할 수 있습니다.

+0

ID가 클러스터 된 인덱스를 가지고 있는데, 이는 이것이 내 PK이기 때문에 클러스터되지 않은 인덱스를 사용하여 ID를 찾은 다음 중복 된 인덱스를 찾기 위해 5 개의 중요한 열이있는 클러스터되지 않은 인덱스가있는 것입니다. dlustered id 인덱스를 사용하는 행. – Eber

+0

맞지만 위의 내용은 한 번에 두 인덱스를 모두 사용할 수 있어야합니다. – Naros

+0

확실히, 당신은 내가 찾고 있었던 것을 정확하게 나에게 준다. .. 정말로 정말로 당신에게 감사한다! !! – Eber