什么查询更好用,为什么? (描述中的例子)

时间:2018-03-26 09:59:19

标签: sql sql-server sql-server-2012 sql-execution-plan

我在第一个例子中做了一个查询,但是我的高级同事再次向我重新说我不对,我应该在第二个例子中做。这是示例结构,您可能会对该结构感到困惑,但我们真的必须创建一个非规范化表,这就是为什么 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'

enter image description here

1 个答案:

答案 0 :(得分:2)

假设两个查询都返回相同的结果并且在表之间重复列值,请设想两个相反的场景:

  • Table1有100行,Table3有100万行。在这种情况下,直接搜索Table1并进行100次字符串比较应该比访问Table3的索引并再进行2次索引扫描更快。

  • Table1有1000万行,Table3有10行。在这种情况下,过滤Table3的行并通过其ID 访问Table2和Table1应该比扫描和过滤所有Table1更快。但是,如果Table1的99%的行具有带有“SomeText”值的搜索列,该怎么办?

两个查询都有效,但性能会因行值和列值的选择性而异,我认为没有完全正确或错误的方法。