2013-08-07 51 views
1

我在两个模式 - 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)

我具有从表1中检索数据的查询,并且作为如下所示

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表中的索引?

我想了解上述行为。

在此先感谢。

+0

'我可以假设两个模式中的结果都匹配,只是'行数匹配?'我不会。 '如果schema2中的表有索引,那么结果是否会有所不同?'关于可能的顺序。检查执行计划以确认 –

回答

0

表1/Schema 1是一个堆表,您将插入一条记录添加到该表的末尾。当您查询该表时,记录是(但不计算它)按照它们插入的顺序返回。

表2/Schema 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 

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

+0

表名是相同的,但模式不同。所以它会是'SELECT * FROM SCEHMA1.TABLE1 EXCEPT SELECT * FROM SCHEMA2.TABLE1' –

+0

@Tobbi,我尝试了你的建议,并能够看到记录检索的区别。 它看起来像在第一个schema中 - schema1没有索引,记录在schema2中以非常随机的方式插入,记录按顺序排列。这就是记录检索不同的原因。 您的帖子非常有帮助,我将它作为首选答案。 – Sherlocked

+0

很高兴能够有所帮助:) – Tobbi

1

但是行的顺序是不一样的,我不知道如何将数据在两个

当然比较。您添加了聚簇索引 - 这意味着索引表根据索引进行存储。但没有ORDER BY子句,没有定义的顺序。

我不知道如何将数据在两个

比较使用ORDER BY条款,你想对数据进行排序。这将允许比较。

您发布应该以相同的顺序返回相应的行作为连接条件的查询是COL_1,所以不能肯定为什么问题。

+0

谢谢Oded。我使用不同列上的order by子句再次运行查询,并发现COL_1因为是主键而被排序。正如@Tobbi所建议的那样,这两个表格中的数据插入方式不同。 by子句添加订单后, 1 schema1,记录集有随机COL_1值(无序的方式) 2. SCHEMA2,记录集已下令COL_1值(因为它是聚集索引) 答案真的很有帮助。 – Sherlocked

0

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

同时可能提高查询性能的指标,应该不会导致不同的结果,因为它的存在而被退回。

至于假设等同的结果只是因为行数匹配,我认为你正在设置自己的麻烦。

+0

1.我尝试了你的建议。我添加了ORDER BY子句,并能够看到记录检索中的差异。 2.我尝试了Tobbi的建议,比较数据。看起来两个表都有相同的记录集,但它们的插入顺序是不同的(非索引表具有col_1的随机记录插入) 答案非常有帮助。谢谢@Michael Goldshteyn – Sherlocked

相关问题