我在第一个例子中做了一个查询,但是我的高级同事再次向我重新说我不对,我应该在第二个例子中做。这是示例结构,您可能会对该结构感到困惑,但我们真的必须创建一个非规范化表,这就是为什么 dbo.Table1.Column3 = dbo.Table3.Column2。我看了进入执行计划并怀疑他的言论。
我理解有关索引扫描的部分,但我认为在这种情况下我可以像第一个例子那样进行查询
有人可以解释我谁是对的,为什么?
结构示例
CREATE TABLE dbo.Table1 // Contains more than 100 000 rows
(
Table1_ID int NOT NULL PRIMARY KEY,
Column1 varchar(100),
Column2 varchar(100),
Column3 varchar(100),
Table2_ID int,
...
)
CREATE TABLE dbo.Table2 // Contains more than 100 000 rows
(
Table2_ID int NOT NULL PRIMARY KEY,
Column1 varchar(100),
Column2 varchar(100),
Table3_ID int,
...
)
CREATE TABLE dbo.Table3 // Contains 2 rows
(
Table3_ID int NOT NULL PRIMARY KEY,
Column1 varchar(100),
Column2 varchar(100)
)
CREATE UNIQUE NONCLUSTERED INDEX [IXU_Table3_Column2] ON [dbo].[Table3]
(
[Column2] ASC
)
WHERE ([Column2] IS NOT NULL AND [Column2]<>'')
第一个例子
SELECT *
FROM dbo.Table1
WHERE Column3 = 'SomeText'
2d示例
SELECT t1.*
FROM dbo.Table1 t1
JOIN dbo.Table2 t2 ON t2.ID = t1.Table2_ID
JOIN dbo.table3 t3 ON t3.ID = t2.Table3_ID AND t3.Column2 = 'SomeText'
答案 0 :(得分:2)
假设两个查询都返回相同的结果并且在表之间重复列值,请设想两个相反的场景:
Table1有100行,Table3有100万行。在这种情况下,直接搜索Table1并进行100次字符串比较应该比访问Table3的索引并再进行2次索引扫描更快。
Table1有1000万行,Table3有10行。在这种情况下,过滤Table3的行并通过其ID 访问Table2和Table1应该比扫描和过滤所有Table1更快。但是,如果Table1的99%的行具有带有“SomeText”值的搜索列,该怎么办?
两个查询都有效,但性能会因行值和列值的选择性而异,我认为没有完全正确或错误的方法。