我有一些在LLBL慢預取的查詢。下面是生成的SQL的一個簡化版本:緩慢的子查詢IN子句?
SELECT DISTINCT
Column1
FROM
Table1
WHERE
Table1.Table2ID IN
(
SELECT Table2.Table2ID AS Table2ID
FROM
Table2
INNER JOIN Table1 ON Table2.Table2ID=Table1.Table2ID
INNER JOIN
(
SELECT DISTINCT
Table1.Table2ID AS Table2ID,
MAX(Table1.EffectiveDate) AS EffectiveDate
FROM Table1
WHERE Table1.EffectiveDate <= '2012-01-03 00:00:00:000'
GROUP BY Table1.Table2ID
) MaxEffective
ON
MaxEffective.Table2ID = Table1.Table2ID
AND MaxEffective.EffectiveDate = Table1.EffectiveDate
)
什麼我發現是,子查詢,執行快,如果我與實際結果替換子查詢,外部查詢速度快。但是在一起,它們很慢。
我已經跑數據庫引擎優化顧問這幫助了一點,但它仍然是相當緩慢。
我不是很熟練的理解執行計劃,但它似乎絕大多數的時間都花在做在表1的索引查找。
我預計,運行速度更快,因爲它是一個非相關子查詢。有什麼我只是沒有看到?
如果只是直接的SQL,我已經重寫了查詢,並做加盟,但我幾乎堅持了LLBL。有什麼設置可以用來強制它進行連接嗎?是否有一個原因SQL Server不會生成與連接相同的執行計劃?
編輯的實際查詢...
SELECT DISTINCT
ResidentialComponentValues.ResidentialComponentValueID AS ResidentialComponentValueId,
ResidentialComponentValues.ResidentialComponentTypeID AS ResidentialComponentTypeId,
ResidentialComponentValues.Value,
ResidentialComponentValues.Story,
ResidentialComponentValues.LastUpdated,
ResidentialComponentValues.LastUpdatedBy,
ResidentialComponentValues.ConcurrencyTimestamp,
ResidentialComponentValues.EffectiveDate,
ResidentialComponentValues.DefaultQuantity
FROM
ResidentialComponentValues
WHERE
ResidentialComponentValues.ResidentialComponentTypeID IN
(
SELECT ResidentialComponentTypes.ResidentialComponentTypeID AS ResidentialComponentTypeId
FROM
ResidentialComponentTypes INNER JOIN ResidentialComponentValues
ON ResidentialComponentTypes.ResidentialComponentTypeID=ResidentialComponentValues.ResidentialComponentTypeID
INNER JOIN
(
SELECT DISTINCT
ResidentialComponentValues.ResidentialComponentTypeID AS ResidentialComponentTypeId,
MAX(ResidentialComponentValues.EffectiveDate) AS EffectiveDate
FROM ResidentialComponentValues
WHERE ResidentialComponentValues.EffectiveDate <= '2012-01-03 00:00:00:000'
GROUP BY ResidentialComponentValues.ResidentialComponentTypeID
) LPA_E1
ON
LPA_E1.ResidentialComponentTypeId = ResidentialComponentValues.ResidentialComponentTypeID
AND LPA_E1.EffectiveDate = ResidentialComponentValues.EffectiveDate
)
編輯用於創建語句:
/****** Object: Table [dbo].[ResidentialComponentTypes] Script Date: 01/03/2012 13:49:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ResidentialComponentTypes](
[ResidentialComponentTypeID] [int] IDENTITY(1,1) NOT NULL,
[ComponentTypeName] [varchar](255) NOT NULL,
[LastUpdated] [datetime] NOT NULL,
[LastUpdatedBy] [varchar](50) NOT NULL,
[ConcurrencyTimestamp] [timestamp] NOT NULL,
[Active] [bit] NOT NULL,
CONSTRAINT [PK_ResidentialComponentTypes] PRIMARY KEY CLUSTERED
(
[ResidentialComponentTypeID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[ResidentialComponentValues] Script Date: 01/03/2012 13:49:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[ResidentialComponentValues](
[ResidentialComponentValueID] [int] IDENTITY(1,1) NOT NULL,
[ResidentialComponentTypeID] [int] NOT NULL,
[Value] [decimal](18, 3) NOT NULL,
[Story] [varchar](255) NOT NULL,
[LastUpdated] [datetime] NOT NULL,
[LastUpdatedBy] [varchar](50) NOT NULL,
[ConcurrencyTimestamp] [timestamp] NOT NULL,
[EffectiveDate] [datetime] NOT NULL,
[DefaultQuantity] [int] NOT NULL,
CONSTRAINT [PK_ResidentialComponentPrices] PRIMARY KEY CLUSTERED
(
[ResidentialComponentValueID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
CREATE NONCLUSTERED INDEX [_dta_index_ResidentialComponentValues_71_56543435__K1] ON [dbo].[ResidentialComponentValues]
(
[ResidentialComponentValueID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [_dta_index_ResidentialComponentValues_71_56543435__K1_2_3_4_5_6_7_8_9] ON [dbo].[ResidentialComponentValues]
(
[ResidentialComponentValueID] ASC
)
INCLUDE ([ResidentialComponentTypeID],
[Value],
[Story],
[LastUpdated],
[LastUpdatedBy],
[ConcurrencyTimestamp],
[EffectiveDate],
[DefaultQuantity]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [_dta_index_ResidentialComponentValues_71_56543435__K2_K1] ON [dbo].[ResidentialComponentValues]
(
[ResidentialComponentTypeID] ASC,
[ResidentialComponentValueID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [_dta_index_ResidentialComponentValues_71_56543435__K2_K8_K1] ON [dbo].[ResidentialComponentValues]
(
[ResidentialComponentTypeID] ASC,
[EffectiveDate] ASC,
[ResidentialComponentValueID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [_dta_index_ResidentialComponentValues_71_56543435__K2_K8_K1_3_4_5_6_7_9] ON [dbo].[ResidentialComponentValues]
(
[ResidentialComponentTypeID] ASC,
[EffectiveDate] ASC,
[ResidentialComponentValueID] ASC
)
INCLUDE ([Value],
[Story],
[LastUpdated],
[LastUpdatedBy],
[ConcurrencyTimestamp],
[DefaultQuantity]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
/****** Object: ForeignKey [FK_ResidentialComponentValues_ResidentialComponentTypes] Script Date: 01/03/2012 13:49:06 ******/
ALTER TABLE [dbo].[ResidentialComponentValues] WITH CHECK ADD CONSTRAINT [FK_ResidentialComponentValues_ResidentialComponentTypes] FOREIGN KEY([ResidentialComponentTypeID])
REFERENCES [dbo].[ResidentialComponentTypes] ([ResidentialComponentTypeID])
GO
ALTER TABLE [dbo].[ResidentialComponentValues] CHECK CONSTRAINT [FK_ResidentialComponentValues_ResidentialComponentTypes]
GO
我知道你說這是簡化的,但可能在內部和外部查詢之間有重複的別名。如果這樣做,那麼引擎可能會嘗試將其作爲相關子查詢來執行,而這可能會慢得多。 – JNK 2012-01-03 21:04:09
他們沒有別名,但也許直接引用表名是做同樣的事情。我會嘗試在子查詢中添加一個別名到Table1,看看是否有幫助。 – Dan 2012-01-03 21:09:53
@JNK - 這將打破*範圍*的所有規則,我無法想象這是真正的問題。 – MatBailie 2012-01-03 21:09:59