[SQL] 많은 곳에서 GETDATE ()를 사용하는 경우, 더 나은 변수를 사용하는 것입니다?
SQL많은 곳에서 GETDATE ()를 사용하는 경우, 더 나은 변수를 사용하는 것입니다?
더 나은, 나는 평균이 아닌 일부 한계 금액으로 성능을 향상합니까?
즉, 말을 나는 GETDATE ()가, 작품의 어떤 양이 서버가 해당 값을 반환 할 않습니다 호출 할 때마다 무엇입니까?
내가 저장 프로 시저에 많은 장소에서 GETDATE ()를 사용하고 있다면, 대신 거래일를 저장하는 변수를 작성해야 하는가?
declare @transDate datetime = GETDATE()
벤치마킹 데이터는 환상적 일 것입니다.
편집 나는 명확히하려는 : 나는이 두 가지 가능성 사이의 실제 성능 차이에 주로 관심, 그리고 여부가 중요하다.
해결법
-
==============================
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.나의 제안은 당신이 장기 실행 프로세스가있는 경우 주로하기 때문에 변수를 사용하는 것입니다의에 GetDate () 값이 호출간에 다를 수 있습니다.
나의 제안은 당신이 장기 실행 프로세스가있는 경우 주로하기 때문에 변수를 사용하는 것입니다의에 GetDate () 값이 호출간에 다를 수 있습니다.
만에 GetDate의 날짜 부분을 사용하지 않는 () 당신은 당신이 항상 같은 값을 사용하는 것입니다.
-
==============================
3.당신이 행을 삽입하는 경우, 또는 당신이 GROUP BY를 수행하는 경우 GETDATE () 또는 SUSER_SNAME 같은 함수 ()의 변수를 사용하는 한 가지 이유는 큰 성능 차이입니다. 당신이 행의 많은 양을 삽입 할 경우이 작업을 알 수 있습니다.
당신이 행을 삽입하는 경우, 또는 당신이 GROUP BY를 수행하는 경우 GETDATE () 또는 SUSER_SNAME 같은 함수 ()의 변수를 사용하는 한 가지 이유는 큰 성능 차이입니다. 당신이 행의 많은 양을 삽입 할 경우이 작업을 알 수 있습니다.
나는 여러 테이블에 자신의 데이터를 300기가바이트 마이그레이션이를 겪었다.
-
==============================
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.내가 사용
내가 사용
WHERE ActualDateShipped+30 > dbo.Today()
아래의 기능과 결합된다. 이초 13 초에서 내 쿼리 시간을 가져왔다. 이 게시물에 대한 사전 답변 SQL 2008 / R2에서이 문제를 도움이되지 않습니다.
CREATE FUNCTION [dbo].[Today]() RETURNS date AS BEGIN DECLARE @today date = getdate() RETURN @today End
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
'SQL' 카테고리의 다른 글
[SQL] MySQL은 "LIMIT 1"을 사용하여 어느 시점이 있습니까 색인 / 고유의 필드에 쿼리 할 때? (0) | 2020.06.07 |
---|---|
[SQL] 1 년 동안 매달 기록을 카운트 (0) | 2020.06.07 |
[SQL] 더 - 탑 1 대 MAX? (0) | 2020.06.07 |
[SQL] 오라클 SQL은 어떻게 날짜에서 시간을 제거하는 (0) | 2020.06.07 |
[SQL] 어떻게 MySQL의 LIKE 절에서 사용자 변수를 사용하는 방법? (0) | 2020.06.07 |