Sql server 索引和执行计划

Sql server 索引和执行计划,sql-server,sql-server-2008,sql-server-2012,Sql Server,Sql Server 2008,Sql Server 2012,我知道聚集索引决定了表中数据的物理顺序,所以我创建了两个临时表来检查记录的物理顺序 CREATE TABLE #My_table_1 ( ID INT, COL1 INT, COL2 VARCHAR(20) UNIQUE, COL3 VARCHAR(20) ); CREATE CLUSTERED INDEX IX_Employee ON #My_table_1 (ID, COL1 DESC) INSERT INTO #My_table_

我知道聚集索引决定了表中数据的物理顺序,所以我创建了两个临时表来检查记录的物理顺序

CREATE TABLE #My_table_1
  (
     ID   INT,
     COL1 INT,
     COL2 VARCHAR(20) UNIQUE,
     COL3 VARCHAR(20)
  );

CREATE CLUSTERED INDEX IX_Employee
  ON #My_table_1 (ID, COL1 DESC)

INSERT INTO #My_table_1 VALUES (1,10,'10','10');
INSERT INTO #My_table_1 VALUES (2,520,'20','10');
INSERT INTO #My_table_1 VALUES (3,50,'30','10');
INSERT INTO #My_table_1 VALUES (5,55,'65','10');    
INSERT INTO #My_table_1 VALUES (1,5,'100','10');            
INSERT INTO #My_table_1 VALUES (3,300,'50','10');
INSERT INTO #My_table_1 VALUES (3,40,'5','10');
INSERT INTO #My_table_1 VALUES (1,15,'4','10');
INSERT INTO #My_table_1 VALUES (5,100,'56','10');

CREATE TABLE #My_table_2
  (
     ID   INT,
     COL1 INT,
     COL2 VARCHAR(20) UNIQUE,
  ) 

CREATE CLUSTERED INDEX IX_Employee
  ON #My_table_2 (ID, COL1 DESC) --Creating a CLUSTERED INDEX on columns ID,COL1

INSERT INTO #My_table_2 VALUES (1,10,'10');
INSERT INTO #My_table_2 VALUES (2,520,'20');
INSERT INTO #My_table_2 VALUES (3,50,'30');
INSERT INTO #My_table_2 VALUES (5,55,'65'); 
INSERT INTO #My_table_2 VALUES (1,5,'100');         
INSERT INTO #My_table_2 VALUES (3,300,'50');
INSERT INTO #My_table_2 VALUES (3,40,'5');
INSERT INTO #My_table_2 VALUES (1,15,'4');
INSERT INTO #My_table_2 VALUES (5,100,'56');
当我查询这两个表时,我发现两个表中记录的顺序不同。为什么会这样? 所以我检查了执行计划,因为查询执行计划不同。
谁能解释一下,为什么会发生这种事?我对聚集索引的理解是否错误?

我相信你对聚集索引的理解是正确的。这是您对SQL Server优化器、统计信息和排序的理解

如果查询优化器决定使用更好的方法,它可以随意忽略任何索引(甚至是暗示的索引)。更好的方法是使用各种信息确定的——整本书都涵盖了这些信息——关于数据的选择性、数据类型、表的大小、列的数量等。即使对于聚集索引,索引中也只保留指定的数据;仍然必须对剩余的数据列进行查找。与仅仅进行表扫描相比,查找这些单独的数据列的成本是多少


最后,数据不能保证以任何顺序返回。当使用聚集索引时,它可能恰好与物理顺序匹配,但这不是有意的。这是副作用。以已知的顺序方式返回数据的唯一方法是使用ORDER BY。

我相信您对聚集索引的理解是正确的。这是您对SQL Server优化器、统计信息和排序的理解

如果查询优化器决定使用更好的方法,它可以随意忽略任何索引(甚至是暗示的索引)。更好的方法是使用各种信息确定的——整本书都涵盖了这些信息——关于数据的选择性、数据类型、表的大小、列的数量等。即使对于聚集索引,索引中也只保留指定的数据;仍然必须对剩余的数据列进行查找。与仅仅进行表扫描相比,查找这些单独的数据列的成本是多少


最后,数据不能保证以任何顺序返回。当使用聚集索引时,它可能恰好与物理顺序匹配,但这不是有意的。这是副作用。以已知顺序方式返回数据的唯一方法是使用ORDER BY。

您是如何确定顺序的?由于select不提供顺序,因此它会按照SQL Server认为合适的顺序提供结果。如果您想要订单,请添加ORDERBY子句。您是如何确定订单的?由于select不提供顺序,因此它会按照SQL Server认为合适的顺序提供结果。如果需要订单,请添加ORDERBY子句。