두 레코드 id 필드 (record1, record2)가있는보기를 각 레코드에 두 번 - 최상위 1000 개를 선택하여 두 번 봅니다.보기는 여러 오히려 큰 테이블, 그리고 그것의 ID 필드는 각각의 ID의 문자열 연결입니다 (이것은보기에 고유 한 ID가 필요한 일부 타사 소프트웨어에 필요했습니다. 행 넘버링은 매우 느립니다). 뷰에 날짜를 비교하는 함수를 호출하는 where 절도 있습니다.추정 된 서브 트리 비용 예상치 않게 꺼짐, 끔찍한 최적화
OPTION (FORCE ORDER)을 사용하지 않으면 예상 실행 계획에서 "조인 조건 없음"경고가 생성됩니다. 순서 지정을 강제하면 실행 계획에는 100 % 비용을 표시하는 여러 노드가 있습니다. 이 노드가
은 무슨 일 것입니다 (이 또는 중첩 루프 35927400000000 높은 CPU 비용과 조인 많이하고 있어요)의의 두 경우 모두, 엔드 포인트에서 예상 하위 트리 비용은보다 규모의 열세 주문 작 실행 계획의 번호는? 그리고 SQL Server가 쿼리를 최적화하는 데 어려움을 겪고있는 이유는 무엇입니까?
연결된 문자열의보기에 색인을 추가하고 NOEXPAND 테이블 힌트를 사용하면 문제가 완전히 해결되었습니다. 그것은 12 초 모두에 달했다. 하지만 왜 SQL은 그렇게 나빠졌 는가? (심지어 인덱스를 추가 한 후 noexpand 힌트를 요구할지라도)?
CU와 SQL 서버 2008 SP1을 실행 8.
보기 :
SELECT
dbo.fnGetCombinedTwoPartKey(N.NameID,A.AddressID) AS NameAddressKey,
[other fields]
FROM
[7 joined tables]
WHERE dbo.fnDatesAreOverlapping(N.dtmValidStartDate,N.dtmValidEndDate,A.dtmValidStartDate,A.dtmValidEndDate) = 1
쿼리
SELECT TOP 1000
vw1.strFullName,
vw1.strAddress1,
vw1.strCity,
vw2.strFullName,
vw2.strAddress1,
vw2.strCity
FROM tblMatches M
JOIN vwImportNameAddress vw1 ON vw1.NameAddressKey = M.Record1
JOIN vwImportNameAddress vw2 ON vw2.DetailAddressKey = M.Record2
쿼리와 뷰 정의를 게시 할 수 있습니까? –
보기 사용이 끔찍합니다. 지원되는 테이블에서 [UPDATE STATISTICS] (http://msdn.microsoft.com/en-us/library/ms187348.aspx)를 시도해보십시오. 그러나 실제로 데이터 모델을 변경해야한다고 생각합니다. 더 나은 ... –
보기는 조인 된 테이블에 고유 한 키가 필요한 타사 응용 프로그램에 필요합니다. 결과를 보관 테이블에 채우고 앱에 전달하는 것이 더 나을 것입니다.하지만 SQL이 왜 비참하게 실패하는지에 대해 더 관심이 있습니다. 함수, 여러 개의 큰 조인 등을 사용하고 있습니까? – Brian