如果我在SQL Server数据库上使用nvarchar(n)列作为聚簇索引,那么与数字(int)索引相比,我是否会遭受重大的性能损失?另外复合指数的表现如何比较?
我们的网站变得非常困难,所以我们正在考虑优化一些现有的查询.
在研究这个时,我们遇到了几个查询,当查询中有一个简单的聚集索引引用时,执行计划的速度提高了4-5倍...例如
如果这是旧查询:
SELECT ...
FROM myTable
WHERE categoryID = @category
Run Code Online (Sandbox Code Playgroud)
根据SSMS中的执行计划,以下查询将快4倍:
SELECT ...
FROM myTable
WHERE categoryID = @category
AND lotID = lotID
Run Code Online (Sandbox Code Playgroud)
我们似乎无法理解这将如何使查询更快.聚集索引在lotID上,但由于它与自身进行比较,这有什么帮助?
如果我没有记错的话,聚集索引会根据一些自定义顺序对磁盘上表的行进行物理排序。我假设表存储在文件中(也许每个表一个文件?)。好吧,然后假设某人在表中插入了“新行”,并且应该将其放置在开头。然后数据库需要在文件中物理移动整个表(所有行)吗?这不是太慢,还是有什么优化技术可以在插入后实现排序顺序?
我可以在视图上创建聚簇索引或非聚簇索引,SQL SERVER说,我们可以有多个非聚集索引(最大249),但表或视图上只存在一个聚簇索引.因为,记录被排序,它们在物理上存储的地方,我们不能有多个排序顺序.所以,我的问题是,因为View没有物理存储在数据库中.那么,如果我在视图和基表上创建聚簇索引已经存在聚簇索引.如何在视图上实现聚集索引?聚集索引如何工作并对视图有用?
我已经看到了一些(字面上只有几个)链接,并且文档中没有涉及与Firebird集群的内容,它可以完成.
然后,我在Firebird的这个问题CLUSTER命令上为月亮射击了?但是,回答者告诉我,Firebird根本没有聚集索引,所以现在我真的很困惑.
Firebird是否实际上对数据进行排序?如果是这样,可以通过任何密钥订购,而不仅仅是主密钥,并且可以打开和关闭群集/碎片整理,以便它只在停机期间执行吗?
如果没有,这不是一个性能打击,因为它会花更长的时间把不同的行放在一起,这些行自然应该是彼此相邻的吗?
(DB noob)
MVCC
我发现Firebird是基于MVCC的,因此旧的数据实际上不会被覆盖,直到"扫描".我非常喜欢那个!
再说一遍,我找不到多少,但是根据一把钥匙对数据进行碎片整理似乎真的很遗憾.
这表示数据库页面已进行碎片整理,但未提供进一步说明.
我有下表:
CREATE TABLE [dbo].[Addr](
[Address] [char](34) NOT NULL,
CONSTRAINT [PK_Addr] PRIMARY KEY CLUSTERED
(
[Address] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)
我正在尝试执行查询:
SELECT COUNT(*)
FROM Addr
Run Code Online (Sandbox Code Playgroud)
当表包含大约800万条记录时,它立即执行.但是现在表包含2100万条记录,而查询执行速度非常慢.Managemet Studio显示下一个估计的计划:

"存储"选项卡(表格属性)的屏幕截图

我在用MSSQL 2008 Express 10.50.1617.0.为什么这个简单的查询有这么复杂的计划
我有一个数据库,其中所有表包括Sitecolumn(char(4))和PrimaryIdcolumn(int).
目前,所有表上的聚簇索引都是这两列的组合.许多客户只有一个站点,所以在这些情况下,我认为将聚簇索引更改为仅包括PrimaryId.
如果有多个站点,我想知道仅使用PrimaryId聚集索引仍然是有利的吗?拥有较小的聚簇索引可能会产生比具有独特索引更好的性能吗?
如果它是相关的,通常不会有多个站点.10个站点将是很多.
我有一个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的新手,在学习聚簇索引时,我很困惑!
唯一键是聚簇索引还是非聚簇索引?唯一键仅在包含null的列中保存唯一值,因此根据此概念,唯一键应为聚簇索引,对吗?但是当我浏览本文时,我对MSDN感到困惑
创建UNIQUE约束时,默认情况下会创建一个唯一的非聚集索引来强制执行UNIQUE约束。如果表上的聚簇索引尚不存在,则可以指定唯一的聚簇索引。
请帮助我更好地理解这个概念,谢谢。
将我的Wikipedia浏览量表聚类时,出现错误:
群集遇到的密钥长于最大允许的限制1024个字节。
内容:https://medium.com/google-cloud/bigquery-optimized-cluster-your-tables-65e2f684594b
(我正在通过
CREATE TABLE `fh-bigquery.wikipedia_v3.pageviews_2017`
PARTITION BY DATE(datehour)
CLUSTER BY wiki, title
...
Run Code Online (Sandbox Code Playgroud)
)
clustered-index ×10
sql-server ×5
indexing ×3
performance ×3
count ×1
database ×1
firebird ×1
indexed-view ×1
mvcc ×1
sql ×1
ssms ×1
unique-key ×1
view ×1