2016-01-17 2 views
0

У меня есть этот запрос с несколькими соединениями, есть ли способ уменьшить количество объединений? Или, возможно, разделить запрос на 2 части, но затем получить тот же набор результатов? Наличие слишком много присоединяется делает запрос выполнить очень медленно и inefficentlyУменьшить сложность запроса

SELECT 
    MD.EVENT_ID, 
    AUI.ATLAS_USER_ID, 
    EVENT_TIME, 
    EVENT_TYPE, 
    INTERACTION_TOKEN, 
    CC.COUNTRY_CODE, 
    AP.ADV_PROJECT_ID, AP.ADV_PROJECT_NAME, 
    AC.ADV_CAMPAIGN_ID, 
    ADV_CAMPAIGN_NAME, 
    PC.PRT_CAMPAIGN_ID, PC.PRT_CAMPAIGN_NAME, 
    IP.IP_ADDRESS, 
    OS.OS, 
    BR.BROWSER, 
    FU.FULL_USER_AGENT, 
    RAW_ACTION_ID, 
    SE.SELLER_NETWORK_ID, 
    RIURL.RAW_INPUT as URL, 
    RIREF.RAW_INPUT as REF_URL, 
    MVG1.MAP_VALUE as TABOOLA ,  
    MVG2.MAP_VALUE as APPNEXUS   , 
    MVG3.MAP_VALUE as ETAG    , 
    MVG4.MAP_VALUE as FACEBOOK   , 
    MVG5.MAP_VALUE as MEDIAMATH   , 
    MVG6.MAP_VALUE as COOKIEID   , 
    MVG7.MAP_VALUE as IDFA    , 
    MVG8.MAP_VALUE as ADVLOGIN   , 
    MVG9.MAP_VALUE as OPENX    , 
    MVG10.MAP_VALUE as ADTRUTH   , 
    MVG11.MAP_VALUE as GOOGLE   , 
    MVG12.MAP_VALUE as ANDROID_ADV_ID , 
    MVG13.MAP_VALUE as SDGUPI   , 
    MVG15.MAP_VALUE as RMX     
FROM 
    EVENT_124_2 BASE 
INNER JOIN 
    atlas__atlas_events MD ON BASE.EVENT_ID = MD.EVENT_ID 
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG1 ON MVG1.MAP_VALUE_GK = BASE.TABOOLA_HASH 
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG2 ON MVG2.MAP_VALUE_GK = BASE.APPNEXUS_HASH  
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG3 ON MVG3.MAP_VALUE_GK = BASE.ETAG_HASH   
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG4 ON MVG4.MAP_VALUE_GK = BASE.FACEBOOK_HASH  
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG5 ON MVG5.MAP_VALUE_GK = BASE.MEDIAMATH_HASH  
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG6 ON MVG6.MAP_VALUE_GK = BASE.COOKIEID_HASH  
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG7 ON MVG7.MAP_VALUE_GK = BASE.IDFA_HASH   
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG8 ON MVG8.MAP_VALUE_GK = BASE.ADVLOGIN_HASH  
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG9 ON MVG9.MAP_VALUE_GK = BASE.OPENX_HASH   
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG10 ON MVG10.MAP_VALUE_GK = BASE.ADTRUTH_HASH   
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG11 ON MVG11.MAP_VALUE_GK = BASE.GOOGLE_HASH   
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG12 ON MVG12.MAP_VALUE_GK = BASE.ANDROID_ADV_ID_HASH 
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG13 ON MVG13.MAP_VALUE_GK = BASE.SDGUPI_HASH   
LEFT JOIN 
    LOOKUP_STG__MAP_VALUE MVG15 ON MVG15.MAP_VALUE_GK = BASE.RMX_HASH 
LEFT JOIN 
    LOOKUP_STG__ATLAS_USER_ID AUI ON AUI.ATLAS_USER_ID_GK = MD.ATLAS_USER_ID 
LEFT JOIN 
    GAYA__ADV_PROJECTS AP ON AP.ADV_PROJECT_ID = MD.ADV_PROJECT_ID 
LEFT JOIN 
    GAYA__ADV_CAMPAIGNS AC ON AC.ADV_CAMPAIGN_ID = MD.ADV_CAMPAIGN_ID 
LEFT JOIN 
    GAYA__PRT_CAMPAIGNS PC ON PC.PRT_CAMPAIGN_ID = MD.PRT_CAMPAIGN_ID 
LEFT JOIN 
    LOOKUP_STG__RAW_INPUT RIURL ON RIURL.RAW_INPUT_GK = BASE.URL_HASH 
LEFT JOIN 
    LOOKUP_STG__RAW_INPUT RIREF ON RIREF.RAW_INPUT_GK = BASE.REF_HASH 
LEFT JOIN 
    LOOKUP_STG__OS OS ON OS.OS_GK = MD.COUNTRY_CODE 
LEFT JOIN 
    LOOKUP_STG__COUNTRY_CODE CC ON CC.COUNTRY_CODE_GK = MD.COUNTRY_CODE 
LEFT JOIN 
    LOOKUP_STG__BROWSER BR ON BR.BROWSER_GK = MD.BROWSER 
LEFT JOIN 
    LOOKUP_STG__IP_ADDRESS IP ON IP.IP_ADDRESS_GK = MD.IP_ADDRESS 
LEFT JOIN 
    LOOKUP_STG__SELLER_NETWORK_ID SE  ON SE.SELLER_NETWORK_ID_GK = MD.SELLER_NETWORK_ID 
LEFT JOIN 
    LOOKUP_STG__FULL_USER_AGENT FU ON FU.FULL_USER_AGENT_GK = MD.FULL_USER_AGENT 
; 
+0

Это может быть не количество соединений. Это может быть отсутствие фильтра в любом месте. –

+0

UNION может быть лучшим подходом, чем некоторые из этих левых объединений. –

+0

. Обычный подход к ограничению/исключению объединения - это денормализация вашей схемы ... – mauro

ответ

0

Есть ли у вас какие-либо индексы ваших ключевых столбцов? Вы можете попытаться поместить растровые индексы в каждый столбец ключевых слов в таблицу основных фактов, а также в таблицы измерений. Это должно дать вам значительное ускорение.

0

Вы говорите, что количество соединений делает запрос неэффективным. Но то, что вы должны смотреть, состоит в том, имеют ли таблицы, которые соединены с ними, соответствующие индексы. Вам, очевидно, нужны все эти поля из таблиц, к которым вы присоединяетесь, поэтому вы не можете просто не присоединиться к ним.

За каждые JOIN, которые вы указываете в запросе, убедитесь, что в поле, которое соединено, есть INDEX. Например:

INNER JOIN 
    atlas__atlas_events MD ON BASE.EVENT_ID = MD.EVENT_ID 

ли таблица atlas__atlas_events имеет INDEX на EVENT_ID колонки?

Вы должны подтвердить это для каждого такого JOIN в своем запросе. Если такой INDEX не существует, вы должны создать его.

Если вы выполните этот запрос в SQL Server Management Studio и включите actual execution plan, вы, вероятно, уже увидите указания о том, что вам не хватает индексов.

Смежные вопросы