Руководство по переписыванию запроса с использованием NOT EXISTS - PullRequest
0 голосов
/ 11 апреля 2019

У нас есть запрос, который выполняется для разных источников, много раз каждый день. Каждый раз, когда он выполняется более 40 минут, мы пытаемся выяснить, сможем ли мы сократить время выполнения запроса

Все, что делает запрос - пытается добавить новые строки в существующую таблицу (сравнивая по ключам)

                    SELECT          A.*
                    FROM            
                    ( 
                                       SELECT *
                                       FROM   A 
                    )
                    A
                    LEFT OUTER JOIN 
                                    ( 
                                           SELECT f1, f11
                                           FROM   B 
                                           WHERE  f13 IN  (  SELECT f13 FROM   C) 
                                    ) 
                    B 
                    ON              A.f1 = B.f1
                    AND             nvl(A.f11,'NULL') = nvl(B.f11,'NULL')
                    WHERE           isnull(B.f1) 
                    AND             isnotnull(A.f1) 

Что я пытаюсь сделать


                    SELECT          A.* .
                    FROM            ( 
                                           SELECT * 
                                           FROM   A 
                                   ) 
                    A
                    WHERE NOT EXISTS  
                                    ( 
                                           SELECT 1
                                           FROM   B  WHERE  f13 IN  (  SELECT f13 FROM   C)
                                           and A.f1 = B.f1 and A.f11 = B.f11

                                    ) 

Будет ли это работать не только для получения аналогичных результатов, но и для сокращения времени выполнения. Небольшое улучшение в запросе будет иметь большое значение, так как этот запрос выполняется 8 раз в день.

Любые предложения будут полезны.

1 Ответ

1 голос
/ 11 апреля 2019

В Hive NOT EXISTS создаст тот же план, что и left join + isnull filter.

. Вы можете использовать UNION + row_number() для дополнительных обновлений, как в этом ответе https://stackoverflow.com/a/44755825/2700344, без объединения, это можетработать быстрее

...