随笔分类 - 02.索引
Indexing
摘要:在我的博客上,以前我经常谈到SQL Serverl里的书签查找,还有它们带来的很多问题。在今天的文章里,我想从性能角度进一步谈下书签查找,还有它们如何拉低你整个SQL Server性能。 书签查找——反复循环 如果你的非聚集索引不是个覆盖非聚集索引,SQL Server的查询优化器会引入书签查找。对
阅读全文
摘要:列存储索引是好的!对于数据仓库和报表工作量,它们是真正的性能加速器。与聚集列存储结合,你会在常规行存储索引(聚集索引,非聚集索引)上获得巨大的压缩好处。而且创建聚集列存储索引非常简单: 但这是你对聚集列存储需要知道的一切?并不是,如你在这篇文章会看到的…… 什么是列存储段(ColumnStore S
阅读全文
摘要:当我谈论索引时,大家经常会问我在复合非聚集索引里,列的顺序是否重要?简单来说:“看情况”。我们来具体看下为啥“看情况”…… 单例查找(Singleton Lookups) 当在你的表上有进行单例查找的查询时,在复合非聚集索引里列的顺序真的不重要。假设下列查询: 现在你可以在StateProvince
阅读全文
摘要:对于数据获取,如果查询优化器在执行计划里选择了索引,那么SQL Server里的每个索引可以提高你的查询性能。但在另一方面,每个索引也会伤及你的性能,因为在INSERT,UPDATE和DELETE期间,每个索引需要被维护。因此对于你的工作量,尽可能创建少的索引非常重要——不然在写操作期间,你会有巨大
阅读全文
摘要:一年前,我写了在索引的导航结构里,SQL Server如何存储VARCHAR列。我们都知道,在SQL Server里索引(聚集索引,非聚集索引)的键列有最大900byte的大小限制。 假设现在你想捉弄下SQL Server,在VARCHAR(8000)的列上创建一个索引,并在索引键列上插入超900b
阅读全文
摘要:有人问了我一个最有意思的问题:“你能禁用聚集索引么?” 对这个问题,我先是吓了一跳,因为我从未想过禁用聚集索引,因为聚集索引代表表数据,对这个最有趣问题,我立即答道:“我认为可以,但是...” 好吧,我们现在来讨论下“但是”。你禁用聚集索引,但我真的不知道SQL Server会如何反应,因此我们来试
阅读全文
摘要:在今天的文章里我想谈下SQL Server里非常重要的话题,当人们第一次使用SQL Server时是最会混淆的。即主键约束(Primary Key constraint)和聚集索引(Clustered Index)的区别。什么是主键(Primary Key)首先让我们谈下主键约束本身。顾名思义它只是...
阅读全文
摘要:在今天的文章里,我想向你展示下SQL Server里一个未公开的函数,还有你如何用那个函数来找出在哪页记录被存储。%%lockres%%今天我想向你展示的未公开函数叫做%%lockres%%,它与SQL Server的锁实现有关。我们都知道,SQL Server实现锁层级并在记录层,页层,表层请求锁...
阅读全文
摘要:我是个懒人,我只想干尽可能少的活。当我干活的时候我不想太多。是,你没看错,这看起来很糟糕,作为一个DBA这很不合格。但在今天的文章里,我想给你展示下,当你想对特定查询创建索引设计时,你如何把你的工作和思考过程传达给查询优化器。听起来很有意思?嗯,那就进入我的索引调优世界吧!有问题的查询我们来看下列查...
阅读全文
摘要:如何选择聚集键值的最佳实践是什么?一个好的聚集键值应该有下列属性:范围小的(Narrow)静态的(Static)自增长的(Ever Increasing)我们来具体看下所有这3个属性,还有在SQL Server里为什么自增长值实际上是不会扩展的。范围小的(Narrow)聚集键值应该i越小越好。为什么...
阅读全文
摘要:在今天的文章里,我想专门详细谈下SQL Server 2014引入的可更新聚集列存储索引(Updateable Clustered ColumnStore Index)。在我们进入细节讨论前,我想先给你简单介绍下它在SQL Server 2012里出现时的情况,还有它们的局限性。SQL Server...
阅读全文
摘要:传统的关系数据库服务引擎往往并不是对超大量数据进行分析计算的最佳平台,为此,SQLServer中开发了分析服务引擎去对大笔数据进行分析计算。当然,对于数据的存放平台SQLServer数据库引擎而言,也是需要强大的数据处理能力的。在SQLServer 2012时,SQL Server 引入了列存储索引...
阅读全文
摘要:今天我使用2048的桶数的哈希索引,往Hakaton里插入100万的记录,测试下在哈希桶数里,哈希冲突(Hash Collision)是如何影响Hekaton的工作量——结果非常非常有意思。首先我想介绍下什么是哈希冲突。你可能知道(非常希望),在SQL Server 2014里,Hakaton表是以...
阅读全文
摘要:今天这篇文章我想谈下堆表上特有的性能问题:转发记录(Forwarding Records)。首先我们要澄清下什么是堆表:堆表就是没有聚集索引定义的表。它对插入新记录非常快,但当你读取数据时非常慢。读取数据会在你的存储子系统上引入随机存取(random I/O),有时候当你碰到转发记录,它会进一步降低...
阅读全文
摘要:这篇文章我想谈下SQL Server如何在变长列上存储索引。首先我们创建一个包含变长列的表,在上面定义主键,即在上面定义了聚集索引,然后往里面插入80000条记录: 1 -- Create a new table 2 CREATE TABLE Customers 3 ( 4 Customer...
阅读全文
摘要:在上一篇文章里,我谈了唯一聚集索引上的唯一和非唯一非聚集索引的区别。在这篇文章里,我想谈下非唯一聚集索引上的唯一和非唯一聚集索引的区别。我们都知道,SQL Server内部把非唯一聚集索引当作唯一聚集索引处理的。如果你定义了一个非唯一聚集索引,SQL Server会增加叫做uniquifier到你的...
阅读全文
摘要:在上篇文章里,我讨论了唯一和非唯一聚集索引的区别。我们已经知道,SQL Server内部使用4 bytes的uniquifier来保证非唯一聚集索引行唯一。今天我们来看下唯一聚集索引上,唯一和非唯一非聚集索引的区别。当我们在表上定义PRIMARY KEY约束时,SQL Server会为我们创建唯一聚...
阅读全文
摘要:在上一篇文章里,我们讨论了堆表上唯一/非唯一非聚集索引。在SQL Server里没有聚集索引定义的叫堆表。当你在堆表上定义了一个聚集索引,你的表数据就会重组按聚集键的顺序进行物理存储,因为这个表叫做聚集表。这篇文章里,我想谈下唯一和非唯一聚集索引之间的区别,这2类聚集索引对存储的影响。看这个文章之前...
阅读全文
摘要:在这篇文章里,我想详细介绍下SQL Server里唯一与非唯一非聚集索引的区别。看这个文章前,希望你已经理解了聚集和非聚集索引的概念,还有在SQL Server里是如何使用的。很多人对唯一和非唯一索引非聚集索引的认识都不是很清晰。事实上,SQL Server在存储上这2类索引有着本质的区别,这些区别...
阅读全文
摘要:当我们进行SQL Server问题处理的时候,有时候会发现一个很有意思的现象:SQL Server完全忽略现有定义好的非聚集索引,直接使用表扫描来获取数据。我们来看看下面的表和索引定义: 1 CREATE TABLE Customers 2 ( 3 CustomerID INT NOT NUL...
阅读全文