对于参考表,群集与非群集

时间:2018-04-10 02:41:03

标签: sql sql-server tsql indexing clustered-index

我有一个简单的产品表,可以跟踪产品数据。大多数时候我不需要知道它是什么类型的产品,但每隔一段时间我就需要产品类型。既然不是所有产品都有一个类型(导致很多NULL行),我需要一个参考表来加入产品类型。参考表使用复合密钥,我试图弄清楚主键应该是集群索引还是非集群索引。产品表的主键有一个聚簇索引,所以我想知道如果连接也是一个聚簇索引,那么连接是否会更有效(因此id的顺序是有序的)。或者在连接期间忽略这一点,因此非聚集会更有效,因为它不进行密钥查找?

CREATE TABLE [dbo].[sales_product_type]
(
    [FK_product_id] [int] NOT NULL,
    [product_type] [int] NOT NULL,
    [type_description] [nvarchar](max) NULL,

    CONSTRAINT [PK_sales_product_type] 
        PRIMARY KEY CLUSTERED ([FK_product_id] ASC, [product_type] 
) ON [PRIMARY]
GO

CREATE TABLE [dbo].[sales_product]
(
    [product_id] [int] IDENTITY(1,1) NOT NULL,
    [FK_store_id] [int] NOT NULL,
    [price] [int] NOT NULL,
    [product_name] [nvarchar](max) NOT NULL,
    [units] [int] NULL,

    CONSTRAINT [PK_sales_product] 
        PRIMARY KEY CLUSTERED ([product_id] ASC)
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

1 个答案:

答案 0 :(得分:1)

如果在查询产品类型时需要<!DOCTYPE html> <html> <meta charset="utf-8"/> <script type="text/javascript"> window.onload = function(){ var txtFile = new XMLHttpRequest(); txtFile.open("GET", "../HTML/Images/Bowl.txt", true); console.log(txtFile); txtFile.onload = function() { allText = txtFile.responseText; lines = txtFile.responseText.split("\n"); // Will separate each line into an array document.getElementById('myImage').src="../HTML/Images/"+lines[0]; </script> <body> <table class="centerTable" > <tr> <td> <div class="imgContainer"> <div> <img id="fullsize" /> <ul id="thumbs"> <img id="myImage" src="../HTML/Images/RDogbowl.png" style="width:100px"> </ul> </div> <div class="imgButton"> <button id="Bowl" >Toggle Color</button> </div> </div> </td> </table> </body> 列,则应使用聚簇索引。原因是聚簇索引将包含表的所有列(包括键列Product ID和Product Type)。

另一方面,如果您在产品ID和产品类型上只有非聚集索引,当您的查询需要获取[type_description]时,它必须对结果中的每个类型执行堆查找数据集。

因此,如果结果中需要type_description,则 应保留聚集索引。

但是,在您的特定情况下,如果type_description大于8000个字符,则无关紧要。正如here(和here)所讨论的那样,如果超过8000个字符,列的值将存储在行外。因此,无论如何,引擎必须执行查找才能获得该值。

如果您不打算经常查询type_description,那么使用非聚集索引可能会导致读取率降低 - 因为引擎不必越过type_description字段。但是我会在决定之前测试这两种方法。

通常,我总是会在表上有一个聚簇索引。如果需要,我可以添加非聚集索引来调整特定查询。