복붙노트

[SQL] 많은 곳에서 GETDATE ()를 사용하는 경우, 더 나은 변수를 사용하는 것입니다?

SQL

많은 곳에서 GETDATE ()를 사용하는 경우, 더 나은 변수를 사용하는 것입니다?

더 나은, 나는 평균이 아닌 일부 한계 금액으로 성능을 향상합니까?

즉, 말을 나는 GETDATE ()가, 작품의 어떤 양이 서버가 해당 값을 반환 할 않습니다 호출 할 때마다 무엇입니까?

내가 저장 프로 시저에 많은 장소에서 GETDATE ()를 사용하고 있다면, 대신 거래일를 저장하는 변수를 작성해야 하는가?

declare @transDate datetime = GETDATE()

벤치마킹 데이터는 환상적 일 것입니다.

편집 나는 명확히하려는 : 나는이 두 가지 가능성 사이의 실제 성능 차이에 주로 관심, 그리고 여부가 중요하다.

해결법

  1. ==============================

    1.[참고 :이 답변을 downvote하려는 경우, 이유를 설명하는 의견을 남겨주세요. 이미 여러 번을 downvoted되고, 마지막으로 (감사합니다) ypercube 이유를 적어도 하나의 이유를 설명했다. 그것이 가능하기 때문에 당신은뿐만 아니라 그것을 개선하는 데 도움이 될 수 있습니다, 그래서 나는 대답을 제거 할 수 없습니다.]

    [참고 :이 답변을 downvote하려는 경우, 이유를 설명하는 의견을 남겨주세요. 이미 여러 번을 downvoted되고, 마지막으로 (감사합니다) ypercube 이유를 적어도 하나의 이유를 설명했다. 그것이 가능하기 때문에 당신은뿐만 아니라 그것을 개선하는 데 도움이 될 수 있습니다, 그래서 나는 대답을 제거 할 수 없습니다.]

    마이크로 소프트, GETDATE에이 교환에 따르면 () 돌이켜에서 SQL 서버 2005에서 비 결정적으로 쿼리 내에있는 상수로 전환, 그 정확한 생각하지 않습니다. 나는 완전히 이전 SQL Server 2005로 비 결정적 다음 SQL Server 2005 "비 결정적 런타임 상수"라고 무언가를 해킹했다 생각한다. "후자의 구절은 정말 의미하는 것 같다"쿼리 내에서 상수를 ".

    (그리고 GETDATE ()가없는 한정자, 모호하고스럽게 비 결정적으로 정의된다.)

    아아, SQL 서버에서, 비 결정적 함수는 모든 행에 대해 평가되는 것을 의미하지 않는다. SQL 서버는 정말이 불필요하게 복잡하고 주제에 아주 작은 문서와 모호한을하지 않습니다.

    실제로 함수 호출은 쿼리를 컴파일하고 그 값이 호출 할 때마다 변경되는 경우 한 번 쿼리가 실행이 아닌 경우 평가된다. 실행 시간이 아닌 컴파일 시간에 - 실제로, GETDATE ()는 만이 사용되는 각 표현식에 대해 한 번 평가됩니다. 그러나 마이크로 소프트는 비 결정적 런타임 상수 함수라는 특수 범주에 랜드 () 및 GETDATE ()를 넣습니다. 반면, 포스트 그레스는 농구를 통해, 그냥 "안정적"으로 실행될 때 상수 값이 함수를 호출 점프하지 않습니다.

    () 모두 "결정적"와 "비 결정적 런타임 상수"라고 설명 GETDATE하지만,이 용어는 정말 설명되지 않는다 - 마틴 스미스의 발언에도 불구하고, SQL Server 설명서는 간단하게이 문제에 명시 적으로하지 않습니다. 나는이 용어를 발견 한 장소는 예를 들어, 문서의 바로 다음 줄은 하위 쿼리에 결정적 기능을 사용하지 말한다. 즉 "비 결정적 런타임 상수"에 대한 어리석은 조언 할 것이다.

    난 당신이 일관된 값을 가질 수 있도록, 심지어 쿼리 내에서 상수와 변수를 사용하는 것이 좋습니다 것입니다. 이것은 또한 의도는 매우 분명합니다 : 당신은 쿼리 내부에 단일 값을합니다. 단일 쿼리 내에서, 당신이 뭔가를 같이 할 수 있습니다 :

    select . . . 
    from (select getdate() as now) params cross join
         . . . 
    

    사실,이 쿼리에서 한 번만 평가해야하지만, 예외가있을 수 있습니다 제안합니다. GETDATE ()가 모든 다른 행에 같은 값을 반환하기 때문에 혼란이 발생 -하지만 다른 열에 다른 값을 반환 할 수 있습니다. GETDATE 각각 식 ()는 독립적으로 평가한다. 당신이 실행하는 경우이 분명하다 :

    select rand(), rand()
    from (values (1), (2), (3)) v(x);
    

    저장 프로 시저 내에서 변수에 단일 값을 갖고 싶어한다. 저장 프로 시저가 실행되는 경우 자정 날짜 변경에 의해 전달하고 어떻게됩니까? 어떤 영향을하면 그 결과에 있습니까?

    성능에 관해서는, 내 생각은 날짜 / 시간 조회가 최소 점이다 쿼리 실행을 시작으로 쿼리에 대한 표현에 한 번 발생합니다. 이것은하지만 더 코드 일관성 문제, 정말 성능 문제가 안된다.

  2. ==============================

    2.나의 제안은 당신이 장기 실행 프로세스가있는 경우 주로하기 때문에 변수를 사용하는 것입니다의에 GetDate () 값이 호출간에 다를 수 있습니다.

    나의 제안은 당신이 장기 실행 프로세스가있는 경우 주로하기 때문에 변수를 사용하는 것입니다의에 GetDate () 값이 호출간에 다를 수 있습니다.

    만에 GetDate의 날짜 부분을 사용하지 않는 () 당신은 당신이 항상 같은 값을 사용하는 것입니다.

  3. ==============================

    3.당신이 행을 삽입하는 경우, 또는 당신이 GROUP BY를 수행하는 경우 GETDATE () 또는 SUSER_SNAME 같은 함수 ()의 변수를 사용하는 한 가지 이유는 큰 성능 차이입니다. 당신이 행의 많은 양을 삽입 할 경우이 작업을 알 수 있습니다.

    당신이 행을 삽입하는 경우, 또는 당신이 GROUP BY를 수행하는 경우 GETDATE () 또는 SUSER_SNAME 같은 함수 ()의 변수를 사용하는 한 가지 이유는 큰 성능 차이입니다. 당신이 행의 많은 양을 삽입 할 경우이 작업을 알 수 있습니다.

    나는 여러 테이블에 자신의 데이터를 300기가바이트 마이그레이션이를 겪었다.

  4. ==============================

    4.나는 SP 내에서 변수로 GETDATE () 함수를 사용하여 저장 프로 시저의 몇 테스트하고 있었고, 난 인해 쿼리 최적화 프로그램이 저장된 읽기 작동 할 수있는 값 무슨 모른다는 사실 IO에 증가 읽고 실행 시간을 가졌다 @Gordon Linoff은 그 값이 / 피하려면 실행 중 또는 순서 변경 사고가 제거되지 않습니다 언급 한대로 SP의 모든 단일 부분에서 GETDATE () 함수를 사용할 수 있다고 말했다와 매개 변수, 변수, 리터럴과 절차 실행, 값 내가 매개 변수이 방법을 창조 하셨 는가 변경 될 수 있습니다 :

    나는 SP 내에서 변수로 GETDATE () 함수를 사용하여 저장 프로 시저의 몇 테스트하고 있었고, 난 인해 쿼리 최적화 프로그램이 저장된 읽기 작동 할 수있는 값 무슨 모른다는 사실 IO에 증가 읽고 실행 시간을 가졌다 @Gordon Linoff은 그 값이 / 피하려면 실행 중 또는 순서 변경 사고가 제거되지 않습니다 언급 한대로 SP의 모든 단일 부분에서 GETDATE () 함수를 사용할 수 있다고 말했다와 매개 변수, 변수, 리터럴과 절차 실행, 값 내가 매개 변수이 방법을 창조 하셨 는가 변경 될 수 있습니다 :

    CREATE PROC TestGetdate
    (
    @CurrentDate DATETIME = NULL
    )
    AS
    SET CurrentDate  = GETDATE()
    

    ..... 당신이 적합을 참조로 다음 매개 변수를 사용하여, 당신은 좋은 결과를 볼 수 있습니다

    의견이나 제안을 환영합니다.

  5. ==============================

    5.내가 사용

    내가 사용

    WHERE ActualDateShipped+30 > dbo.Today()
    

    아래의 기능과 결합된다. 이초 13 초에서 내 쿼리 시간을 가져왔다. 이 게시물에 대한 사전 답변 SQL 2008 / R2에서이 문제를 도움이되지 않습니다.

    CREATE FUNCTION [dbo].[Today]()
    
        RETURNS date
        AS
        BEGIN
    
            DECLARE @today date = getdate()
    
            RETURN @today
        End
    
  6. from https://stackoverflow.com/questions/12078202/when-using-getdate-in-many-places-is-it-better-to-use-a-variable by cc-by-sa and MIT license