2015-07-22 2 views
0

Основано на MSDN Я вижу, что числовые 10-19 используют один и тот же байт хранения.Цифровой тип данных данных SQL Server

Это означает, что преобразование столбца из числового (11,3) в числовое (18,3) не будет использовать больше места для хранения?

Итак, если это действительно так, каковы риски? (Предполагая, что мне нужно сделать это за 1 миллиард строк таблицы, которые могут получить числовые значения, которые не соответствуют 11,3).

+1

Один риск состоит в том, что вы отбрасываете некоторые вычисления в коде из-за различных причастных причастных действий. И проблема хранения может пульсировать до постоянных вычисляемых столбцов и индексов. – shawnt00

+0

Привет, большое спасибо за ваш ответ, добавленный вами пример показывает, что числовые 11,3 и числовые 18,3 используют один и тот же размер данных (фактически используя эту точность). так каковы минусы использования 18,3 против 11,3? почему бы не использовать по умолчанию максимальную точность для каждой группы хранения? единственный ответ, который я могу придумать, - это принудительное ограничение данных. –

+0

Ограничение данных - единственная причина, о которой я могу думать. –

ответ

1

Похоже, что SQL Server будет использовать нижний параметр памяти сначала (5 байт), прежде чем достигнуть максимума для этой точности (9 байтов). Но как (11,3), так и (18,3) максимальны при 9 байтах. См. Скрипт ниже.

Что касается вашего преобразования в 1 миллиард строк, поскольку это будет расширяющееся преобразование, я не думаю, что у вас возникнут проблемы. Вы должны проверить это как можно ближе к полному набору данных. Я не уверен, как долго это изменение на самом деле заберет.

USE tempdb 
GO 

CREATE TABLE MyTest (TestCol NUMERIC(11,3)) 

INSERT INTO dbo.MyTest (TestCol) VALUES(99999999.999) 
INSERT INTO dbo.MyTest (TestCol) VALUES(9.999) 

SELECT Testcol, DATALENGTH(Testcol) AS Size 
FROM dbo.MyTest 


CREATE TABLE MyTest2 (TestCol NUMERIC(18,3)) 

INSERT INTO dbo.MyTest2 (TestCol) VALUES(999999999999999.999) 
INSERT INTO dbo.MyTest2 (TestCol) VALUES(9.999) 

SELECT Testcol, DATALENGTH(Testcol) AS Size 
FROM dbo.MyTest2 

DROP TABLE dbo.MyTest 
DROP TABLE dbo.MyTest2 
Смежные вопросы