翻譯(九)——Clustered Indexes: Stairway to SQL Server Indexes Level 3

原文鏈接:www.sqlservercentral.com/articles/Stairway+Series/72351/

Clustered Indexes: Stairway to SQL Server Indexes Level 3

By David Durant, 2013/01/25 (first published: 2011/06/22)

The Series

本文是階梯系列的一部分:SQL Server索引的階梯。

索引是數據庫設計的基礎,并告訴開發人員使用數據庫大量關于設計者的意圖。不幸的是,當性能問題出現時,索引常常會作為事后考慮添加。這里最后是一系列簡單的文章,應該能讓數據庫專業人員快速地與它們同步。

前面的水平在這樓梯概述指標一般和專門的非聚集索引。它總結了以下關鍵的SQL服務器索引概念。當請求到達數據庫時,無論是SELECT語句還是插入、UPDATE或刪除語句,SQL Server只有三種可能的方式訪問語句中引用的表的數據:

訪問只是非聚集索引,避免訪問表。只有在索引包含查詢所請求的這個表的所有數據時,才有可能。

使用搜索鍵(s)訪問索引,然后使用所選的書簽訪問表的各個行。

忽略索引并搜索所請求行的表。

這個級別從上面列表中的第三個選擇開始,搜索表。反過來,這將引導我們討論聚集索引;在第2級提到的主題,但沒有包括在內。

初級AdventureWorks數據庫表我們將在這個級別使用的是salesorderdetail表。在121317行中,它足以說明表上有聚集索引的一些好處。而且,有兩個外鍵,它很復雜,足以說明您必須對集群索引做出的一些設計決策。

Sample Database

雖然我們已經在第1級討論了示例數據庫,但現在仍在重復。在整個樓梯中,我們將用例子來說明概念。這些例子都是基于微軟的AdventureWorks示例數據庫。我們專注于銷售訂單。表五將給我們一個很好的組合交易與非交易數據;客戶、銷售人員、產品、salesorderheader,和salesorderdetail。為了使事情集中,我們使用列的一個子集。因為是標準化的銷售人員中,信息被分解成三個表:銷售人員,員工和接觸。

在整個階梯中,我們使用以下兩個術語,即一行互換的單行項:“行項目”和“訂單詳細信息”。前者是比較常見的業務術語;在AdventureWorks表的名稱出現后。

完整的一組表及其之間的關系如圖1所示。

Clustered Indexes

我們開始問這樣的問題:有多少工作需要找到一個排(S)表中如果非聚集索引是不使用?搜索請求行的表是否意味著掃描無序表中的每一行?或者SQL Server永久序列表中的行,它可以快速的搜索關鍵字訪問它們,正如它快速訪問搜索關鍵非聚集索引的條目?答案取決于是否指示SQL Server在表上創建聚集索引。

與非聚集索引,這是一個分離的對象占用的空間,聚集索引的表是一樣的。通過創建聚集索引,您指示SQLServer將表的行排序為索引鍵序列,并在將來的數據修改期間維護該序列。即將出現的級別將查看生成的內部數據結構,以完成此任務。但是現在,將聚集索引看作是一個已排序的表。給定一行的索引鍵值,SQL Server可以快速訪問該行,并可以從該行的表中連續地進行訪問。

出于演示的目的,我們創建了兩個本例表,salesorderdetail;沒有指標和一個聚簇索引。對于索引的鍵列,我們設計師的adventureworksdatabase做出了同樣的選擇:SalesOrderID / salesorderdetailid。清單1中的代碼對SalesOrderDetail表復印件。我們可以隨時重新運行這個代碼,我們希望從一個“干凈的石板”開始。

IF EXISTS (SELECT * FROM sys.tables 
WHERE OBJECT_ID = OBJECT_ID('dbo.SalesOrderDetail_index'))
DROP TABLE dbo.SalesOrderDetail_index;
GO
IF EXISTS (SELECT * FROM sys.tables 
WHERE OBJECT_ID = OBJECT_ID('dbo.SalesOrderDetail_noindex'))
DROP TABLE dbo.SalesOrderDetail_noindex;
GO

SELECT * INTO dbo.SalesOrderDetail_index FROM Sales.SalesOrderDetail;

SELECT * INTO dbo.SalesOrderDetail_noindex FROM Sales.SalesOrderDetail;

GO

?

CREATE CLUSTERED INDEX IX_SalesOrderDetail

ON dbo.SalesOrderDetail_index (SalesOrderID, SalesOrderDetailID)

GO

?

Listing 1: Create copies of the SalesOrderDetail table

所以,假設SalesOrderDetail表看起來像這樣在創建聚集索引:

在創建上面顯示的聚集索引之后,生成的表/聚集索引將如下所示:

你看上面的示例數據,你會發現每個salesorderdetailid值是唯一的。Do not be confused; SalesOrderDetailID is not the primary key of the table. 對salesorderdetailid SalesOrderID /組合是表的主鍵;以及聚集索引的索引鍵。

Understanding the Basics of Clustered Indexes

每個表最多可以有一個聚集索引。表的行只能在一個序列中。您需要決定什么順序(如果有的話)對每一個表最好,如果可能的話,在表充滿數據之前,創建聚集索引。做這個決定時,要記住,排序不僅意味著訂貨,還意味著分組;如按銷售訂單分組行項。

這就是為什么在adventureworksdatabase設計師選擇在SalesOrderID salesorderdetailid為SalesOrderDetail表的順序;它是商品的自然順序。

例如,如果用戶請求一個訂單的行項,他們通常會請求該訂單的所有行項目。一個典型的銷售訂單表格告訴我們,訂單的打印副本總是包含所有的行項。銷售訂單業務的性質是按銷售訂單對生產線項目進行分組。有可能從倉庫想要的產品而不是銷售訂單行項目偶爾觀要求;但大多數的請求;如從銷售人員或客戶,或該程序打印發票,或一個查詢,計算每個訂單的總價值;需要所有的行項目對于任何給定的銷售訂單。

然而,用戶需求本身并不能決定什么是最好的聚集索引。本系列中的未來級別將涵蓋索引的內部;因為索引的某些內部方面也會影響您選擇的聚集索引列。

Heaps

??? 如果表上沒有聚集索引,則該表稱為堆。每個表要么是堆,要么是聚集索引。所以,雖然我們經常認為每個指標分為兩種類型之一,聚集或非聚集;需要注意的是,每一個表分成兩個類型同樣重要;它是一個聚集索引或是一堆。開發人員經常說表“有”或“沒有”聚集索引,但是說表“是”或“不是”是一個更有意義的聚集索引。

有SQL Server搜索一堆當尋找行只有一個方法(不包括非聚集索引的使用),這是開始在表中的第一行并進行表直到所有的行被讀取。沒有序列,沒有搜索鍵,無法快速導航到特定行。

Comparing a Clustered Index with a Heap

??? 評價一個聚集索引和一堆的性能,使兩份清單1的salesorderdetailtable。一份是堆版,另一方面,我們創造了相同的聚集索引,即對原表(SalesOrderID,SalesOrderDetailID)。既有非聚集索引的表。

我們將對表的每一個版本執行相同的三個查詢;一個檢索單個行,一個檢索一個訂單的所有行,另一個查詢單個產品的所有行。我們在下面的表中展示了SQL和每個執行的結果。

我們的第一個查詢檢索一行,執行細節如表1所示。

我們的第二個查詢檢索單個銷售訂單的所有行,您可以在表2中看到執行細節。

我們的第三查詢檢索單個產品的所有行,執行結果如表3所示。

我們的第一個查詢大大受益于聚集索引的存在;第三是大致相等的。聚集索引是否有危害?答案是肯定的,它主要與插入、更新和刪除行有關。就像在早期階段遇到的索引的許多其他方面一樣,它也是一個更高層次更詳細地討論的主題。

一般來說,檢索的好處大于維修的危害;使聚集索引比一堆。如果在Azure數據庫中創建表,則沒有選擇;每個表必須是一個聚集索引。

Conclusion

聚集索引是一個排序表,它在索引創建時由您指定,由SQLServer維護。該表中的任何行都可以很快地訪問它的鍵值。索引鍵序列中的任何一組行,也可以在鍵的范圍內快速訪問。

每個表只能有一個聚集索引。哪些列應該是聚集索引鍵列的決定是您對任何表所作的最重要的索引決策。

在我們的第4級中,我們將重點從邏輯到物理,引入頁面和范圍,并檢查索引的物理結構。

?

Downloadable Code

  • Clustered.SQL

?

轉載于:https://www.cnblogs.com/Angular-JS/p/7881621.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/390758.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/390758.shtml
英文地址,請注明出處:http://en.pswp.cn/news/390758.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

power bi 中計算_Power BI中的期間比較

power bi 中計算Just recently, I’ve come across a question on the LinkedIn platform, if it’s possible to create the following visualization in Power BI:就在最近,我是否在LinkedIn平臺上遇到了一個問題,是否有可能在Power BI中創建以下可視化…

-Hive-

Hive定義 Hive 是一種數據倉庫技術,用于查詢和管理存儲在分布式環境下的大數據集。構建于Hadoop的HDFS和MapReduce上,用于管理和查詢分析結構化/非結構化數據的數據倉庫; 使用HQL(類SQL語句)作為查詢接口;使用HDFS作…

CentOS 7 安裝 JDK

2019獨角獸企業重金招聘Python工程師標準>>> 1、下載oracle jdk 下載地址: http://www.oracle.com/technetwork/java/javase/downloads/index.html 選擇同一協議,下載rpm格式版本jdk,或tar.gz格式jdk。 2、卸載本機openjdk 2.1、查…

javascript 布爾_JavaScript布爾說明-如何在JavaScript中使用布爾

javascript 布爾布爾型 (Boolean) Booleans are a primitive datatype commonly used in computer programming languages. By definition, a boolean has two possible values: true or false.布爾值是計算機編程語言中常用的原始數據類型。 根據定義,布爾值有兩個…

如何進行數據分析統計_對您不了解的數據集進行統計分析

如何進行數據分析統計Recently, I took the opportunity to work on a competition held by Wells Fargo (Mindsumo). The dataset provided was just a bunch of numbers in various columns with no indication of what the data might be. I always thought that the analys…

經典:區間dp-合并石子

題目鏈接 :http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid737 這個動態規劃的思是,要得出合并n堆石子的最優答案可以從小到大枚舉所有石子合并的最優情況,例如要合并5堆石子就可以從,最優的23和14中得到最佳的答案。從兩堆…

常見排序算法_解釋的算法-它們是什么以及常見的排序算法

常見排序算法In its most basic form, an algorithm is a set of detailed step-by-step instructions to complete a task. For example, an algorithm to make coffee in a french press would be:在最基本的形式中,算法是一組完成任務的詳細分步說明。 例如&…

020-Spring Boot 監控和度量

一、概述 通過配置使用actuator查看監控和度量信息 二、使用 2.1、建立web項目&#xff0c;增加pom <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> 啟動項目&a…

matplotlib布局_Matplotlib多列,行跨度布局

matplotlib布局For Visualization in Python, Matplotlib library has been the workhorse for quite some time now. It has held its own even after more nimble rivals with easier code interface and capabilities like seaborn, plotly, bokeh etc. have arrived on the…

Hadoop生態系統

大數據架構-Lambda Lambda架構由Storm的作者Nathan Marz提出。旨在設計出一個能滿足實時大數據系統關鍵特性的架構&#xff0c;具有高容錯、低延時和可擴展等特性。Lambda架構整合離線計算和實時計算&#xff0c;融合不可變性&#xff08;Immutability&#xff09;&#xff0c…

javascript之 原生document.querySelector和querySelectorAll方法

querySelector和querySelectorAll是W3C提供的 新的查詢接口&#xff0c;其主要特點如下&#xff1a; 1、querySelector只返回匹配的第一個元素&#xff0c;如果沒有匹配項&#xff0c;返回null。 2、querySelectorAll返回匹配的元素集合&#xff0c;如果沒有匹配項&#xff0c;…

RDBMS數據定時采集到HDFS

[toc] RDBMS數據定時采集到HDFS 前言 其實并不難&#xff0c;就是使用sqoop定時從MySQL中導入到HDFS中&#xff0c;主要是sqoop命令的使用和Linux腳本的操作這些知識。 場景 在我們的場景中&#xff0c;需要每天將數據庫中新增的用戶數據采集到HDFS中&#xff0c;數據庫中有tim…

單詞嵌入_神秘的文本分類:單詞嵌入簡介

單詞嵌入Natural language processing (NLP) is an old science that started in the 1950s. The Georgetown IBM experiment in 1954 was a big step towards a fully automated text translation. More than 60 Russian sentences were translated into English using simple…

使用Hadoop所需要的一些Linux基礎

Linux 概念 Linux 是一個類Unix操作系統&#xff0c;是 Unix 的一種&#xff0c;它 控制整個系統基本服務的核心程序 (kernel) 是由 Linus 帶頭開發出來的&#xff0c;「Linux」這個名稱便是以 「Linus’s unix」來命名的。 Linux泛指一類操作系統&#xff0c;具體的版本有&a…

python多項式回歸_Python從頭開始的多項式回歸

python多項式回歸Polynomial regression in an improved version of linear regression. If you know linear regression, it will be simple for you. If not, I will explain the formulas here in this article. There are other advanced and more efficient machine learn…

《Linux命令行與shell腳本編程大全 第3版》Linux命令行---4

以下為閱讀《Linux命令行與shell腳本編程大全 第3版》的讀書筆記&#xff0c;為了方便記錄&#xff0c;特地與書的內容保持同步&#xff0c;特意做成一節一次隨筆&#xff0c;特記錄如下&#xff1a; 《Linux命令行與shell腳本編程大全 第3版》Linux命令行--- Linux命令行與she…

徹底搞懂 JS 中 this 機制

徹底搞懂 JS 中 this 機制 摘要&#xff1a;本文屬于原創&#xff0c;歡迎轉載&#xff0c;轉載請保留出處&#xff1a;https://github.com/jasonGeng88/blog 目錄 this 是什么this 的四種綁定規則綁定規則的優先級綁定例外擴展&#xff1a;箭頭函數this 是什么 理解this之前&a…

?如何在2分鐘內將GraphQL服務器添加到RESTful Express.js API

You can get a lot done in 2 minutes, like microwaving popcorn, sending a text message, eating a cupcake, and hooking up a GraphQL server.您可以在2分鐘內完成很多工作&#xff0c;例如微波爐爆米花&#xff0c;發送短信&#xff0c; 吃蛋糕以及連接GraphQL服務器 。 …

leetcode 1744. 你能在你最喜歡的那天吃到你最喜歡的糖果嗎?

給你一個下標從 0 開始的正整數數組 candiesCount &#xff0c;其中 candiesCount[i] 表示你擁有的第 i 類糖果的數目。同時給你一個二維數組 queries &#xff0c;其中 queries[i] [favoriteTypei, favoriteDayi, dailyCapi] 。 你按照如下規則進行一場游戲&#xff1a; 你…

回歸分析_回歸

回歸分析Machine learning algorithms are not your regular algorithms that we may be used to because they are often described by a combination of some complex statistics and mathematics. Since it is very important to understand the background of any algorith…