พวกมันเทียบเท่ากันจริง แต่เป็นประเภทอิสระและไม่ใช่คำพ้องความหมายทางเทคนิคเช่นROWVERSION
และTIMESTAMP
- แม้ว่าพวกเขาอาจถูกเรียกว่าคำพ้องความหมายในเอกสารประกอบในครั้งเดียว นั่นคือความหมายที่แตกต่างกันเล็กน้อยของคำพ้องความหมาย (เช่นพวกเขาจะแยกไม่ออกยกเว้นในชื่อไม่มีใครเป็นนามแฝงสำหรับคนอื่น ๆ ) แดกดันใช่มั้ย
สิ่งที่ฉันตีความจากถ้อยคำใน 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 Sentry Plan Explorer * แผนไม่น่าสนใจจริงๆ:

แต่แท็บนิพจน์แน่ใจว่าเป็น:

ตามที่ฉันแสดงความคิดเห็นไว้ด้านบนเรามีการแปลงที่ชัดเจนซึ่งเราขอให้พวกเขา แต่ไม่มีการแปลงที่ชัดเจนที่เราอาจคาดหวังไว้ ดูเหมือนว่าเครื่องมือเพิ่มประสิทธิภาพจะถือว่าพวกเขาเป็นที่ใช้แทนกันได้เช่นกัน
ไปข้างหน้าและลองทดสอบนี้ด้วย (ข้อมูลและดัชนี)
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.