SQL Server가 너무 많은 테이블을 참조하여 실행할 수 없는 쿼리를 만난 적이 있습니까?

StackOverflow https://stackoverflow.com/questions/2432

문제

오류 메시지를 본 적이 있나요?

-- SQL 서버 2000

보기 또는 함수 확인을 위해 보조 테이블을 할당할 수 없습니다.
쿼리의 최대 테이블 수(256)를 초과했습니다.

-- SQL 서버 2005

쿼리에 테이블 이름이 너무 많습니다.허용되는 최대값은 256입니다.

그렇다면 무엇을 했습니까?

포기했다?고객이 요구 사항을 단순화하도록 설득했습니까?데이터베이스를 비정규화했나요?


@(내가 쿼리를 게시하기를 원하는 모든 사람):

  1. 답변 편집 창에 70KB의 코드를 붙여넣을 수 있을지 모르겠습니다.
  2. 이것이 가능하더라도 이 70킬로바이트의 코드는 게시해야 하는 20~30개의 뷰를 참조하므로 도움이 되지 않습니다. 그렇지 않으면 코드가 의미가 없게 되기 때문입니다.

여기서 자랑하는 것처럼 말하고 싶지 않지만 문제는 쿼리에 있는 것이 아닙니다.쿼리는 최적입니다(또는 적어도 거의 최적입니다).나는 제거할 수 있는 모든 단일 열과 모든 단일 테이블을 찾아 최적화하는 데 수많은 시간을 보냈습니다.단일 SELECT 문으로 채워야 하는 200개 또는 300개의 열이 있는 보고서를 상상해 보십시오(몇 년 전 아직 작은 보고서였을 때 그렇게 설계되었기 때문입니다).

도움이 되었습니까?

해결책

SQL Server 2005의 경우 테이블 변수를 사용하고 진행하면서 데이터를 부분적으로 구축하는 것이 좋습니다.

이렇게 하려면 사용자에게 보내려는 최종 결과 집합을 나타내는 테이블 변수를 만듭니다.

그런 다음 기본 테이블(위 예의 주문 테이블)을 찾아 해당 데이터와 한 번만 조인하는 약간의 추가 데이터(고객 이름, 제품 이름)를 가져옵니다.SELECT INTO를 수행하여 이를 테이블 변수에 바로 넣을 수 있습니다.

거기에서 테이블을 반복하고 각 행에 대해 결과 집합에 필요한 모든 추가 데이터를 검색하는 여러 개의 작은 SELECT 쿼리를 수행합니다.이동하면서 각 열에 이를 삽입하십시오.

완료되면 테이블 변수에서 간단한 SELECT *를 수행하고 이 결과 집합을 사용자에게 반환할 수 있습니다.

이에 대한 정확한 숫자는 없지만 지금까지 작업한 세 가지 개별 사례에서는 이러한 작은 쿼리를 수행하는 것이 여러 조인을 사용하여 하나의 대규모 선택 쿼리를 수행하는 것보다 실제로 더 빠르게 작동했습니다.

다른 팁

저는 이런 상황을 본 적이 없으며, 솔직히 말해서 쿼리에서 > 256개의 테이블을 참조한다는 생각이 저를 극도로 두렵게 만듭니다.

첫 번째 질문은 아마도 "왜 그렇게 많은가요?"가 되어야 하고, 그 다음에는 "나는 어떤 정보를 알고 있습니까?"가 뒤따를 것입니다. 아니다 필요합니까?" 이러한 쿼리에서 반환되는 데이터의 양이 애플리케이션 성능에 상당히 심각한 영향을 미치기 시작할까봐 걱정됩니다.

@chopeen 이러한 통계를 계산하는 방식을 변경하고 대신 모든 제품별 통계에 대한 별도의 테이블을 유지할 수 있습니다.주문이 접수되면 제품을 반복하여 통계 테이블에서 해당 기록을 업데이트합니다.이렇게 하면 보고서를 실행할 때 하나의 거대한 쿼리에서 모든 것을 실행하는 대신 계산 로드의 상당 부분을 결제 페이지로 이동하게 됩니다.물론 이런 식으로 잘 작동하지 않는 일부 통계가 있습니다.특정 제품을 구매한 후 고객의 다음 구매를 추적합니다.

이는 SQL Server 2000에서 실행되는 Dynamics CRM 설치에 대한 Reporting Services 보고서를 작성할 때 항상 발생합니다.CRM에는 많은 조인이 발생하는 훌륭하게 정규화된 데이터 스키마가 있습니다.실제로 제한을 256에서 무려 260으로 늘리는 핫픽스가 있습니다. http://support.microsoft.com/kb/818406 (우리는 항상 이것이 SQL Server 팀 입장에서는 대단한 농담이라고 생각했습니다.)

Dillie-O가 암시하는 것처럼 해결책은 적절한 "하위 조인"(가급적이면 여러 번 사용되는 조인)을 식별하고 이를 임시 테이블 변수로 분류한 다음 기본 조인에서 사용하는 것입니다.이는 주요 PIA이며 종종 성능을 저하시킵니다.안타깝습니다.

@Kevin, 그 티셔츠가 정말 마음에 드네요 -- 다 말해줍니다 :-).

해당 쿼리를 보고 싶지만 일종의 반복자에 문제가 있는 것 같습니다. 가능한 상황은 생각나지 않지만 잘못된 while/case/cursor 또는 엄청난 양의 쿼리 때문일 것입니다. 뷰가 제대로 구현되지 않았습니다.

문의글을 남겨주세요 :D

또한 가능한 문제 중 하나는 단일 조회 테이블로 압축할 수 있는 수많은 이름/값 테이블이 있을 수 있다는 것입니다.

나는 같은 문제가 있었다 ...내 개발 상자에서는 SQL Server 2008(보기가 제대로 작동함)을 실행하지만 프로덕션(SQL Server 2005 사용)에서는 보기가 작동하지 않습니다.결국 오류가 발생한 뷰에서 쿼리의 일부로 새 뷰를 사용하여 이러한 제한을 피하기 위해 뷰를 만들었습니다.

논리적 실행이 동일하다는 점을 고려하면 어리석은 일입니다 ...

뷰를 생성하려고 할 때 SQL Server 2005(2008년에 작동)에서도 동일한 문제가 발생했습니다.뷰 대신 저장 프로시저를 만들어 문제를 해결했습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top