NUMERIC과 DECIMAL간에 차이가 있습니까?


47

SQL Server의 NUMERIC 및 DECIMAL 데이터 유형이 동일하게 작동한다는 것을 알고 있습니다.이를 생성하는 구문은 동일하며 저장할 수있는 값의 범위는 동일합니다.

그러나 MSDN 설명서에는 다음과 같은 두 가지 관계가 설명되어 있습니다.

숫자는 기능적으로 10 진수와 같습니다.

일반적으로 한정자 " 기능적으로 동등한"을 볼 때 두 가지가 정확히 동일하지는 않지만 외부와 구별 할 수없는 두 가지 유형이라는 것을 의미 합니다 .

이것이 의미 하는가? 외부 관찰자와 동일하게 작동하는 NUMERIC과 DECIMAL의 차이점이 있습니까? 아니면은 실제로 예를 들면, 해당 DECIMAL 단지 기존 동의어 숫자입니까?


1
SQL Server 외부 의 지원에 차이가있을 수 있습니다. 예를 들어 SSIS의이 이상한 차이를 알게 되었습니다 .
Aaron Bertrand

답변:


56

그들은 실제로 동일하지만, 그들은 독립적 인 유형 및없는 기술적으로 동의어, 같은 ROWVERSIONTIMESTAMP- 비록 그들이 한 번에 문서에서 동의어로 언급되었을 수 있습니다 . 이는 동의어의 약간 다른 의미입니다 (예 : 이름을 제외하고는 구별 할 수 없으며, 하나는 다른 별명이 아닙니다). 아이러니하지?

MSDN의 문구에서 내가 해석하는 것은 실제로 다음과 같습니다.

이 유형은 동일하며 이름이 다릅니다.

type_id값 이외의 모든 내용은 동일합니다.

SELECT * FROM sys.types WHERE name IN (N'numeric', N'decimal');

나는 둘 사이의 동작 차이에 대해 전혀 알지 못하고 SQL Server 6.5로 돌아가서 항상 100 % 상호 교환 가능한 것으로 취급했습니다.

DECIMAL (18,2) 및 NUMERIC (18,2)의 경우 하나를 다른 것으로 할당하는 것은 기술적으로 "전환"입니까?

명시 적으로 그렇게하는 경우에만 가능합니다. 테이블을 만든 다음 명시 적 또는 암시 적 변환을 수행하는 쿼리에 대한 쿼리 계획을 검사하여이를 쉽게 증명할 수 있습니다. 다음은 간단한 테이블입니다.

CREATE TABLE [dbo].[NumDec]
(
    [num] [numeric](18, 0) NULL,
    [dec] [decimal](18, 0) NULL
);

이제 다음 쿼리를 실행하고 계획을 캡처하십시오.

DECLARE @num NUMERIC(18,0);
DECLARE @dec DECIMAL(18,0);

SELECT 
  CONVERT(DECIMAL(18,0), [num]), -- conversion
  CONVERT(NUMERIC(18,0), [dec])  -- conversion
FROM dbo.NumDec
UNION ALL SELECT [num],[dec] 
  FROM dbo.NumDec WHERE [num] = @dec  -- no conversion
UNION ALL SELECT [num],[dec] 
  FROM dbo.NumDec WHERE [dec] = @num; -- no conversion

에 나타낸 바와 같이 SQL 센트리 계획 탐색기 *, 계획은 정말 흥미로운되지 않습니다 :

여기에 이미지 설명을 입력하십시오

그러나 표현식 탭은 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

위에서 언급했듯이 요청한 부분에 명시적인 전환이 있지만 예상했던 부분에 대한 명시적인 전환은 없습니다. 옵티마이 저도 그것들을 상호 교환 가능한 것으로 취급합니다.

계속해서이 테스트 (데이터 및 인덱스)를 시도하십시오.

CREATE TABLE [dbo].[NumDec2]
(
    [num] [numeric](18, 2) NULL,
    [dec] [decimal](18, 2) NULL
);

INSERT dbo.NumDec2([num],[dec])
SELECT [object_id] + 0.12, [object_id] + 0.12
  FROM sys.all_columns;

CREATE INDEX [ix_num] ON dbo.NumDec2([num]);
CREATE INDEX [ix_dec] ON dbo.NumDec2([dec]);

이제이 쿼리를 실행하십시오.

DECLARE @num NUMERIC(18,2) = -1291334356.88,
        @dec NUMERIC(18,2) = -1291334356.88;

SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = @num
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = @dec;

계획에 변환이 없습니다 (사실 식 탭이 비어 있음).

여기에 이미지 설명을 입력하십시오

이것조차도 예기치 않은 전환으로 이어지지는 않습니다. 물론, 술어의 RHS에서이를 볼 수 있지만, 탐색을 용이하게하기 위해 열 데이터에 대해 변환을 수행 할 필요는 없습니다 (스캔이 훨씬 적음).

SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(DECIMAL(18,2), @num)
UNION ALL
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(DECIMAL(18,2), @dec)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(NUMERIC(18,2), @num)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(NUMERIC(18,2), @dec)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(DECIMAL(18,2), @num)
UNION ALL
SELECT [num] FROM dbo.NumDec2 WHERE [num] = CONVERT(DECIMAL(18,2), @dec)
UNION ALL
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(NUMERIC(18,2), @num)
UNION ALL
SELECT [dec] FROM dbo.NumDec2 WHERE [dec] = CONVERT(NUMERIC(18,2), @dec);

개인적으로 저는이 용어 DECIMAL가 훨씬 정확하고 설명 적이 라는 용어를 사용하는 것을 선호합니다 . BIT"숫자"입니다.

* Disclaimer: I work for SQL Sentry.

SQL이 예를 들어 DECIMAL (18,2) 및 DECIMAL (18,0)을 "다른 유형"으로 취급한다는 것을 알고 있습니다. DECIMAL (18,2) 및 NUMERIC (18,2)에 대해서도 동일한 의미입니까? 하나를 다른 것으로 할당하는 것은 기술적으로 "전환"입니까?
KutuluMike

@MichaelEdenfield 새 질문에 대한 답변을 업데이트했습니다.
Aaron Bertrand

1
나는 이것이 오래된 대답이라는 것을 알고 있지만 숫자와 소수가 동의어라고 생각하면 SQL Server에서 오류가 발생 하는 경우를 발견했습니다 . 다른 사람이 혜택을 볼 수 있도록 여기에 의견을 남겨야한다고 생각했습니다.
Zohar Peled 10

@AaronBertrand 도움이 되었기 때문에 귀하의 답변에 투표했습니다. 두 유형이 동일하게 보이는 경우가 있는데 왜 다른 이름으로 명명됩니까? 어떤이 역사적 이유는 ?
Ivanzinho

@Ivanzinho 나는 당신의 질문이 수사적인지 확실하지 않지만, (이 페이지와 당신이 연결 한 답변 둘 다) 많은 이론이 있지만, 당신이 결정적인 대답을 원한다면 아마도 운이 나쁠 것입니다. SQL Server에서 두 가지 유형을 모두 처음 구현 한 원래 엔지니어를 추적하고 해당 구현에 대한 메모리와 당시 표준에 대한 해석에 의존해야합니다.
Aaron Bertrand

15

그러나 실제로는 SQL 2003 표준과 동일합니다.

21) NUMERIC가 소수에 의해 지정된 정밀도 및 스케일 데이터 유형 정확한 숫자를 지정 precision하고 scale.

22) DECIMAL은 데이터 유형의 정확한 숫자를 지정하며, 10 진수 스케일로 지정된 구현scale 및 10 진수 정밀도는 지정된 값보다 크거나 같습니다 .precision


5
그렇다면 근본적인 질문 (그리고 대답이 아니오라고 생각합니다), SQL Server는 DECIMAL의 정밀도를 NUMERIC과 다르게 구현 했습니까? 표준이 수있는 것은 실제로 한 것보다 훨씬 덜 관련이 있습니다.
Aaron Bertrand

5
감사. 이것은 이름이 다르지만 동작이 동일한 두 가지 유형이있는 이유에 대한 후속 질문에 대한 훌륭한 답변입니다.
Gabe
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.