【问题标题】:How does index affect the result of two tables - one with index and another without index?索引如何影响两个表的结果 - 一个有索引,另一个没有索引?
【发布时间】:2013-08-07 17:05:40
【问题描述】:

我在两个模式中有两个表 - schema1 和 schema2。 这两个表具有相同的设计,只是 Schema2 在表的主键上有一个聚集索引。

Schema1 表没有主键(这就是旧设计的方式,我必须使用新的架构设计来改进它,即 schema2)

在模式 2 中, COL_1 是 table1 的主键, (COL_4, COL_12 ) 是 table2 的索引键。

表 1 (col_1, col_2, col_3, col_4 ... col_10) 表 2(col_1,col_4,col_12, .... col_20)

我有一个从table1中检索数据的查询,如下

SELECT t1.COL_1,t1.COL_2, t1.COL_3, t1.COL_4,t1.COL_5 
FROM table1 t1
LEFT JOIN table2 t2 ON
     t2.COL_1 = t1.COL_1,
     AND t2.COL_4 = t1.COL_4
WHERE 
     t1.col_10 = '/some string/'

当我在两种模式中运行此查询时,我得到的检索行数相同。 但是行的顺序不一样,我不知道如何比较两者中的数据。

我的问题。

  1. 我可以假设两个模式中的结果都匹配,只是因为行数匹配?
  2. 如果因为 schema2 中的表中有索引,结果会有所不同吗?

我想了解上述行为。

提前致谢。

【问题讨论】:

  • Can I assume that both the results in the two schemas match, just 'coz the rowcount match ? 我不会。 Do the results differ if since there is index in the tables in schema2 ? 关于订单大概。检查执行计划确认

标签: sql sql-server-2008 select clustered-index


【解决方案1】:

但行的顺序不一样,我不知道如何比较两者中的数据

当然。您添加了一个聚集索引 - 这意味着索引表是根据索引排序的。但是如果没有ORDER BY 子句,就没有定义顺序。

我不知道如何比较两者的数据

使用ORDER BY 子句根据需要对数据进行排序。这将允许进行比较。

您发布的查询应该以与您的连接条件在COL_1 上相同的顺序返回相应的行,所以不太确定问题的原因。

【讨论】:

  • 感谢奥德。我在不同的列上使用 order by 子句再次运行查询,发现 COL_1 是有序的,因为它是主键。正如@Tobbi 建议的那样,两个表中的数据插入方式不同。添加 order by 子句后,1. 在 schema1 中,记录集有随机的 COL_1 值(无序方式) 2. 在 schema2 中,记录集有排序的 COL_1 值(因为它是聚集索引)答案真的很有帮助。跨度>
【解决方案2】:

表 1/模式 1 是一个堆表,您插入一条添加到该表末尾的记录。当您查询该表时,记录会(但不计算)以插入时的相同顺序返回。

表 2/模式 2 是一个聚集索引表,即当您将记录插入该表时,如果需要,它会插入到记录之间(或者如果新记录的主键大于所有其他现有的主键,则附加)。当您查询该表时,记录按主键的排序顺序返回(但不计入其中)。

如果您想比较这两个表并确定它们完全相同,您可以这样做(准备好,如果它是一张巨大的表,这将需要一段时间)。

-- show all records in table1 that do not exist in table2
select * from table1
except
select * from table2

反之亦然

-- show all records in table2 that do not exist in table1
select * from table2
except
select * from table1

如果这两个查询没有返回记录,则表是相同的。 如果您有“更新/创建”列或允许不同的标识列,则列出您希望在所有查询中比较的列。

【讨论】:

  • 表名相同但架构不同。所以应该是SELECT * FROM SCEHMA1.TABLE1 EXCEPT SELECT * FROM SCHEMA2.TABLE1
  • @Tobbi,我尝试了您的建议,并且能够看到记录检索的差异。看起来在第一个模式 - 没有索引的模式 1 中,记录以非常随机的方式插入,而在模式 2 中,记录以有序的方式插入。这就是记录检索差异的原因。您的帖子很有帮助,我将其作为首选答案。
  • 很高兴能帮上忙 :)
【解决方案3】:

返回的顺序不一样,因为你没有ORDER BY 子句。没有一个,返回行的顺序是实现定义的,你不应该做任何假设。

索引虽然可能提高查询的性能,但不应因为它的存在而导致返回不同的结果。

至于仅仅因为行数匹配就假设结果相同,我认为你是在自找麻烦。

【讨论】:

  • 1.我尝试了你的建议。我添加了 ORDER BY 子句,并且能够看到记录检索的差异。 2. 我尝试了 Tobbi 的建议,比较数据。看起来这两个表都有相同的记录集,但是它们插入的顺序不同(非索引表对 col_1 进行了随机记录插入)答案非常有帮助。谢谢@Michael Goldshteyn
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-07
  • 1970-01-01
  • 2016-04-28
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多