我有一个多对多的表,让我们说:
PersonJob(personId,jobId)
Run Code Online (Sandbox Code Playgroud)
with clustered index(personId,jobId).
问题是:
如果在SQL中的某个地方,我会进行如下查询:
SELECT *
FROM PersonJob JOIN Job ON PersonJob.jobId = Job.jobId
.......
Run Code Online (Sandbox Code Playgroud)
是否会利用该聚集索引在PersonJob表中查找具有特定jobId的记录?或者我最好在PersonJob表的jobId列上创建新的非群集非唯一索引?
谢谢帕维尔
当一个表在SQL Server中具有聚簇索引时,是否意味着所有索引查询都将通过聚簇索引?
例如,如果我有一个包含单个非聚集索引的表(索引一列)并通过该列搜索行,它将执行 Index Seek -> RID -> Data row lookup -> Result
但是,如果我在不同的列上添加聚簇索引,则相同的查询将执行以下操作 Index Seek -> Extract clustering key -> Clustered index seek -> Results
这对我来说意味着非聚集索引不再"终止"叶子上的RID,而是使用聚簇索引的聚类键?是对的吗?
在我们的数据库中有一个用它创建的表ANSI_NULLS OFF.现在我们使用此表创建了一个视图.我们想为此视图添加聚簇索引.
在创建聚簇索引时,它显示的错误就像无法创建索引一样,因为ANSI_NULL对于此特定表是关闭的.
该表包含大量数据.所以我想将此选项更改为ON而不会丢失任何数据.
有没有办法改变表来修改这个选项.请提出你的建议.
描述索引扩展使用的MySQL文档,以下表为例,后面是查询:
CREATE TABLE t1 (
i1 INT NOT NULL DEFAULT 0,
i2 INT NOT NULL DEFAULT 0,
d DATE DEFAULT NULL,
PRIMARY KEY (i1, i2),
INDEX k_d (d)
) ENGINE = InnoDB;
SELECT COUNT(*) FROM t1 WHERE i1 = 3 AND d = '2000-01-01';
Run Code Online (Sandbox Code Playgroud)
InnoDB内部将转换索引k_d以包含最后的主键.也就是说,实际索引k_d将打开(d, i1, i2),三列.
文档继续解释(强调我的):
在这种情况下,优化器不能使用主键,因为它包含列(i1,i2),查询不引用i2.相反,优化器可以在(d)上使用辅助索引k_d,执行计划取决于是否使用扩展索引.
我对以上陈述感到困惑.首先,它说i1是不足够使用两列的主键索引(i1, i2).然后,在第二句,它说,该指数k_d上(d, i1, i2) 可以使用,尽管只有d和i1正在使用, …
我正在阅读有关聚簇索引如何工作的所有内容,并认为它们对我的应用程序有益.我知道主键是自动聚簇索引,但是如何将聚簇索引添加到非主键列?
即用户帖子的数据存储区.每个帖子都有一个ID,但也有一个用户ID,但由于用户可以多次发帖,因此user-id不是主键.如何将聚集索引添加到用户ID,这是一个好主意?
通常,通过设置主键在SQL Server Management Studio中创建聚簇索引,但是我最近关于PK < - >聚簇索引(Microsoft SQL Server 2008主键的含义)的问题表明没有必要设置PK和聚集索引是相等的.
那么我们应该如何选择聚簇索引呢?我们有以下示例:
create table Customers(ID int,...)create table Orders(ID int,CustomerID int)
我们通常会在两个ID列上创建PK/CI,但我想为CustomerID中的Orders创建它.那是最好的选择吗?
sql-server database-design primary-key clustered-index sql-server-2008
我有一个MessageModel带有timestamp属性的消息创建时间.我想在这个long属性上创建一个聚簇索引.我希望在进行查询时获得查询加速,以获得比某个时间戳更新的所有消息.创建后,时间戳值永远不会更改.我目前在int Id属性上有一个常规索引.
如何在ASP.NET MVC 4.5中使用Entity Framework代码优先迁移在models属性上添加聚簇索引?
entity-framework clustered-index asp.net-mvc-4 ef-migrations
我有一个存储员工详细信息的SQLServer表,列ID是GUID类型,而EmployeeNumber列是INT类型.大多数时候,我会在加入和选择条件时处理EmployeeNumber.
我的问题是,在ClusteredIndex为EmployeeNumber时,将PrimaryKey分配给ID列是否合理?
我有一个非聚集主键的表:
CREATE TABLE [dbo].[StudentGrade](
[EnrollmentID] [int] IDENTITY(1,1) NOT NULL,
[CourseID] [nvarchar](10) NOT NULL,
[StudentID] [int] NOT NULL,
[Grade] [decimal](3, 2) NOT NULL,
CONSTRAINT [PK_StudentGrade] PRIMARY KEY NONCLUSTERED ([EnrollmentID] ASC))
Run Code Online (Sandbox Code Playgroud)
select语句是:
select EnrollmentID,Grade from StudentGrade
Run Code Online (Sandbox Code Playgroud)
GetUpdateCommand工作正常,可以识别非群集主键.
添加另一个聚簇唯一索引时(在两列上甚至不是select子句的一部分):
CREATE UNIQUE CLUSTERED INDEX [Badguy] ON [dbo].[StudentGrade] ([CourseID] ASC, [StudentID] ASC)
Run Code Online (Sandbox Code Playgroud)
GetUpdateCommand因此异常而失败:
System.InvalidOperationException: Dynamic SQL generation for the
UpdateCommand is not supported against a SelectCommand that does not return
any key column information.
Run Code Online (Sandbox Code Playgroud)
如果索引不是唯一的或不是群集的,则没有错误.
看起来聚类唯一索引优先于主键来描述元数据.如果有几个关键候选者(pk/unique index),它不会尝试使用查询中包含所有列的候选者.
这是预期的行为吗?除了选择索引列还是明确更新命令之外,还有哪种简单方法可以解决?
出于性能目的,我需要使用此聚簇索引,主键通常不用于查询.
我在SQL Server 2005中有一个存储过程,当我运行它并查看它的执行计划时,我注意到它正在进行聚簇索引扫描,这使得它的成本为84%.我已经读过,我必须修改一些东西以获得Clustered Index Seek,但我不知道要修改什么.
我会感激任何帮助.
谢谢,
布赖恩
clustered-index ×10
sql-server ×5
sql ×3
indexing ×2
mysql ×2
.net ×1
ado.net ×1
ansi-nulls ×1
c# ×1
primary-key ×1