이 2 천만 레코드 뷰를 더 빨리 쿼리하려면 어떻게합니까?


14

검색 기능을 위해 검색 해야하는 모든 테이블의 레코드가있는보기를 사용하고 있습니다. 이보기에는 거의 2 천만 건의 기록이 있습니다. 이보기에 대한 검색에 시간이 너무 많이 걸립니다.

이 뷰의 성능을 향상 시키려면 어디를 봐야합니까?

보기의 대략적인 정의는 다음과 같습니다. 여기에는 13 개의 테이블과 30 개의 필드가 포함됩니다.

CREATE VIEW [dbo].[v_AllForSearch]
AS
SELECT 
  FT.firstField AS [firstField]
, FT.fld_primary AS [fld_primary]
, FT.fld_thirdField AS [thirdField]
, FT.fld_fourthField AS [fourthField]           
, ISNULL(ST.[fld_firstSearchField],'') AS [firstSearchField]
, ISNULL(TT.[fld_thirdSearch],'') AS thirdSearch
, ISNULL(TT.[fld_fourthSearch],'')AS fourthSearch
, ISNULL(TT.[fld_fifthSearch],'')AS fifthSearch
, ISNULL(FRT.[fld_sixthSearch],'') As [sixthSearch]
, ISNULL(FRT.[fld_seventhSearch],'') AS [seventhSearch]
, ISNULL(FRT.[fld_eightSearch],'')AS [eightSearch]
, ISNULL(FIT.[fld_nineSearch],'') AS [nineSearch]
, ISNULL(SIT.[fld_tenthSearch],'')AS [tenthSearch]
, ISNULL(SET.[fld_eleventhSearch],'') AS [eleventhSearch]
, ISNULL(ET.[twelthSearch],'')AS [twelthSearch]
, ISNULL(NT.[thirteenthSearch],'')AS [thirteenthSearch]
, ISNULL(NT.[fourteenSearch],'') AS [fourteenSearch]
, ISNULL(NT.[fifteenSearch],'') AS [fifteenSearch]
, ISNULL(NT.[sxteenSearch],'')  AS [sxteenSearch]
, ISNULL(NT.[seventeenSearch],'') AS [seventeenSearch]
, ISNULL(NT.[eighteenSearch],'')AS [eighteenSearch]
, ISNULL(TT.[ninteenSearch],'') AS [ninteenSearch]
, ISNULL(ELT.[twentySearch],'') AS [twentySearch]
, ISNULL(ELT.[twentyOneSearch],'') AS [twentyOneSearch]
, ISNULL(TWT.[twentyTwoSearch],'') AS [twentyTwoSearch]
, ISNULL(THT.twentyThree,'') AS [twentyThree]
, ISNULL(THT.twentyFour,'') AS [twentyFour]
, ISNULL(THT.twentyFive,'') AS [twentyFive]
, ISNULL(THT.twentySix,'') AS [twentySix]
FROM 
      tblFirstTable AS FT         
      LEFT JOIN [tblSecondTable] AS ST 
            ON ST.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblThirdTable] AS TT 
            ON TT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblFourthTable] AS FRT 
            ON FRT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblFifthTable] AS FIT 
            ON FIT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblSixthTable] AS SIT 
            ON SIT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblSeventhTable] AS SET 
            ON SET.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblEighthTable] AS ET 
            ON ET.[fld_primary] = FT.[fld_primary] 
      LEFT JOIN [tblNinthTable] AS NT 
            ON NT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblELTnthTable] AS TT 
            ON TT.[fld_primary] = FT.[fld_primary]        
      LEFT JOIN [tblEleventhTable] AS ELT 
            ON ELT.[fld_primary] = FT.[fld_primary]       
      LEFT JOIN [tblTwelthTable] AS TWT 
                            ON TWT.[fld_id] = ELT.[fld_id]  
              LEFT JOIN [tblThirteenthTable] AS THT
            ON THT.[firstField]= FT.[firstField]
WHERE fld_Status ..

답변:


9

뷰는 확장되는 매크로입니다. 따라서 뷰가 2 개의 테이블의 JOIN 인 경우 실행 계획에 2 개의 테이블이 표시됩니다. 보기가 투명합니다.

뷰가 색인화되거나 구체화 된 경우에는 적용되지 않습니다. 그러나이 질문을하지 않을 것입니다.

그렇다면 실행 계획은 무엇을 말합니까? DTA? 누락 된 인덱스 dmv 쿼리? 가장 비싼 dmv 쿼리?


그는 구체화 된 견해에 대한 질문을 할 수도 있지만, 그것이 일반적으로 다른 테이블로 구현되어 색인화 될 수 있다는 것을 인식하지 못합니다.
Joe

@Joe : 가능하지만 OP가 차이점을 알고 있다면 도움을 요청하지 않았을 것입니다.
gbn

문제는 MS SQL Server에 대한 태그 그렇게보다는 우리가 "인덱싱 된 뷰 '에 대해 이야기한다"구체화 된 뷰를 "입니다)
AndrewSQL

1
@AndrewSQL : 했어요. 그러나 우리는보다 낮은 생활 양식을 제공해야합니다.
gbn

6

뷰와 테이블에 대한 자세한 내용이 없으면 그 대답은 "의존적"이지만 인덱스가 필요한 필드에 대한 뷰의 WHERE 절을 시작할 수 있습니다.


1
그러나 나는 (... "나는 내가 아는이 사람 말을 들었다"에 따라) 일반적으로 뷰는 인덱스에서 크게 도움이되지 않는 인상이었다
jcolebrand

5
@jcolebrand : 일반적으로 뷰는 사용 방법에 따라 인덱스가 크게 도움이됩니다. 기본적으로 주어진 쿼리에서 사용될 때 코드에 쿼리에 직접 삽입 된 것처럼 도움이됩니다. 간단한 뷰 + 쿼리의 경우 간단한 쿼리뿐만 아니라 인덱스도 사용합니다. 보다 복잡한 뷰 / 쿼리의 경우 쿼리 플래너가 수행 할 작업을 다시 정렬하고 최적화 할 수있는 정도에 따라 다릅니다. 이를 확인하는 가장 좋은 방법은 큰 데이터 집합을 선택하고이를 사용하여 몇 가지 예제보기 및 쿼리를 제조하고 SSMS의 쿼리 계획 디스플레이에 QP가 수행 한 작업이 표시되는지 확인하는 것입니다.
David Spillett

6

다른 사람들이 말한 것 외에도 (WHERE 절, 도움이 될만한 INDEXes) 뷰에서 인덱스를 생성하는 것이 가능하다고 가정하면 인덱스 뷰를 고려할 것을 제안합니다 ( details ). 그런 다음 NOEXPAND 힌트를 쿼리에 적용 할 수도 있습니다 ( details ).


이러한 세부 사항은 유망한 것으로 들리지만 다시 시도해보고 결과를 다시 살펴 보겠습니다.
balu 2019

4

일반적인 대답은 실행 계획을 살펴 보는 것입니다. 조인이 색인됩니까? 출력 필드가 해당 인덱스에 포함되어 있습니까? 볼 필요가있는 열만 출력하고 있습니까?


0

아마 내가 할 일은 2 뷰를 만드는 것입니다.

  • 첫 번째보기는 검색해야하는 필드에 불과합니다. 그 필드들만 각 행의 ID 필드와 검색하는 테이블 종류를 반환합니다. 여러 테이블을 검색하는 UNION ALL 뷰를 만들어 비슷한 작업을 수행했습니다. 방금 ID, 유형 및 텍스트 필드를 포함시키기 위해 검색하고 싶었습니다.

  • 두 번째보기는 첫 번째보기에서 수집 된 결과 표시를 처리하며 결과를 표시하거나보기 대신 모든 테이블을 저장 프로 시저로 만듭니다.

맨 아래에 GROUP BY가있는 UNION ALL을 수행하고 왼쪽 외부 조인을 모두 수행하지는 않습니다.

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