我有一个简单的产品表,可以跟踪产品数据。大多数时候我不需要知道它是什么类型的产品,但每隔一段时间我就需要产品类型。既然不是所有产品都有一个类型(导致很多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
答案 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
字段。但是我会在决定之前测试这两种方法。
通常,我总是会在表上有一个聚簇索引。如果需要,我可以添加非聚集索引来调整特定查询。