这个问题是关于SQL Server索引性能的,其中包含a varchar(2000)
作为INCLUDE
索引。
我试图在缓慢而不稳定的数据库应用程序中提高性能。在某些情况下,数据是通过大VARCHAR字符串来访问的,与查询包括像multple字符串操作SUBSTRING()
,SPACE()
和DATALENGTH()
。这是访问的简化示例;
update fattable set col3 =
SUBSTRING(col3,1,10) + '*' +
SUBSTRING(col3,12,DATALENGTH(col3)-12)
from fattable where substring(col3,10,1) = 'A' and col2 = 2
模式如下所示:
CREATE TABLE [dbo].[FatTable](
[id] [bigint] IDENTITY(1,1) NOT NULL,
[col1] [nchar](12) NOT NULL,
[col2] [int] NOT NULL,
[col3] [varchar](2000) NOT NULL, ...
定义了以下索引,并在大文本列上覆盖了一个字段。
CREATE NONCLUSTERED INDEX [IndexCol2Col3] ON [dbo].[FatTable] ( [col2] ASC )
INCLUDE( [col3] )
据我所知,将大数据字段放入索引是很糟糕的。我已经阅读了几篇文章,包括http://msdn.microsoft.com/zh-cn/library/ms190806.aspx,其中讨论了分页和磁盘大小对索引性能的影响。话虽如此,查询计划肯定使用覆盖索引。我没有足够的信息来确定这在系统负载方面实际花了我多少钱。我确实知道,总体而言,系统运行不佳,我担心这是问题之一。问题:
将此
varchar(2000)
列放在索引中INCLUDE
曾经是个好主意吗?由于
INCLUDE
字段存储在叶节点中,它们对索引性能有很大影响吗?
更新:感谢您的出色答复!从某些方面来说,这是一个不公平的问题-就像你们说的那样,没有实际的统计数据和分析,就没有绝对正确的答案。像许多性能问题一样,我猜答案是“取决于”。
VARCHAR(2000)
通常的店刚十个字符是一回事; 每个记录有2,000字节的固定空间是另外一回事。