Укажите десятичную точность столбца в индексированном представлении SQL Server

Мне интересно, можно ли переопределить точность столбцов по умолчанию для столбцов в индексированном представлении. Представление всегда создает столбцы с максимально возможной точностью.

Полный пример запуска ниже:

-- drop and recreate example table and view if they exist
IF EXISTS(SELECT * FROM sys.objects WHERE name = 'ExampleIndexedView')
    DROP VIEW [dbo].[ExampleIndexedView]

IF EXISTS(SELECT * FROM sys.objects WHERE name = 'Example')
    DROP TABLE [dbo].[Example]

-- create example table
CREATE TABLE [dbo].[Example](
    [UserID] [int],
    [Amount] [decimal](9, 2)
) ON [PRIMARY]

-- insert sample rows
INSERT INTO [dbo].[Example] ([UserID], [Amount]) VALUES (1, 10)
INSERT INTO [dbo].[Example] ([UserID], [Amount]) VALUES (2, 20)
INSERT INTO [dbo].[Example] ([UserID], [Amount]) VALUES (3, 30)
INSERT INTO [dbo].[Example] ([UserID], [Amount]) VALUES (1, 15)
INSERT INTO [dbo].[Example] ([UserID], [Amount]) VALUES (1, 2.5)
GO

-- create indexed view
CREATE VIEW [dbo].[ExampleIndexedView]
WITH SCHEMABINDING
AS

SELECT
    e.UserID as UserID
    ,SUM(ISNULL(e.[Amount], 0)) as [Amount]
    ,COUNT_BIG(*) as [Count]        --Required for indexed views
FROM [dbo].[Example] e
GROUP BY 
    e.UserID
GO

CREATE UNIQUE CLUSTERED INDEX [CI_ExampleIndexedView]
    ON [dbo].[ExampleIndexedView]
        ([UserID])

-- show stats for view
exec sp_help [ExampleIndexedView]

Это приводит к представлению со столбцами:

UserID(int, null)  
Amount(decimal(38,2), null)  

Я понимаю, почему представление будет автоматически использовать максимально возможный тип хранилища для SUM столбец, однако скажем, я знаю, что суммирование этого Amount столбец никогда не превысит пределы decimal(19, 2) - Есть ли способ заставить вид создать столбец как decimal(19, 2) вместо decimal(38, 2)?

decimal(38, 2) занимает 17 байт для хранения, decimal(19,2) занимает всего 9 байтов. В качестве теста я дублировал свое индексированное представление в обычную таблицу, где я использовал decimal(19,2) и общая экономия места на диске составила около 40%, поэтому кажется, что было бы целесообразно сделать это для представления, содержащего большое количество десятичных агрегатов.

Редактировать: опубликовал полный пример запуска, который создает таблицу примеров, заполняет ее несколькими строками, а затем создает индексированное представление для этой таблицы. В результате столбец Amount в индексированном представлении является десятичным (38,2), и я хотел бы найти способ перевести его в десятичное число (19,2) по причинам экономии места.

1 ответ

CAST() или CONVERT() с необходимой точностью

Select 
    UserID, 
    CONVERT(DECIMAL(9,2), SUM(Amount)) as Amount, 
FROM 
    Example
GROUP BY 
    UserID
Другие вопросы по тегам