我想知道是否可以覆盖索引视图中列的默认列精度。视图似乎始终创建具有最大可能精度的列。
完整的可运行示例如下:
-- 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)以节省空间。
答案 0 :(得分:0)
CAST()或CONVERT()它达到您所需的精度
Select
UserID,
CONVERT(DECIMAL(9,2), SUM(Amount)) as Amount,
FROM
Example
GROUP BY
UserID