【发布时间】:2011-10-24 00:06:34
【问题描述】:
我正在尝试重写的原始查询:
SELECT Table1.*
FROM Table1
INNER JOIN Table2 ON Table2.[IDENTITY]=Table1.ID
WHERE Table2.Field1 = @value AND Table2.Field2 = '1' AND Table1.ID in
(
select Table1.ID from Table1 where Table1.Number in
(select Table1.Number from Table1 where Table1.ID=@ID)
)
注意:在实际查询中,我列出了所有列,而不是使用 Table1.*
这个查询有点令人困惑,特别是因为我更改了名称等以进行发布。简而言之,它需要获取传入的 ID 并查找具有该 ID 的所有 Table1.Number 字段。 Number 和 ID 之间存在多对一的关系。因此,一旦找到所有数字,我就需要找到使用任何这些数字的 ID 的总列表。
当我运行查询时查看统计信息时,我得到了
Table 'Table1'. Scan count 3873, logical reads 135255, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Table 'Table2'. Scan count 0, logical reads 7995, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
我觉得罪魁祸首是嵌套子查询。一段时间以来,我一直在尝试以不同的方式编写此代码,但我似乎无法完全弄清楚。我将第二个嵌套查询重写为:
WHERE Table2.Field1 = @value AND Table2.Field2 = '1' AND Table1.ID in
(
select Table1.ID from Table1
INNER JOIN Table1 AS Table3 ON Table1.Number = Table3.Number
where Table3.MessageID=@ID
)
不幸的是,这导致了相同的统计数据。我不太清楚如何删除第二个“in”语句。
这是最好的方法吗?有更好的吗?这种子查询在性能方面非常糟糕,因此会导致 IO 统计数据显示给我的高扫描和逻辑读取,我对吗?
编辑:原始查询使用 Table2.[IDENTITY]=Table1.MessageID。那应该是 Table2.[IDENTITY]=Table1.ID。我已更新上述查询以反映这一点。
【问题讨论】: