我有两个模式的两个表 - 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/'
当我在两个模式中运行此查询时,我得到的检索行数相同。 但行的顺序并不相同,我不知道如何比较两者中的数据。
我的问题。
- 我可以假设两个模式中的结果都匹配,只是'因为行数匹配吗?
- 如果因为schema2中的表中有索引,结果会有所不同吗?
醇>
我想了解上述行为。
提前致谢。
答案 0 :(得分:1)
但是行的顺序不一样,我不知道如何比较两者中的数据
当然。您添加了聚簇索引 - 这意味着索引表将根据索引进行排序。但是没有ORDER BY
子句,就没有定义顺序。
我不知道如何比较两者中的数据
使用ORDER BY
子句按您的意愿订购数据。这将允许进行比较。
您发布的查询应按照与COL_1
上的加入条件相同的顺序返回相应的行,因此不能确定问题的原因。
答案 1 :(得分:0)
返回的订单不一样,因为您没有ORDER BY
子句。没有一个,返回行的顺序是实现定义的,你不应该做任何假设。
索引虽然可能会提高查询的性能,但不应该因为它的存在而导致返回不同的结果。
至于因为行数匹配而假设等效的结果,我认为你正在为自己设置麻烦。
答案 2 :(得分:0)
表1 / Schema 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
如果没有从这两个查询返回任何记录,则表格是相同的。 如果你有"更新/创建"允许不同的列或标识列,然后列出要在所有查询中比较的列。