这是在一个数据仓库事实表
它有一个综合指数如下
ALTER TABLE [dbo].[Fact_Data]
ADD CONSTRAINT [PK_Fact_Data]
PRIMARY KEY CLUSTERED
(
[Column1_VarChar_10] ASC,
[Column2_VarChar_10] ASC,
[Column3_Int] ASC,
[Column4_Int] ASC,
[Column5_VarChar_10] ASC,
[Column6_VarChar_10] ASC,
[Column7_DateTime] ASC,
[Column8_DateTime] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF,
SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON
) ON [PRIMARY]
GO
在这种结构中,所有的varchar 10列的只有数值。 难道会是有益的,我要改变这种78000000排结构来保存BIGINT代替VARCHAR在查询和索引方面?
任何其他的好处/缺点,我应该考虑什么?
你一定要引进一个替代INT IDENTITY()
主键! INT已经为您提供了可能高达2个十亿行 - 这还不够?
SQL Server上的这个主键/聚集键的大小将达到64个字节(而不是4,对于INT) - 这将使你的聚集索引和所有非聚集索引面目全非臃肿。 整个聚集键(所有的8列)将被列入该表上的每一个非聚集索引的每一个页面上 - 浪费了很多很多的空间是肯定的。
因此,在任何给定的索引表,你将有多达16倍以上的条目与替代INT集群的关键 - 这意味着大量减少I / O,大量少浪费时间阅读索引页。
而试想一下,试图建立到表的外键关系....任何子表必须有你的主键外键列的所有8列 ,并在每一个加入指定所有8列-什么是噩梦! !
在78万行,即使只是改变了聚集键为INT IDENTITY会为您节省高达每行60个字节 - 单独将出来,以达到(在你的服务器和RAM的使用),4 GB的磁盘空间。 而这还没有开始计算在非群集索引储蓄.......
当然,是的,我也改变VARCHAR(10)INT或BIGINT - 如果它是一个数字,使字段类型数字 - 没有点在VARCHAR(10)离开它,真的。 但是,仅仅是不会让在速度和性能方面的巨大差异 - 它只是使具有容易得多(也有不总是投各地数字类型时,如比较值等)的数据工作。
渣
有两件事情可以影响指数(和总体DB)性能:
1)索引页2)比较速度的大小
所以,对于第一个,一般你的索引/数据页面越小,越网页,您可以在内存中保留,而更大的可能性,给定的查询将能够在缓存中找到与缓慢的磁盘上的页面。 因此,你想使用,可以轻松满足您的现有和计划未来需求的最小数据类型。
BigInt有是8个字节; 如果数据的规模很小,所以它实际上取决于您的数据VARCHAR的可能较小。 然而,10个字符长的数字或许能够适应在SQL Server的int数据类型( http://msdn.microsoft.com/en-us/library/ms187745.aspx )取决于大小,因此INT与BIGINT取决于你域。
另外,如果你的整个行是一个固定长度的也有一定的优化SQL Server可以在扫描做,因为它知道确切位置在磁盘上的下一行会(假设行是连续的)。 边缘的情况下,可以肯定的,但它可以帮助。
对于第二个,它是更快比较比unicode字符串的整数。 所以,如果你只是存储数量的数据,你一定要切换到适当大小的数值数据类型。
最后,马克是正确的,这将成为一个非常令人费解的主键。 然而,如果你的数据工作的需要 - 比如这是你唯一的列和你永远做用户互动,增加查询 - 你可能是完美的罚款使得优化版(带Bigints等)的主键。 一个代码味道的那种,虽然,所以我会附和他的提醒,真正看看你的数据模型,看看这是否是正确的。
马克·S是正确的,该64字节的主键将被复制到每一个NC指数,所以你要支付的I / O成本,这将体现在内存中保存的数据量影响(因为你是在浪费数控索引页上的空间)。 所以,在此基础上,问题不是“我应该将我的VARCHAR处理”,而是“我要考虑我的聚集索引转换为一些完全different./
在VARCHAR VS有一个很好的理由,如果你有足够的时间转换BIGINT的条款; 即在每场储存,当你比较是两种不同类型的值的2字节的差异之外,SQL将被强制转换其中之一。 这将发生在每一个比较,这是否是一个索引联接,或where子句中的谓语。
根据你所选择的数据,哪个维度表联接到事实数据表,你可以在每个查询是捡了转换开销成本,因为它的加入,因为它是有一侧转换它。