У меня есть этот межсерверный запрос, который вставляет большое количество строк из нашей базы данных журналов в наше хранилище данных.Проблема в том, что сейчас работа выполняется более 15 часов.Нужно радикально уменьшить это.Нужен совет по наилучшему индексу для этого запроса или если какие-либо улучшения могут быть сделаны по самому запросу.Я думаю, индекс на URL, метка времени для fromDatabase и метка времени ID для toDatabase.Но не уверен, в каком порядке расположены ключевые столбцы, или я должен использовать включенные и т. Д. Вся помощь очень ценится.
SELECT @SQL = N'
INSERT INTO ' + @ToDatabase + '.dbo.Log
(
ImportDateTime
,ServerSource
,DatabaseSource
,Id
,Type
,UserName
,AppCode
,SubscriptionCode
,Duration
,ServiceNamespace
,ServiceName
,MethodName
,Parameters
,[Message]
,StackTrace
,Url
,UrlReferrer
,Browser
,BrowserVersion
,Platform
,Timestamp
,IpAddress
,EriAccountId
)
(
SELECT
''' + CONVERT(VARCHAR(50),@ImportDateTime) + '''
,''' + @ServerSource + '''
,''' + @DatabaseSource + '''
,Id
,Type
,UserName
,AppCode
,SubscriptionCode
,Duration
,ServiceNamespace
,ServiceName
,MethodName
,Parameters
,Message
,StackTrace
,Url
,UrlReferrer
,Browser
,BrowserVersion
,Platform
,Timestamp
,IpAddress
,EriAccountId
FROM (
select
Id
,Type
,UserName
,AppCode
,SubscriptionCode
,Duration
,ServiceNamespace
,ServiceName
,MethodName
,Parameters
,Message
,StackTrace
,Url
,UrlReferrer
,Browser
,BrowserVersion
,Platform
,Timestamp
,IpAddress
,EriAccountId
from openquery([' + @ServerSource + '],
''select
Id
,Type
,UserName
,AppCode
,SubscriptionCode
,Duration
,ServiceNamespace
,ServiceName
,MethodName
,[Parameters] = CONVERT(NVARCHAR(MAX),[Parameters])
,[Message]
,StackTrace
,Url
,UrlReferrer
,Browser
,BrowserVersion
,Platform
,Timestamp
,IpAddress
,EriAccountId
FROM ' + @FromDatabase + '.dbo.[Log] WITH (NOLOCK)
WHERE URL LIKE ''''http://online%'''' AND CONVERT(DATETIME2, TimeStamp) > ''''' + CONVERT(NVARCHAR(50),@AssessorDeploymentTimestamp) + ''''' AND CONVERT(DATETIME2,TimeStamp) > ''''' + CONVERT(NVARCHAR(50),@DateCollected) + ''''' '') o
WHERE NOT EXISTS
(SELECT 1
FROM ' + @ToDatabase + '.dbo.Log b
WHERE b.id = o.id
AND CONVERT(DATETIME2, b.TimeStamp) > ''' + CONVERT(NVARCHAR(50),@DateCollected) + '''
AND b.ServerSource = ''' + @ServerSource + '''
)
) a
)'