2010-04-07 4 views
0

가끔 폼에서의 SELECT 쓰기 :선택에서 반복되는 열 값에 대해 동일한 계산을 피하는 방법은 무엇입니까?

SELECT 
    a.col1 + b.col2 * c.col4 as calc_col1, 
    a.col1 + b.col2 * c.col4 + xxx as calc_col1_PLUS_MORE 
FROM .... 
INNER JOIN ... 
    ON a.col1 + b.col2 * c.col4 < d.some_threshold 
WHERE a.col1 + b.col2*c.col4 > 0 

계산 오히려 참여와 같은 SELECT 내에서 3 ~ 5 시간까지 사용할 수, 난 정말 기능 또는 유사한에서 그 밖으로 리팩토링 싶습니다 에 순서 :

  1. 희망 캐시의 사용/성능을 향상시킬 수 있도록 내가 나중 단계에서 내가 계산을 변경해야 실현 4 계산 중 하나를 업데이트 잊어
  2. 마십시오.

나는 보통 SP 내에서 이러한 선택을합니다.

아이디어가 있으십니까?

답변

3

:하지만 당신은 확실히 가독성/유지 보수를 개선하기 위해 CTE를 사용할 수 있습니다

WITH CTE AS 
(
    SELECT 
     a.col1+b.col2*c.col4 as calc_col1 
    FROM .... 
), 
CTE2 AS (
    SELECT CTE.* 
     ,calc_col1 + xxx as calc_col1_PLUS_MORE 
    FROM CTE 
) 
SELECT ... 
FROM CTE2 c 
INNER JOIN ... d 
    ON c.calc_col1 < d.some_threshold 
WHERE c.calc_col1 > 0 
+0

완벽! CTE 사용을 더 많이 시작해야합니다. 지금까지는 재귀적인 나무 구조에 대해서만 사용했지만,이 방법으로도 많이 도움이됩니다. – Peter

4

쿼리 최적화 프로그램은 이미 성능 측면에서 반복되는 평가를 최적화해야합니다. 또한 레이어 복잡한 표현을 구축하기 위해 많은 열팽창 계수를 쌓을 수

WITH CTE AS 
(
    SELECT 
     a.col1+b.col2*c.col4 as calc_col1, 
     a.col1+b.col2*c.col4 + xxx as calc_col1_PLUS_MORE 
    FROM .... 
) 
SELECT ... 
FROM CTE c 
INNER JOIN ... d 
    ON c.calc_col1 < d.some_threshold 
WHERE c.calc_col1 > 0 
+0

아 - 멋지다! 고맙습니다. – Peter

2

을 당신은 계산 된 필드, 심지어 인덱스도를 유지할 수 있습니다 그들.

계산이 대부분 다른 테이블 사이에있는 경우 인덱싱 된보기를 사용해보십시오.

+0

인덱스 된 뷰에 대해 읽었습니다. 실제로 성능이 크게 향상 되었습니까? 그리고 언제 여분의 db-object를 쓸 가치가 없는지 – Peter

+0

@Peter : 예, 인덱스 된 뷰는 ** 문제가 될만한 ** 확실합니다 **! 보기를 조회하는 성능을 1000 배 이상 향상시킬 수 있습니다. 이는 농담이 아닙니다. –

+0

트레이드 오프는 일반 인덱스와 동일합니다. 삽입, 삭제 및 업데이트 (병합)에 영향을줍니다. 스키마 및 db 옵션과 관련된 몇 가지 다른 사전 요구 사항이 있습니다. mark_s가 말하는 것처럼, 문제의 확실히 가치가있다. –

관련 문제