标签: non-clustered-index

SQL Server为一列创建多个非聚簇索引,而在一个索引中只有多列

假设我有下表

  • UserID (身份)PK
  • UserName - 唯一非null
  • UserEmail - 唯一非null

建议什么是最佳性能?

  • UserNameUserEmail单独创建非聚集索引

要么

  • 只有一个包括两个列

请分享你为什么一个人优于其他人的想法.

sql-server multiple-columns non-clustered-index

6
推荐指数
1
解决办法
7935
查看次数

为什么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 Server 2008 R2,我想在非唯一的可空字段上添加非聚集索引.我的索引还会包含一个列,以避免访问我的聚簇索引:

CREATE INDEX IX_My_Index 
ON MyTable (myBasicField) 
INCLUDE (myIncludedField);
Run Code Online (Sandbox Code Playgroud)

在实际的数据中myBasicField会有很多,NULLs我想知道是否有一种方法可以通过不扫描这些来提高性能NULLs,或者防止将NULL值存储在我的索引上.

提前致谢.

t-sql indexing nullable sql-server-2008-r2 non-clustered-index

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

SQL Server 中同一列有多个索引

如果我们在 SQL Server 中已经有非聚集索引的列上再创建一个非聚集索引,会产生什么效果?

sql-server non-clustered-index

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

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
查看次数

MS SQL Server 中的默认索引

当我使用下面的查询为 MS SQL Server 中的列创建索引时

create index IX_indexname on tablename(columnname);
Run Code Online (Sandbox Code Playgroud)

如果不提及它是聚集索引还是非聚集索引,那么将创建什么索引?默认索引是哪个?

sql sql-server indexing clustered-index non-clustered-index

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

将聚簇索引转换为非聚集索引?

是否可以在sql server 2005中将聚簇索引转换为非聚簇索引或非聚簇索引转换为聚簇索引.

请将此查询转换为聚集索引:

create index index1 on mytable(firstcolumn)
Run Code Online (Sandbox Code Playgroud)

请将此查询转换为非聚集索引:

create clustered index clusindex1 on mytable(cluscolumn)
Run Code Online (Sandbox Code Playgroud)

sql sql-server clustered-index non-clustered-index

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

SQL Server 2008 - 过度非规范化和索引过多:Matrix有什么用处?

我有一个崭露头角的开发人员,他非常热衷于他称之为"矩阵"的东西

我正在寻找同行的洞察力

简而言之,这就是我们所拥有的:
- 1个高度非规范化的表,大约120列
- 数据点包括帐户,客户,家庭,关系,产品,员工等...
- 每列一个索引:大约120个非聚集索引
-今天索引使用的数据库中大约90%的空间都是此表的索引
- 今天大约有150万行有很多空
- 表加载了一个存储过程,其核心是动态SQL
- 所有字段名都是通用的,不是描述数据
- 数据字典类型表与动态SQL一起使用以将任何数据点加载到任何字段
- 字段映射不是静态的:今天列dim_0001是客户名称,但明天可能是别的
- 没有主键
- 没有外键
- 没有实际约束(例如,所有字段都可以为空)

该表的参数:
- 使编写查询更简单,因为它消除了编写某些连接的需要

预期用途:
- 最终用户层,将成为Business Objects中Universe构建的核心组件
- 后ETL过程开发

我的建议要么杀死今天的进程(在测试环境中进行早期开发),要么将其移至测试的下一步.

根据我所做的研究,我的教育和经验,我不支持它,并希望一旦依赖这些表的一个或两个进程迁移到另一个解决方案,表就会被删除.

下面的脚本供您参考(我仅限于一个索引示例).

您可以提供的任何见解(甚至只是一个单词的意见)都是有价值的

-- The Matrix

CREATE TABLE [z005497].[tblMatrix](
    [as_of_dt] [datetime] NOT NULL,
    [dim_0001] [varchar](100) NULL,
    [dim_0002] [varchar](103) NULL,
    [dim_0003] [varchar](100) NULL,
    [dim_0004] [varchar](100) NULL,
    [dim_0005] [varchar](100) NULL,
    [dim_0006] [varchar](100) NULL,
    [dim_0007] [varchar](100) NULL,
    [dim_0008] [varchar](100) NULL,
    [dim_0009] [varchar](100) NULL,
    [dim_0010] [varchar](100) NULL,
    [dim_0011] …
Run Code Online (Sandbox Code Playgroud)

database-design normalization dynamic-sql sql-server-2008 non-clustered-index

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

sqlite支持索引吗?

谁能告诉我Sqlite是否支持聚簇索引和非聚簇索引?如果它确实如何使非主键的列成为非聚集索引?我对数据库概念很新,因此很困惑..

sqlite non-clustered-index

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

为什么Len功能可以使用索引?

我有一个145000行的表.并没有任何索引.

当我在sql下运行时.我按预期在执行计划上找到了表扫描.它生成六行和3481逻辑读取.

SET STATISTICS IO ON
SELECT columnA FROM table WHERE LEN(columnA)<>5
Run Code Online (Sandbox Code Playgroud)

然后我在columnA上添加一个聚簇索引并运行sql.I在执行计划中找到一个集群索引扫描.它生成六行和3511逻辑读取.我可以理解B树节点读取的更大逻辑读取.

但令我困惑的是,我在columnA上使用非聚集索引而不是聚簇索引并运行sql.我在执行计划上找到了索引扫描.它生成六行,只需要417个逻辑读取!

我不认为len()函数可以利用索引.但是为什么columnA上的非聚集索引会减少逻辑读取次数(9次)?

sql-server clustered-index non-clustered-index

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