【问题标题】:create index clause on table variable在表变量上创建索引子句
【发布时间】:2016-04-27 09:18:22
【问题描述】:

我需要在不形成唯一键的两列(在表变量内)上创建索引。

表结构如下图-

DECLARE @Sample TABLE (                           
    [AssetSk] [int] NOT NULL,                
    [DateSk] [int] NOT NULL,             
    [Count] [numeric](38, 2) NULL         
    )  

我正在尝试添加索引,如下所示 -

INDEX AD1 CLUSTERED([AssetSk],[DateSk])  

但是,在 SQL Server 2012 上运行它时出现以下错误
“'INDEX' 附近的语法不正确。如果这是作为表提示的一部分,现在需要 WITH 关键字和括号。有关正确的语法,请参阅 SQL Server 联机丛书。”

但是,这可以在 SQL Server 2014 上完美运行。有什么方法可以在 SQL Server 2012 上运行它。

【问题讨论】:

  • 建议:如果表存储的结果集太大,需要索引来提高查询性能,请移至临时表。顺便说一句,这里的主键可以帮助你。
  • @DeepanshuKalra 临时表不允许在表值函数中。

标签: sql sql-server tsql sql-server-2012 sql-server-2014


【解决方案1】:

您不能使用 2014 之前的 SQL Server 版本在表变量中构建唯一键以外的索引。

但是,您可以做到这一点:再添加一个具有自动递增值的列,并创建唯一索引,包括您需要的列和这个新的列。

DECLARE @Sample TABLE (
    [ID] bigint identity(1, 1),                           
    [AssetSk] [int] NOT NULL,                
    [DateSk] [int] NOT NULL,             
    [Count] [numeric](38, 2) NULL,
    UNIQUE NONCLUSTERED ([AssetSk],[DateSk], ID)       
    )

更新:事实上,在表变量上创建这样的索引是没有用的。通常 SQL Server 估计一个表变量只有一行,因此它不会使用该索引的概率相对较高。

【讨论】:

  • 为什么非集群?如果您将其设为集群,它将覆盖COUNT 的附加列并且更有用。如果索引覆盖 SQL Server,则应使用它,而不需要对索引上的可搜索谓词进行任何额外提示。如果导致问题,可以使用 OPTION (RECOMPILE) 避免单行估计。
  • @MartinSmith 通常我会避免在自动递增 ID 以外的列上创建聚集索引,因为它定义了表中数据存储的顺序,因此可以在数据插入时对表进行大量重新排序。
  • The table isn't necessarily in CI order 它永远不会对插入的现有行进行重新排序,尽管如果在拆分的页面上它们可能会被移动。它可能会对当前插入 CI 键顺序的数据集进行排序,但它也可能会做同样的事情来维护非聚集索引。 (NCI 在页面拆分方面也有完全相同的问题)。如果需要排序,则为堆上的非覆盖 NCI(AssetSk]、[DateSk]、ID、RID)排序的数据量将与首先使聚集索引覆盖一样多。
【解决方案2】:

据我所知,在 SQL Server 2012 及以下版本中,您无法为表变量添加索引。要添加索引,您必须像这样声明表:

CREATE TABLE #Sample (                           
[AssetSk] [int] NOT NULL,                
[DateSk] [int] NOT NULL,             
[Count] [numeric](38, 2) NULL         
)  

然后你可以像这样创建你需要的索引

CREATE CLUSTERED INDEX IX_MyIndex
 ON #Sample ([AssetSk],[DateSk])

当然,当你完成了四个函数中的表格后,你可以调用

DROP TABLE #Sample

【讨论】:

  • 感谢您的建议。但是,我不能在 Table Valued 函数中使用它。这就是我专注于用户定义表的原因。
猜你喜欢
  • 2015-08-14
  • 2016-02-18
  • 1970-01-01
  • 2019-07-02
  • 2013-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多