Добавление Distinct () вызывает огромную проблему с производительностью (только иногда) - PullRequest
0 голосов
/ 29 мая 2020

Я использую. net MVC на стороне сервера, Entity Framework как ORM и ORACLE 11g как базу данных

Проблема в том, что один из наших запросов требует много времени для выполнения, это не происходит всегда иногда только это случается. В нормальном случае это будет завершено за миллисекунды. Но какое-то время на выполнение уходит 4-5 минут.

var alphaList= _dBontext.SampleVIEW
                    .Where(it => it.CODE == code)
                    .Select(it => it.NAME.Substring(0, 1)).Distinct()
                    .ToArray();

Из-за проблем с производительностью я разделил приведенный выше запрос на две части, как показано ниже

            var discList = _dBontext.SampleVIEW
                .Where(it => it.CODE == code)
                .Select(it => it.NAME).ToList();

  var alphaList = discList.Select(s => s.Substring(0, 1)).Distinct().ToArray();

На этот раз я не вижу серьезных проблем с производительностью.

Затем в целях тестирования я просто добавил Distinct () в запрос выше, как показано ниже

 var discLists =  _dBontext.SampleVIEW
                    .Where(it => it.CODE == code)
                    .Select(it => it.NAME).Distinct().ToList();

На этот раз снова возникает проблема с производительностью. Проблема в том, что я не могу всегда находить проблемы с производительностью в этом запросе. Редко такое бывает. И тогда на выполнение этого запроса уходит 4-5 минут.

Я знаю, что использование Distinct () будет пытаться упорядочить элементы, и этот порядок может быть дорогостоящим по сравнению с обычным запросом. Но я сомневаюсь, что если проблема связана с Distinct, то почему она не появляется всегда? Если проблема не связана с Distinct (), каковы все другие возможности?

Примечание: у меня не так много данных в этом представлении. Максимум 5к данных только там сейчас.

Я уже прошел Этот Вопрос. Но у меня другой контекст, и проблема с производительностью запросов возникает не всегда.

Обновление:

Ниже приведен план выполнения запроса

"PLAN_TABLE_OUTPUT"
"Plan hash value: 1907157887"
" "
"------------------------------------------------------------------------------------------------------------------"
"| Id  | Operation                 | Name                         | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |"
"------------------------------------------------------------------------------------------------------------------"
"|   0 | SELECT STATEMENT          |                              | 39901 |  3312K|       |  1664   (6)| 00:00:01 |"
"|   1 |  HASH UNIQUE              |                              | 39901 |  3312K|  3640K|  1664   (6)| 00:00:01 |"
"|*  2 |   HASH JOIN RIGHT OUTER   |                              | 39901 |  3312K|       |   857   (8)| 00:00:01 |"
"|   3 |    TABLE ACCESS FULL      | BAL_TBL       |   980 |  9800 |       |    14   (0)| 00:00:01 |"
"|*  4 |    HASH JOIN              |                              |  4072 |   298K|       |   840   (8)| 00:00:01 |"
"|*  5 |     INDEX FAST FULL SCAN  | CVB_USERS_PRI               |  3432 | 58344 |       |     7   (0)| 00:00:01 |"
"|*  6 |     HASH JOIN OUTER       |                              | 11865 |   672K|       |   832   (8)| 00:00:01 |"
"|   7 |      NESTED LOOPS         |                              | 11681 |   501K|       |   272   (9)| 00:00:01 |"
"|   8 |       MERGE JOIN CARTESIAN|                              | 11681 |   387K|       |   262   (6)| 00:00:01 |"
"|   9 |        INDEX FULL SCAN    | TESTV_PROFILE_PRI             |     1 |     9 |       |     1   (0)| 00:00:01 |"
"|  10 |        BUFFER SORT        |                              | 11681 |   285K|       |   261   (6)| 00:00:01 |"
"|  11 |         TABLE ACCESS FULL | PDETAILS_TBL_OTHERS_TAX    | 11681 |   285K|       |   261   (6)| 00:00:01 |"
"|* 12 |       INDEX UNIQUE SCAN   | XYZ_CTL_LIST_OTH_TAX_PR2_IDX |     1 |    10 |       |     0   (0)| 00:00:01 |"
"|* 13 |      TABLE ACCESS FULL    | P_INFO            | 26432 |   361K|       |   557   (7)| 00:00:01 |"
"------------------------------------------------------------------------------------------------------------------"
" "
"Query Block Name / Object Alias (identified by operation id):"
"-------------------------------------------------------------"
" "
"   1 - SEL$3258542E"
"   3 - SEL$3258542E / ACCTBAL@SEL$2"
"   5 - SEL$3258542E / VUSERS@SEL$4"
"   9 - SEL$3258542E / VPRO@SEL$4"
"  11 - SEL$3258542E / A@SEL$3"
"  12 - SEL$3258542E / B@SEL$3"
"  13 - SEL$3258542E / C@SEL$3"
" "
"Predicate Information (identified by operation id):"
"---------------------------------------------------"
" "
"   2 - access(TRIM(""ACCTBAL"".""ID""(+))=TRIM(""A"".""ID""))"
"   4 - access(TRIM(TO_CHAR(""C"".""ID1""))=TRIM(""VUSERS"".""ID1"") AND "
"              TRIM(""VPRO"".""SAMPLECODE"")=TRIM(""VUSERS"".""SAMPLECODE""))"
"   5 - filter(""VUSERS"".""SAMPLECODE""='ABCTESTV1')"
"   6 - access(""A"".""ID""=""C"".""ID""(+))"
"  12 - access(""A"".""ID""=""B"".""ID"")"
"  13 - filter(""C"".""ID""(+) IS NOT NULL)"
" "
"Column Projection Information (identified by operation id):"
"-----------------------------------------------------------"
" "
"   1 - (#keys=1) ""LNAME""||', '||""FNAME""[62]"
"   2 - (#keys=1) ""LNAME""[VARCHAR2,30], ""FNAME""[VARCHAR2,30]"
"   3 - ""ACCTBAL"".""ID""[CHARACTER,9]"
"   4 - (#keys=2) ""A"".""ID""[CHARACTER,9], ""LNAME""[VARCHAR2,30], ""FNAME""[VARCHAR2,30]"
"   5 - ""VUSERS"".""SAMPLECODE""[VARCHAR2,20], ""VUSERS"".""ID1""[VARCHAR2,10]"
"   6 - (#keys=1) ""A"".""ID""[CHARACTER,9], ""VPRO"".""SAMPLECODE""[VARCHAR2,20], ""LNAME""[VARCHAR2,30], "
"       ""FNAME""[VARCHAR2,30], ""C"".""ID1""[NUMBER,22]"
"   7 - (#keys=0) ""VPRO"".""SAMPLECODE""[VARCHAR2,20], ""A"".""ID""[CHARACTER,9], ""LNAME""[VARCHAR2,30], "
"       ""FNAME""[VARCHAR2,30]"
"   8 - (#keys=0) ""VPRO"".""SAMPLECODE""[VARCHAR2,20], ""A"".""ID""[CHARACTER,9], ""LNAME""[VARCHAR2,30], "
"       ""FNAME""[VARCHAR2,30]"
"   9 - ""VPRO"".""SAMPLECODE""[VARCHAR2,20]"
"  10 - (#keys=0) ""A"".""ID""[CHARACTER,9], ""LNAME""[VARCHAR2,30], ""FNAME""[VARCHAR2,30]"
"  11 - (rowset=200) ""A"".""ID""[CHARACTER,9], ""LNAME""[VARCHAR2,30], ""FNAME""[VARCHAR2,30]"
"  13 - ""C"".""ID""[CHARACTER,9], ""C"".""ID1""[NUMBER,22]"
" "
"Note"
"-----"
"   - dynamic statistics used: dynamic sampling (level=2)"
"   - 3 Sql Plan Directives used for this statement"
...