标签: clustered-index

将主键添加到具有现有聚簇索引的表

我必须使用数据库来进行报告数据库非常大:416 055 104行每行非常轻,但只是布尔值和int id.

每行由3列标识,但令我惊讶的是,它上面没有主键.仅具有唯一约束的聚簇索引.

所以知道,我有两个问题.

  1. 这有什么好的理由吗?
  2. 有什么办法可以把它变成主键.

关于问题2

创建新主键还会创建要与之关联的非聚集索引(已存在已存在的聚簇索引).
不是我想要的.我想保留相同的索引,但也使它成为主键.

  • 可能吗?
  • 再次创建整个索引会更快吗?(希望如此)
  • 可能是什么后果?(锁定?崩溃?数据损坏?)

primary-key alter clustered-index sql-server-2008

5
推荐指数
1
解决办法
2272
查看次数

SQL Server 2008非聚簇索引是否包含聚簇索引字段?

好的,我需要再次拼出这个.我已经在线阅读了这些文章,但我还没有找到明确的答案.

在SQL Server 2008中,我有一个"核心"表,其中包含大约50,000条记录和大量读取活动,在所有查询中以相同的方式使用.此数据每月更新一次,每秒读取数百次.

数据在字段上具有聚簇索引,因为它们经常被访问.假设聚集索引是:

集群指数

Field1 int
Field2 int
Field3 int
Field4 int
Field5 int
Run Code Online (Sandbox Code Playgroud)

现在,没有比这更多的数据,所以将额外的几列放入"包含的列"是有意义的,但SQL Server不允许在聚集索引上包含列.

因此,我们有第二个索引,其字段与Clustered Index基本相同,其他列为"Included Columns".但是,从我读过的内容来看,我认为这可能是多余的?

覆盖索引(非群集)

Field1 int
Field2 int
Field3 int
Field4 int
Field5 int
Run Code Online (Sandbox Code Playgroud)

包括栏目

Field6 varchar(96)
Field7 varchar(96)
Run Code Online (Sandbox Code Playgroud)

非聚集索引ALREADY是否具有其中定义的聚簇索引的列?

如果是这样,那么如何使用NO列创建第二个索引(除了已经在聚簇索引中的内容)?换句话说,我想说"这个索引与聚集索引完全相同......带有几个包含的列".

或者,将所有列放入聚集索引(包括不识别记录的两个列)会更好吗?varchar列确实更频繁地更新(每天几次而不是每月一次),所以我希望将它们保留在聚集索引之外,但我认为它们足够深,它们不会影响索引树足以在发生更改时导致任何重新平衡.

那么,是否有一种有效的方法来设置这些索引,以便该表的所有列都可以通过索引获得而无需返回到表中?

sql indexing clustered-index sql-server-2008

5
推荐指数
2
解决办法
3181
查看次数

在大型表上索引外键的最佳实践

我有一个大表(SQL Server 2008),有近300万行.它目前在其主键上有一个聚簇索引,在其外键上有一个非聚簇索引.

几乎所有表上的查询都是基于外键的读取.

  1. 我应该将表上的索引更改为与外键相对吗?
  2. 这样做的最佳流程是什么?

谢谢

sql sql-server indexing clustered-index

5
推荐指数
1
解决办法
1150
查看次数

Solr用于重新索引大型文档语料库

我们正在寻找一些建议,围绕Solr系统地重新索引一个不断增长的文档集(现在有数千万,一年中有数亿),而不会使当前运行的索引失效.需要在定期基础上重新编制索引,因为:

  • 围绕搜索需要额外模式字段的现有语料库引入了新功能,这些字段我们无法提前预期
  • 语料库跨多个分片索引.当它超过某个阈值时,我们需要创建更多的分片并在所有分片上均匀地重新平衡文档(SolrCloud似乎还不支持).

当前索引会收到非常频繁的更新和添加,需要在几分钟内进行搜索.因此,在批量脱机中重新索引语料库的方法实际上不起作用,因为批次完成时,新文档将可用.

我们目前正在研究的方法是:

  • 在旧群集仍可供搜索时,创建新的分片集群并批量重新索引.不属于重新编制索引的批处理的新文档将发送到旧群集和新群集.准备切换时,将负载均衡器指向新群集.
  • 使用CoreAdmin:为每个分片生成一个新核心,并将重新索引的批处理发送到新核心.不属于重新编制索引的批处理的新文档将发送到旧核心和新核心.准备切换时,使用CoreAdmin动态交换核心.

我们很感激,如果人们可以确认或者在这些方法中的任何一个或所有方法中找到漏洞.一个比另一个更合适吗?还是我们完全脱了?先感谢您.

indexing solr clustered-index bigdata

5
推荐指数
1
解决办法
1150
查看次数

为什么SQL Server在"select*"操作中使用非聚集索引而不是聚簇PK?

我有一个非常简单的桌子,为人们存储标题("先生","太太"等).这是我正在做的简要版本(在这个例子中使用临时表,但结果是相同的):

create table #titles (
    t_id    tinyint     not null    identity(1, 1),
    title   varchar(20) not null,

    constraint pk_titles primary key clustered (t_id),
    constraint ux_titles unique nonclustered (title)
)
go

insert #titles values ('Mr')
insert #titles values ('Mrs')
insert #titles values ('Miss')

select * from #titles

drop table #titles
Run Code Online (Sandbox Code Playgroud)

请注意,表的主键是聚类的(显式,为了示例),并且标题列有一个非聚集唯一性约束.

以下是select操作的结果:

t_id title
---- --------------------
3    Miss
1    Mr
2    Mrs
Run Code Online (Sandbox Code Playgroud)

查看执行计划,SQL在群集主键上使用非聚集索引.我猜这解释了为什么结果按此顺序返回,但我不知道为什么它会这样做.

有任何想法吗?更重要的是,任何阻止这种行为的方法?我希望按照插入的顺序返回行.

谢谢!

sql-server clustered-index sql-execution-plan non-clustered-index

5
推荐指数
2
解决办法
3976
查看次数

删除主键(聚簇索引)以提高插入性能

我们一直在经历SQL超时,并确定该瓶颈是审计表 - 我们系统中的所有表都包含插入,更新和删除触发器,这会导致新的审计记录.

这意味着审计表是系统中最大且最繁忙的表.然而,数据只会进入,并且永远不会出现(在此系统下),因此不需要select执行任何性能.

select top 10最近运行一个返回记录而不是"第一个"记录. order by当然可以工作,但是我希望选择顶部应该根据它们在光盘上的顺序返回行 - 我希望它会返回最低的PK值.

有人建议我们删除聚集索引,实际上也是主键(唯一约束).正如我之前提到的,select在这个系统中没有必要从这个表中获取.

聚集索引在表上创建什么样的性能?拥有无索引,非聚集,无密钥表的(非选择)分支是什么?还有其他建议吗?

编辑

我们的审计涉及CLR功能,我现在使用和不使用PK,索引,FK等进行基准测试,以确定CLR功能和约束的相对成本.

经过调查,表现不佳与insert陈述无关,而是与编制审计的CLR功能无关.删除CLR后使用直接TSQL proc,性能提高了20倍.

在测试期间,我还确定聚簇索引和标识列对插入时间的影响很小或没有差别,至少相对于发生的任何其他处理而言.

// updating 10k rows in a table with trigger

// using CLR function
PK (identity, clustered)- ~78000ms
No PK, no index - ~81000ms

// using straight TSQL
PK (identity, clustered) - 2174ms
No PK, no index - 2102ms
Run Code Online (Sandbox Code Playgroud)

primary-key clustered-index sql-server-2008 database-performance

5
推荐指数
1
解决办法
4486
查看次数

没有主键的聚簇索引

聚簇索引在索引的叶级存储实际数据的行.回到上面的示例,这将意味着与主键值123相关联的整个数据行将存储在该叶节点中.

在此输入图像描述

问题 - 如果主键不存在,我将Name列设置为聚簇索引.在这种情况下,上述陈述会变得矛盾吗?

sql-server sql-server-2005 clustered-index sql-server-2008

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

为什么聚集索引是更新未包含在该索引(Ms SQL)中的字段?

我们正在使用MS SQL Server 2005.

嗨,我正在数据库表上执行UPDATE语句.让我们说这个表有下一个列:

int Id PK
int Column1
int Column2
Run Code Online (Sandbox Code Playgroud)

它还有几个索引:

Unique Clustered (Id)
Non-Unique Non-Clustered (Column1)
Non-Unique Non-Clustered (Column2)
Run Code Online (Sandbox Code Playgroud)

我做下一步操作:

 UPDATE  [dbo].[Table] 
    SET Column1 = @Value1
    WHERE Column1 = @Param1
      AND Column2 = @Param2
Run Code Online (Sandbox Code Playgroud)

之后的实际执行计划如下所示:执行计划

其中86%的时间用于更新聚簇索引,其中不包括我刚刚更改的列.

禁用Web应用程序时,此操作应运行数十万次,这意味着它非常关键.

那么,有没有人知道为什么事情会这样发生,是否可以某种方式修复?这个问题有意义吗?如果需要,我准备提供更多信息.

t-sql sql-server indexing clustered-index

5
推荐指数
1
解决办法
1473
查看次数

如何查询以确定表是否具有CLUSTERED主键

我发现了这个问题,但它似乎没有回答这个问题......

SQL Server - 如何查找是否存在聚簇索引

如何编写IF T-SQL语句来说:

IF NOT ([TableName] has a CLUSTERED PK)
   ALTER TABLE to add the CLUSTERED PK 
Run Code Online (Sandbox Code Playgroud)

sql t-sql primary-key clustered-index

5
推荐指数
1
解决办法
6224
查看次数

INDEX()是否在MySQL中创建了聚簇索引或非聚簇索引?

我正在学习一个INDEX()CREATE TABLE语句中使用的教程,但没有解释它是集群还是非集群.我的问题是:INDEX()CREATE TABLE语句中使用会导致聚簇索引还是非聚簇索引?

例如:

CREATE TABLE test (a varchar(30), b varchar(30), index(a));

/* Is column A a clustered or non-clustered index? */
Run Code Online (Sandbox Code Playgroud)

还想知道如何做相反的事情:如果示例导致非聚集索引,您如何编写聚簇索引,反之亦然?

mysql sql clustered-index non-clustered-index

5
推荐指数
1
解决办法
4030
查看次数