我正試圖跟蹤是否需要更新某些表。我有一個事件表,我想監視更改,並有另一個名爲DictionaryRefresh的表,它跟蹤對該表所做的更改。如果事件表被編輯,它的編輯時間將被保存並比DictionaryRefresh表的上一次刷新時間晚,因此表示需要刷新。另外,如果將新行添加到Events表中,那麼還需要在DictionaryRefresh表中關聯新條目 - 因此是LEFT JOIN。優化涉及IF EXISTS的SQL
這裏是表結構
CREATE TABLE [dbo].[DictionaryRefresh]
(
[LookupKey] [varchar](31) NOT NULL,
[LookupValue] [varchar](255) NOT NULL,
[RecordNumber] [int] NULL,
[RefreshTime] [datetime] NULL,
[EventKey] [varchar](31) NULL,
[MappedLookupKey] [varchar](31) NULL
) ON [PRIMARY]
的指標(按照用到dbengine優化顧問)
CREATE NONCLUSTERED INDEX [idx_DictionaryRefresh2146B4EB]
ON [dbo].[Ifx_DictionaryRefresh] ([LookupKey] ASC)
CREATE NONCLUSTERED INDEX [idx_DictionaryRefresh51EC6492]
ON [dbo].[Ifx_DictionaryRefresh] ([MappedLookupKey] ASC, [RefreshTime] ASC, [RecordNumber] ASC, [EventKey] ASC)
CREATE NONCLUSTERED INDEX [idx_DictionaryRefreshFCDAD7FA]
ON [dbo].[Ifx_DictionaryRefresh] ([LookupValue] ASC)
事件表如下:
CREATE TABLE [dbo].[Events](
[RecordNumber] [int] NOT NULL,
...
[EventKey] [varchar](31) NOT NULL,
...
[EditTime] [datetime] NULL,
...
PRIMARY KEY CLUSTERED([RecordNumber] ASC)
CREATE NONCLUSTERED INDEX [idxEvents299ADAC8]
ON [dbo].[Events]([EditTime] ASC)
CREATE NONCLUSTERED INDEX [idxEvents5B151A5E]
ON [dbo].[Events]([EventKey] ASC)
現在SQL我正在運行如下 - 它需要幾分鐘才能返回。如果我只執行子查詢,它會立即返回。
IF EXISTS (
SELECT 1
FROM (
SELECT
e.EventKey AS DictionaryKey
,ISNULL(e.EditTime, '1 Jan 1900 01:00') AS EditTime
,e.RecordNumber AS DictionaryRecordNumber
FROM Events e) d
LEFT JOIN DictionaryRefresh r ON r.RecordNumber = DictionaryRecordNumber
AND r.EventKey = DictionaryKey
AND r.MappedLookupKey = 'M18E2I501'
WHERE r.RefreshTime < d.EditTime
OR r.RecordNumber IS NULL)
BEGIN
PRINT 'TRUE'
END
有大約130K行的DictionaryRefresh
表,約8K排在Events
表
當DictionaryRefresh
表是空的或小的速度非常快,但下降變緩行的數DictionaryRefresh增加,特別是如果沒有符合標準。
這是執行計劃。
和突出的統計數據(該指數以尋求94%的成本 - 訪問行的數量實際上是在活動表中的行數的平方)...
我曾嘗試
IF EXISTS
與
更換IF (SELECT COUNT ...) <> 0
以及
IF (SELECT TOP 1 1 ...) = 1
,但似乎沒有任何更快。
我當然會很感激你的任何建議。
在此先感謝。
小號
你有沒有嘗試過這樣的IF EXISTS(SELECT TOP 11 從事件Ë LEFT JOIN dictionaryrefresh [R R上。 RecordNumber = e.DictionaryRecordNumber AND r.EventKey = e.DictionaryKey AND r.MappedLookupKey = 'M18E2I501' WHERE r.RefreshTime
StackUser
請提供Events表的結構,就像Dictionaryrefresh – StackUser
Thx那樣。不幸的是,它花費了大致相同的時間。 –