У меня есть представление в одной из моих баз данных, которое извлекает предыдущих и текущих офицеров (например, человека) из нескольких таблиц и представлений. Проблема в том, что эти записи связаны только по дате окончания (saoh.Date_TO), совпадающей с датой начала работы другого оперативного сотрудника (saoh.Date_FROM).
Чтобы создать соединение между этими записями, я в настоящее время делаю внешнее соединение с внутренним соединением внутри него. (Это можно увидеть в скрипте ниже). Проблема в том, что представление имеет ~ 3 миллиона записей. Это означает, что запрос этого представления занимает очень много времени (2-3 часа).
Есть ли у кого-нибудь предложения о том, как улучшить фундаментальный дизайн SQL ниже.
Дополнительная информация
Среда: MSSQL server 2008
Другая информация: Snapshot_Period — это инструмент для создания отчетов, не связанный с даты оперативника.
ALTER VIEW [dbo].[vw_Stage_Estate_Case_Officer_Source] AS
SELECT sp.SNAPSHOT_PERIOD_START_DATETIME,
sp.SNAPSHOT_PERIOD_END_DATETIME,
aes.APPLICATION_RID,
aes.ESTATE_RID,
aes.TRUSTEE_NUMBER,
aes.TRUSTEE_TYPE,
aes.TEAM_CODE,
saoh.POSITION,
saoh.DATE_FROM,
saoh.DATE_TO,
saoh.ERROR_CONDITION,
saoch.USER_ID as PRIOR_CASE_OFFICER
FROM Stage_App_Estate_Statuses aes
/*Standard snapshot period new join for MonthlyITS and yearlyTIS*/
INNER JOIN Stage_Snapshot_Period_New sp ON
change_date < sp.SNAPSHOT_PERIOD_END_DATETIME and
sp.SNAPSHOT_PERIOD_IS_FINALISED_INDICATOR = 'No'and
(sp.SNAPSHOT_PERIOD_TYPE_NAME = 'MonthlyITS' or sp.SNAPSHOT_PERIOD_TYPE_NAME = 'YearlyITS')
/*This should be inner joining to the staging table that links Case officers to team codes by region*/
INNER JOIN [DEV_STAGING].[dbo].[STAGE_STAF_ACTION_OFFICERS] saoh ON
aes.TEAM_CODE = saoh.POSITION AND LEFT(aes.ESTATE_RID,3) = LEFT(saoh.ACTION_OFFICER_RID,3)
/*This should be inner joining to App_Estate_Statues again to get the previous UserID*/
LEFT OUTER JOIN (SELECT staf.USER_ID,
staf.DATE_FROM,
staf.DATE_TO,
a.TEAM_CODE,
a.ESTATE_RID
FROM [DEV_STAGING].[dbo].[STAGE_STAF_ACTION_OFFICERS] staf
INNER JOIN Stage_App_Estate_Statuses a ON
a.TEAM_CODE = staf.POSITION) saoch ON
saoh.DATE_TO = saoch.DATE_FROM AND saoch.ESTATE_RID = aes.ESTATE_RID
GO
Определения таблиц Период снимка: неактуален / должен оставаться как есть.
Статусы Stage App Estate:
CREATE TABLE [dbo].[Stage_App_Estate_Statuses](
[ESTATE_STATUS_RID] [nvarchar](20) NOT NULL,
[ESTATE_RID] [nvarchar](30) NULL,
[CATEGORY] [decimal](1, 0) NULL,
[CHANGE_DATE] [datetime2](0) NULL,
[CHANGE_TYPE] [nvarchar](3) NULL,
[STATUS] [nvarchar](1) NULL,
[TEAM_CODE] [nvarchar](4) NULL,
[TRUSTEE_NUMBER] [decimal](22, 0) NULL,
[TRUSTEE_TYPE] [nvarchar](10) NULL,
[APPLICATION_RID] [nvarchar](30) NULL,
[DML_TYPE] [nvarchar](1) NOT NULL,
[AUDIT_KEY] [int] NOT NULL
) ON [PRIMARY]
Stage_STAF_ACTION_OFFICERS
CREATE TABLE [dbo].[Stage_STAF_ACTION_OFFICERS](
[ACTION_OFFICER_RID] [nvarchar](15) NOT NULL,
[POSITION] [nvarchar](13) NULL,
[DATE_FROM] [date] NULL,
[DATE_TO] [date] NULL,
[USER_ID] [nvarchar](32) NULL,
[ERROR_CONDITION] [nvarchar](100) NULL,
[EXTRACTED_DATE] [date] NULL,
[DML_TYPE] [nvarchar](1) NULL,
[AUDIT_KEY] [int] NOT NULL
) ON [PRIMARY]
LEFT(aes.ESTATE_RID,3) = LEFT(saoh.ACTION_OFFICER_RID,3)
проблематично. - person Felix Pamittan   schedule 15.01.2015LEFT OUTER JOIN
иsaoch.USER_ID
изSELECT
, чтобы увидеть, значительно ли изменится производительность? Если это так, то мы можем рассмотреть возможность улучшения этой части. - person Vladimir Baranov   schedule 15.01.2015Stage_App_Estate_Statuses
иStage_STAF_ACTION_OFFICERS
? какие индексы у них? Почему в первомINNER JOIN
вы присоединяетесь к ним черезaes.TEAM_CODE = saoh.POSITION AND LEFT(aes.ESTATE_RID,3) = LEFT(saoh.ACTION_OFFICER_RID,3)
, а потом присоединяетесь черезa.TEAM_CODE = staf.POSITION
иsaoch.ESTATE_RID = aes.ESTATE_RID
. Второй раз вы не используетеACTION_OFFICER_RID
, что странно. Было бы правильно соединить эти две таблицы один раз и использовать результаты в двух местах позже (используя другое представление или CTE)? - person Vladimir Baranov   schedule 16.01.2015