2013-01-31 2 views
2

매초마다 많은 양의 데이터를 반환하고 그리드에 표시되는 SP가 있습니다. 현재 대역폭을 줄이고 현재 그리드에 표시된 열만 반환하려고 생각하고 있습니다.CASE를 사용할 때 SQL 성능 문제가 발생했습니다.

SELECT 
[Animals].[AnimalID] AS [AnimalID], 
[Animals].[name] AS [AnimalName], 
[Foods].[DisplayName] AS [Food], 
[Animals].[Age] AS [AnimalAge], 
[Animals].[AmountOfFood] AS [AmountOfFood] 

내가 현재 노력하고있어 필드 (@fields)의 이름의 TVP를 전달하는 현재 :

물론 단순화 최소화하지만 내가 가진 기본적으로 무엇을 다음 SP이었다이다 그리드에 표시하고 같은에만 필요 필드를 반환 :

SELECT 
[Animals].[AnimalID] AS [AnimalID], 
[Animals].[name] AS [AnimalName], 
CASE 
    WHEN ('Food' in (select * from @fields)) 
    THEN [Foods].[DisplayName] 
END AS [Food], 
CASE 
    WHEN ('AnimalAge' in (select * from @fields)) 
    THEN [Animals].[Age] 
END AS [AnimalAge], 
CASE 
    WHEN ('AmountOfFood' in (select * from @fields)) 
    THEN [Animals].[AmountOfFood] 
END AS [AmountOfFood] 

내가 직면하고있어 문제는 내 SP가 ~ 1 초를 복용 ~ 200 밀리 복용했다 (예상 할 수 있기 때문에)이다

어쩌면 우리를 죽이지 않을 정도로 이것을 다시 쓸 수있는 방법이 있습니까?

내 왕국에 대한 foreach!

+0

대역폭 문제는 실제로 문제입니까? – Axarydax

+0

세 가지 case 문을 사용하면 열을 반환하지 않고 저장하는 것보다 더 많은 실행 시간이 소요된다고 생각합니다. 단순히 모든 열을 반환하고 응용 프로그램보기에서 논리를 사용하여 열을 표시할지 결정하십시오. – paul

+0

예제가 단순화되었다고 언급했듯이, 우리는 100 개의 필드에 가깝고 각각 수십 명의 사용자가 각각의 시간에 5-10 개 이상의 필드를보고 있지 않을 것입니다. 다른 방법이 없다면 모든 필드를 반환하거나 브로커를 사용하여 최상의 솔루션을 찾으십시오 :) –

답변

1

SQL Server에서는 동적 SQL을 사용하여이 작업을 수행 할 수도 있습니다. 다음과 같이합니다 :

declare @sql nvarchar(max); 

select @sql = (select ', '+ 
         (case when FieldName = 'Food' then 'Foods.DisplayName' 
          when FieldName = 'AnimalAge' then 'Animals.Age' 
         . . . 
         end) 
       from @fields 
       for xml path ('') 
      ); 

select @sql = 'select [Animals].[AnimalID] AS [AnimalID], [Animals].[name] AS [AnimalName]'[email protected]+RESTOFQUERY; 

exec(@sql); 
1

저장 프로 시저를 테이블 반환 함수로 변환하고 그리드에서 필요한 열만 선택하려고합니다. 단지 예를 select * AnimalID, Age from myfunction(..) 위해 선택한 클라이언트 만이 열을 클라이언트로 전송 될 경우

그래서 함수는 여전히

SELECT 
[Animals].[AnimalID] AS [AnimalID], 
[Animals].[name] AS [AnimalName], 
[Foods].[DisplayName] AS [Food], 
[Animals].[Age] AS [AnimalAge], 
[Animals].[AmountOfFood] AS [AmountOfFood] 

을 선택합니다.

+0

이것은 아름답게 작동하지만 성능이있는 필드의 수에 영향을받습니다. / –

관련 문제