标签: nonclustered-index

“select * from”的所有列的非聚集索引?

SELECT * FROM MyTable WHERE DataDate = '18-AUG-2013'对包含 340 列和 340 万行的表进行了简单查询。

在 SSMS (Ctrl-L) 中运行估计的执行计划建议我在 DataDate 上创建一个非聚集索引并包含所有其他列?

这样做是否明智(一般而言)?在我看来,这会大大增加索引空间和插入等的索引时间。?

ssms sql-server-2008-r2 nonclustered-index

4
推荐指数
1
解决办法
1170
查看次数

具有唯一列的非聚集索引是否总是首先解决过滤该列的所有查询?

我发现过索引的大型堆表,例如有多个不同的非聚集索引和不同的列,但其中一些索引将(只有一个)主键列设置为它们的第一个索引列。

我进行了一些调查,使用了索引和查询,并得出了我希望专业人士确认的结论。

问题1:我说基于主键的多个索引而不是仅基于主键列的一个索引作为第一个也是唯一的索引列是无稽之谈,因为所有使用此pk进行过滤或加入的查询都返回只有一行?(假设额外的过滤、连接或选择的列作为包含列放入索引中以完全覆盖查询并避免 RID 查找)

问题 2:基于表主键的非聚集索引应该始终创建为 UNIQUE 索引,这样说对吗?(无论出于何种原因,该设置都是可选的,因为 sql server 应该已经知道包含 pk 的索引将是唯一的...)

index sql-server sql-server-2008-r2 index-tuning nonclustered-index

4
推荐指数
1
解决办法
852
查看次数

未使用非聚集索引

我有一个包含 321 行的表(在下面创建)。

我希望下面的最后一个查询使用非聚集索引,然后使用键查找。但是,它使用聚集索引扫描。仅按预期返回单行。

为什么它执行扫描而不是使用非聚集索引?是不是因为表只包含 321 行?

CREATE TABLE dbo.TestIndexSample
(
    Code char(4) NOT NULL,
    Name nvarchar(200) NOT NULL,
    ModifiedDate datetime NOT NULL CONSTRAINT [DF_TestIndexSample_ModifiedDate] DEFAULT GETDATE(),
    CONSTRAINT [PK_TestIndexSample_Code] PRIMARY KEY CLUSTERED(Code)
);
GO
CREATE NONCLUSTERED INDEX IX_TestIndexSample_Name  
    ON dbo.TestIndexSample(Name);   
GO

INSERT INTO dbo.TestIndexSample(Code, Name)
select CodeName, FullName 
from dbo.SourceTest 
GO

SELECT * FROM dbo.TestIndexSample

SELECT * FROM dbo.TestIndexSample where Code = 'X132EY'

SELECT * FROM dbo.TestIndexSample where Name = 'User A'
Run Code Online (Sandbox Code Playgroud)

sql-server sql-server-2008-r2 index-tuning nonclustered-index

4
推荐指数
2
解决办法
1646
查看次数

“非集群位于主要”的含义

当我sp_help为一个表运行(使用 ALT+F1)时,在索引上,有一列index_description. 和行有例如:

  • 非集群位于 PRIMARY(在外键上)
  • 非聚集,假设位于 PRIMARY(在我创建的非聚集索引上)
  • 位于 PRIMARY 上的聚集的唯一主键

我对位于 PRIMARY部分更感兴趣,它是什么意思?

index sql-server clustered-index nonclustered-index

3
推荐指数
1
解决办法
6041
查看次数

每天被截断的表的索引优化

我在 SQL Server 2012 中有一堆表。

这些表由其他表提供。每天都有一些例程会截断(完全删除)它们并运行将结果插入其中的查询。它们就像静态视图,存储那些处理过的数据,以便更快地查询它们。

还有源表,每天接收数百万条新记录,这些不会被删除。

所有这些表都有一段时间会插入很多内容,而在一天的剩余时间里,它们只会被读取。

即使使用这些“静态视图”表,我认为我也可以提高整体性能。是否有处理这些行为的最佳实践?

对于第一种情况,我运行了一些基准测试,发现最好的性能来自对过滤最多的字段使用非聚集索引。我在截断之前删除这些索引并在插入后重新创建它们。删除和重新创建比重建更快,插入也更快。

我也应该保留 PK(没有语义意义)和聚集索引吗?我想如果没有索引,这些插入会更快,但是如果这些表没有 PK,我会有什么问题吗?它们从不明确使用。

我问这个是因为当我创建表并设置它的 PK 时

idBenchmark int NOT NULL IDENTITY (1,1) PRIMARY KEY
Run Code Online (Sandbox Code Playgroud)

聚集索引是自动创建的,具有随机名称,因此我无法删除并重新创建它。

sql-server optimization clustered-index nonclustered-index query-performance

3
推荐指数
1
解决办法
4032
查看次数

为什么 SQL Server 查询计划在查询中不使用索引几乎类似于使用索引的查询?

我有两个结构相似的 UPDATE 查询,但其中一个的 SQL Server 查询计划显示正在使用的索引,而另一个仅显示常规表扫描。

以下是查询(根据查询计划,#1 不使用索引,#2 使用)-

 UPDATE Payment_Metadata 
    SET 
    Payment_Metadata.CommodityCode = 'RAW MATERIALS', 
    Payment_Metadata.C1 = 'RAW MATERIALS', 
    Payment_Metadata.C2 = 'INGREDIENTS', 
    Payment_Metadata.C3 = 'OTHER ', 
    Payment_Metadata.RuleText = '---', 
    Payment_Metadata.LastUpdatedIndex = Payment_Metadata.LastUpdatedIndex + 1, 
    Payment_Metadata.IsExcluded = 0, 
    Payment_Metadata.LogText = 'Commodity>Raw Materials>Ingredients>Other' 
    FROM 
    Payment_Metadata 
    WHERE 
    Payment_Metadata.IsProcessed = 0 
    AND (Payment_Metadata.EnrichedVendor = 'NFL' 
         OR Payment_Metadata.Vendor_No = 'NFL')
Run Code Online (Sandbox Code Playgroud)

第二个查询使用索引:

UPDATE Payment_Metadata 
SET 
Payment_Metadata.CommodityCode = 'RAW MATERIALS', 
Payment_Metadata.C1 = 'RAW MATERIALS', 
Payment_Metadata.C2 = 'INGREDIENTS', 
Payment_Metadata.C3 = 'OTHER ', 
Payment_Metadata.RuleText = '---', 
Payment_Metadata.LastUpdatedIndex = …
Run Code Online (Sandbox Code Playgroud)

sql-server execution-plan nonclustered-index

3
推荐指数
1
解决办法
1759
查看次数

表的排序是基于聚集索引还是非聚集主键?

我在 name 列上创建了一个带有主键的表,表的排序基于 name 列

create table TestPrimaryKey (Name varchar(20) primary key,id int identity)

insert into TestPrimaryKey (SomeText) values ('john')
insert into TestPrimaryKey (SomeText) values ('ryan')
insert into TestPrimaryKey (SomeText) values ('jennifer')
insert into TestPrimaryKey (SomeText) values ('martha')
insert into TestPrimaryKey (SomeText) values ('luke')
insert into TestPrimaryKey (SomeText) values ('alex')
insert into TestPrimaryKey (SomeText) values ('wayne')
Run Code Online (Sandbox Code Playgroud)

现在我将主键上的聚集索引更改为非聚集索引,排序仍然基于名称列

    begin tran
    alter table dbo.TestPrimaryKey drop constraint PK__TestPrim__BC2905030401D947
    alter table dbo.TestPrimaryKey add constraint PK__TestPrim__BC2905030401D947 primary key nonclustered (SomeText)
    commit tran
Run Code Online (Sandbox Code Playgroud)

现在我正在另一个 (id) 列上创建一个唯一的聚集索引,但顺序仍然相同 …

sql-server primary-key clustered-index nonclustered-index table

3
推荐指数
1
解决办法
1937
查看次数

聚集索引和非聚集索引创建后删除会发生什么

集群索引和非集群索引创建后,当我们删除它们时会发生什么?

根据 Clustered Index ,叶子级别的数据会发生什么?

sql-server clustered-index sql-server-2008-r2 nonclustered-index sql-server-2014

3
推荐指数
1
解决办法
2776
查看次数

PRIMARY KEY 约束(带有 NONCLUSTERED INDEX)可以只检查某些值吗?

我可以设置一个(逻辑)PRIMARY KEY 约束,由(物理)NONCLUSTERED INDEX 提供服务,以便它只检查相关表中受约束和索引列另一列的某些值?

并且,如果是这样,该列是否可以建立为从其他表引用的 FOREIGN KEY 约束?

我试图基本上看看我是否可以从表中删除某些行而不从表中删除这些行,但仍然强制执行关系,例如:

  • IDs > 1000, 或者
  • CreatedDateTime > RemovalDate.

例如,你可以有这样的约束:

ALTER TABLE MyTable WITH NOCHECK ADD 
    CONSTRAINT PK_MyTable CHECK (Id > 1000)
Run Code Online (Sandbox Code Playgroud)

但是您将如何将此列设置为用 NONCLUSTERED INDEX 固定的 PRIMARY KEY 呢?

我可以做类似以下定义的事情吗:

ALTER TABLE MyTable WITH NOCHECK ADD 
    CONSTRAINT PK_MyTable CHECK (CreatedOn > '01/01/2010')
Run Code Online (Sandbox Code Playgroud)

但是对于名为Id?的列有一个 INDEX

sql-server-2008 database-design sql-server nonclustered-index check-constraints

3
推荐指数
2
解决办法
772
查看次数

包含或不包含在索引中

现在的情况

我正在观察一个简单的语句,该语句正在查询一个表并访问多个索引来检索数据:

SELECT DISTINCT 
feld16,
zahl4,
feld12,
feld19 FROM 
object1 WHERE 
(deleted = 0 or deleted IS NULL)
Run Code Online (Sandbox Code Playgroud)

查询执行计划可以在Brent Ozar 的 Paste The Plan网站上找到,图形表示如下:

上述 SELECT 语句的查询执行计划

该表由包含各种数据的 82 列组成。列中数据的分布deleted为:

 deleted | Number of records
---------+-------------------
       0 |        71'620'068
    NULL |                10
 a value |            59'673
Run Code Online (Sandbox Code Playgroud)

结果集包含大约。大约 6400 万行。7100 万行与搜索谓词匹配WHERE (deleted = 0 or deleted IS NULL)。这是因为DISTINCT遗漏了 700 万条记录。

向前走

为了加快速度,我正在考虑添加一个新索引。最初我以为我有足够的知识来添加足够的索引,但我开始重新审视自己。

问题

以下哪个索引定义(可能)是适当的解决方案?

1.不带INCLUDE的索引

CREATE NONCLUSTERED INDEX [IDXNew] ON [schema_owner].[object1]
(
    [deleted] ASC,
    [feld16] ASC,
    [zahl4] …
Run Code Online (Sandbox Code Playgroud)

sql-server index-tuning nonclustered-index sql-server-2016

2
推荐指数
1
解决办法
111
查看次数