Я создал несколько совершенно пустых таблиц, в которых были только столбцы, необходимые для выполнения ваших запросов:
CREATE TABLE [dbo].[inner_table](
[outerid] [int] NOT NULL
)
CREATE TABLE [dbo].[other_inner_table](
[outerid] [int] NOT NULL,
[amount] [int] NOT NULL
)
CREATE TABLE [dbo].[outer_table](
[id] [int] NOT NULL,
[name] [varchar](30) NOT NULL
)
Затем я включил планы выполнения и выполнил оба запроса.В обоих случаях это показало, что все 3 таблицы были отсканированы (как и ожидалось, без / с низкими строками).В частности, сканирование по inner_table
имеет предикат:
[DBName].[dbo].[inner_table].[outerid] as [i1].[outerid]=[@outerid]
, а сканирование по other_inner_table
имеет предикат:
[DBName].[dbo].[other_inner_table].[outerid] as [i2].[outerid]=[@outerid]
То есть в первомНапример, оптимизатор определил, что условие внешних условий where в where o.id = @outerid
подразумевает, что в подзапросах o.id
всегда равно @outerid
, и выполнил эту замену.
В общем, если толькоесть проблема с производительностью, вы не должны пытаться «помочь» SQL, преобразовывая запросы вручную.Имеется что-то вроде 300 различных оптимизаций, которые оптимизатор имеет в своем распоряжении - вы можете не выбрать лучший (ие).