鉴于索引在数据集大小增加时非常重要,有人可以解释索引在数据库无关的级别上的工作原理吗?
有关索引字段的查询的信息,请查看如何索引数据库列.
a clustered和a 之间有什么区别non-clustered index?
我对SQL(Server 2008)的较低级别知识是有限的,现在由我们的DBA挑战.让我解释一下(我已经提到了明显的陈述,希望我是对的,但如果你看错了,请告诉我)情景:
我们有一张桌子可以为人们提供"法院命令".当我创建表(Name:CourtOrder)时,我创建了它:
CREATE TABLE dbo.CourtOrder
(
CourtOrderID INT NOT NULL IDENTITY(1,1), (Primary Key)
PersonId INT NOT NULL,
+ around 20 other fields of different types.
)
Run Code Online (Sandbox Code Playgroud)
然后,我将非聚集索引应用于主键(以提高效率).我的理由是它是一个唯一的字段(主键),并且应该像我们经常那样被索引,主要用于选择目的Select from table where primary key = ...
然后我在PersonId上应用了CLUSTERED索引.原因是在物理上对某个人进行分组,因为绝大多数工作都是为了获得一个人的订单.所以,select from mytable where personId = ...
我现在已被拉上了这个.有人告诉我,我们应该将聚簇索引放在主键上,将正常索引放在personId上.这对我来说似乎很奇怪.首先,为什么要在特殊列上放置聚簇索引?什么是聚类?当然这是浪费聚集索引?我相信一个普通的索引会用在一个独特的列上.此外,聚类索引意味着我们不能聚集不同的列(每个表一个,对吧?).
我被告知我犯了一个错误的原因是他们认为在PersonId上放置聚集索引会使插入变慢.对于选择速度增加5%,我们将在插入和更新时降低95%的速度.这是正确有效的吗?
他们说因为我们聚集了personId,所以当我们插入或更改PersonId时,SQL Server必须重新排列数据.
那么我问过,为什么SQL会有一个CLUSTERED INDEX的概念,如果它这么慢?它和他们说的那么慢吗?我应该如何设置索引以获得最佳性能?我以为SELECT比INSERT更多......但他们说我们在INSERTS上遇到了锁定问题......
希望可以有人帮帮我.
嗨专家,
" 聚集 " 一词在" 聚集索引 "中的含义是什么?我怀疑它与磁盘扇区的使用有关.因为我依稀记得Windows将磁盘空间组织成集群,集群由一个或多个512字节扇区组成.这两个概念有任何联系吗?
谢谢.
我的情景,我有帖子,按类别分组.对于类别的概述列表,我想显示具有类别的前10个帖子的摘要(与显示完整数据的类别的详细视图相对).前10个帖子由分数决定,分数来自另一个表(实际上是索引视图 - 但这在这里无关紧要).
表结构如下:
CREATE TABLE [dbo].[Categories]
(
[Id] INT NOT NULL IDENTITY CONSTRAINT [PK_Categories] PRIMARY KEY,
[Key] CHAR(10) CONSTRAINT [UK_Categories_Key] UNIQUE,
[Caption] NVARCHAR(500) NOT NULL,
[Description] NVARCHAR(4000) NULL
)
GO
CREATE TABLE [dbo].[Posts]
(
[Id] INT NOT NULL IDENTITY CONSTRAINT [PK_Posts] PRIMARY KEY,
[CategoryId] INT NOT NULL CONSTRAINT [FK_Posts_Category] FOREIGN KEY REFERENCES [dbo].[Categories] ([Id]),
[Key] CHAR(10) CONSTRAINT [UK_Post_Key] UNIQUE,
[Text] NVARCHAR(4000) NULL,
[SummaryText] AS
CASE WHEN LEN([Text]) <= 400
THEN CAST([Text] AS NVARCHAR(400))
ELSE CAST(SUBSTRING([Text], 0, 399) + NCHAR(8230) …Run Code Online (Sandbox Code Playgroud) 我的数据库包含下表:
表:
country {
code varchar(255) not null
primary key
};
Run Code Online (Sandbox Code Playgroud)
类:
@Entity
public class Country {
@Id
@Column(name = "code")
private String mCode;
public String getCode() {
return mCode;
}
public void setCode(String code) {
mCode = code;
}
}
Run Code Online (Sandbox Code Playgroud)
样本表行:
| code |
|------|
| USA |
| UK |
Run Code Online (Sandbox Code Playgroud)
当我使用以下CrudRepository检索国家/地区时:
public interface CountryRepository extends CrudRepository<Country, String> {
}
Run Code Online (Sandbox Code Playgroud)
第一种情况:
mRepository.findOne("USA")
Run Code Online (Sandbox Code Playgroud)
它将在我的休息api中给出以下结果:
{
"code": "USA"
}
Run Code Online (Sandbox Code Playgroud)
第二种情况:
mRepository.findOne("UsA")
Run Code Online (Sandbox Code Playgroud)
它将在我的休息api中给出以下结果:
{
"code": "UsA"
}
Run Code Online (Sandbox Code Playgroud)
第三种情况:
mRepository.findOne("Usa")
Run Code Online (Sandbox Code Playgroud)
它将在我的休息api中给出以下结果:
{
"code": …Run Code Online (Sandbox Code Playgroud) 我在http://www.sql-server-performance.com/2007/clustered-indexes上阅读了有关sql server数据库的提示
最后,作者提到:"由于每个表只能创建一个聚簇索引,因此请花些额外的时间仔细考虑如何使用它."
我的问题是:
*为什么在sql server中只能创建每个表的一个聚簇索引?*
我在SQL Server 2014中使用了insert into命令,但没有插入相同的数据顺序.
它显示的行数相同,但数据顺序与您在下图中看到的数据顺序不同.
insert命令是:
insert into [test].[dbo].[HöjdKortvågVänster] ([Höjd kortvåg vänster (null)]) select [Höjd kortvåg vänster (null)] from [test].[dbo].[test111]
Run Code Online (Sandbox Code Playgroud)
图1:源表的Select命令
图2:目标表的Select命令
我该怎么做才能解决这个问题?
我是SQL Server的新手,在学习聚簇索引时,我很困惑!
唯一键是聚簇索引还是非聚簇索引?唯一键仅在包含null的列中保存唯一值,因此根据此概念,唯一键应为聚簇索引,对吗?但是当我浏览本文时,我对MSDN感到困惑
创建UNIQUE约束时,默认情况下会创建一个唯一的非聚集索引来强制执行UNIQUE约束。如果表上的聚簇索引尚不存在,则可以指定唯一的聚簇索引。
请帮助我更好地理解这个概念,谢谢。
我最近一直在阅读如何clustered index和non-clustered index有效的方法.我用简单的术语理解(如果错误,请纠正我):
支持clustered和non-clustered index存在的数据结构B-Tree
Clustered Index:根据索引列(或键)对数据进行物理排序.你只能有一个clustered Index每个table.如果没有index表创建过程中指定,SQL服务器将自动创建clustered Index的primary key column.
Q1:由于数据是根据索引进行物理排序的,因此这里不需要额外的空间.它是否正确?那么当我删除我创建的索引时会发生什么?
Non-clustered Index:在non-clustered indexes,leaf-node树的包含列值和指向数据库中实际行的指针(行定位器).这里存在将non-clustered index table物理存储在磁盘上所需的额外空间.但是,一个不受数量的限制non-clustered Indexes.
Q2:这是否意味着对非聚集索引列的查询不会导致排序数据?
问题3:此处有一个额外的查找,用于使用叶节点处的指针定位实际的行数据.与聚簇索引相比,这会有多大的性能差异?
锻炼; Tibial:
考虑一个Employee表:
CREATE TABLE Employee
(
PersonID int PRIMARY KEY,
Name varchar(255),
age int,
salary int
);
Run Code Online (Sandbox Code Playgroud)
现在我创建了一个employee表(创建了employee上的默认聚簇索引).
此表上的两个常见查询仅发生在年龄和工资列上.为简单起见,我们假设表不经常更新
例如:
select * from employee where age …Run Code Online (Sandbox Code Playgroud) 从https://www.postgresql.org/docs/9.6/static/indexes-index-only-scans.html:
PostgreSQL中的所有索引都是辅助索引,这意味着每个索引都与表的主数据区(在PostgreSQL术语中称为表的堆)分开存储。
在postgresql中,辅助索引是否定义为与表的主数据区分开存储的索引?
如果不是,它的定义是什么?为什么引用中提到的不是定义?
同样,主索引的定义是什么?
postgresql中的概念与Oracle数据库中的概念相同吗?
谢谢。
我想构建一个SQL Server数据库,其中一个表将包含200.000.000条记录.
该表有2列:Id和Value,其中Id是PrimaryKey并被索引.
我的问题是关于SQL Server的性能,我可以通过主键获得一个值多快?
sql ×9
sql-server ×8
indexing ×6
performance ×2
database ×1
hibernate ×1
java ×1
mysql ×1
postgresql ×1
spring ×1
unique-key ×1