Подсчитайте отличную производительность с Monetdb - PullRequest
0 голосов
/ 12 февраля 2019

Вот простая проблема с производительностью:

  • Я создаю таблицу C с оператором CTAS.Я анализирую статистику и устанавливаю первичный ключ
  • . Я пытаюсь выполнить запрос типа «считать отдельно» (для всей таблицы, без фильтров) в поле PK.Это довольно медленно, с большим спросом моего жесткого диска.

select count намного быстрее.

Итак, у меня есть следующие вопросы:

  • почему, несмотря на статистику, запрос на подсчет различается медленно?
  • если поле, на которое я делаю подсчет, является PK (или набор полей - PK), то оно точно такое же, как count,Так почему же время не совпадает?
  • Если эти проблемы связаны с дизайном, как я могу попросить их решить?

Для информации: Monetdb 11.31.13 в Windows 10

В качестве информации, пояснение запроса ниже

 sql>explain select count(distinct salesorderdetailid) from formation.salesorderdetails;
+-----------------------------------------------------------------------------+
| mal                                                                         |
+=============================================================================+
| function user.s10_1():void;                                                 |
|     X_1:void := querylog.define("explain select count(distinct salesorderde |
: tailid) from formation.salesorderdetails;":str, "default_pipe":str, 14:int) :
: ;                                                                           :
| barrier X_133:bit := language.dataflow();                                   |
|     X_4:int := sql.mvc();                                                   |
|     C_70:bat[:oid] := sql.tid(X_4:int, "formation":str, "salesorderdetails" |
: :str, 0:int, 4:int);                                                        :
|     X_77:bat[:int] := sql.bind(X_4:int, "formation":str, "salesorderdetails |
: ":str, "salesorderdetailid":str, 0:int, 0:int, 4:int);                      :
|     X_90:bat[:int] := algebra.projection(C_70:bat[:oid], X_77:bat[:int]);   |
|     (X_97:bat[:oid], C_98:bat[:oid], X_99:bat[:lng]) := group.groupdone(X_9 |
: 0:bat[:int]);                                                               :
|     X_100:bat[:int] := algebra.projection(C_98:bat[:oid], X_90:bat[:int]);  |
|     C_72:bat[:oid] := sql.tid(X_4:int, "formation":str, "salesorderdetails" |
: :str, 1:int, 4:int);                                                        :
|     X_78:bat[:int] := sql.bind(X_4:int, "formation":str, "salesorderdetails |
: ":str, "salesorderdetailid":str, 0:int, 1:int, 4:int);                      :
|     X_91:bat[:int] := algebra.projection(C_72:bat[:oid], X_78:bat[:int]);   |
|     (X_101:bat[:oid], C_102:bat[:oid], X_103:bat[:lng]) := group.groupdone( |
: X_91:bat[:int]);                                                            :
|     X_104:bat[:int] := algebra.projection(C_102:bat[:oid], X_91:bat[:int]); |
|     C_74:bat[:oid] := sql.tid(X_4:int, "formation":str, "salesorderdetails" |
: :str, 2:int, 4:int);                                                        :
|     X_79:bat[:int] := sql.bind(X_4:int, "formation":str, "salesorderdetails |
: ":str, "salesorderdetailid":str, 0:int, 2:int, 4:int);                      :
|     X_92:bat[:int] := algebra.projection(C_74:bat[:oid], X_79:bat[:int]);   |
|     (X_105:bat[:oid], C_106:bat[:oid], X_107:bat[:lng]) := group.groupdone( |
: X_92:bat[:int]);                                                            :
|     X_108:bat[:int] := algebra.projection(C_106:bat[:oid], X_92:bat[:int]); |
|     C_76:bat[:oid] := sql.tid(X_4:int, "formation":str, "salesorderdetails" |
: :str, 3:int, 4:int);                                                        :
|     X_80:bat[:int] := sql.bind(X_4:int, "formation":str, "salesorderdetails |
: ":str, "salesorderdetailid":str, 0:int, 3:int, 4:int);                      :
|     X_93:bat[:int] := algebra.projection(C_76:bat[:oid], X_80:bat[:int]);   |
|     (X_109:bat[:oid], C_110:bat[:oid], X_111:bat[:lng]) := group.groupdone( |
: X_93:bat[:int]);                                                            :
|     X_112:bat[:int] := algebra.projection(C_110:bat[:oid], X_93:bat[:int]); |
|     X_127:bat[:int] := mat.packIncrement(X_100:bat[:int], 4:int);           |
|     X_129:bat[:int] := mat.packIncrement(X_127:bat[:int], X_104:bat[:int]); |
|     X_130:bat[:int] := mat.packIncrement(X_129:bat[:int], X_108:bat[:int]); |
|     X_17:bat[:int] := mat.packIncrement(X_130:bat[:int], X_112:bat[:int]);  |
|     (X_18:bat[:oid], C_19:bat[:oid], X_113:bat[:lng]) := group.groupdone(X_ |
: 17:bat[:int]);                                                              :
|     X_21:bat[:int] := algebra.projection(C_19:bat[:oid], X_17:bat[:int]);   |
|     X_22:lng := aggr.count(X_21:bat[:int], true:bit);                       |
|     language.pass(X_90:bat[:int]);                                          |
|     language.pass(X_91:bat[:int]);                                          |
|     language.pass(X_92:bat[:int]);                                          |
|     language.pass(X_93:bat[:int]);                                          |
|     language.pass(X_17:bat[:int]);                                          |
| exit X_133:bit;                                                             |
|     sql.resultSet("formation.L3":str, "L3":str, "bigint":str, 64:int, 0:int |
: , 7:int, X_22:lng);                                                         :
| end user.s10_1;                                                             |
| #inline               actions= 0 time=1 usec                                |
| #remap                actions= 0 time=2 usec                                |
| #costmodel            actions= 1 time=1 usec                                |
| #coercion             actions= 0 time=160 usec                              |
| #evaluate             actions= 0 time=14 usec                               |
| #emptybind            actions= 1 time=57 usec                               |
| #pushselect           actions= 0 time=4 usec                                |
| #aliases              actions= 1 time=5 usec                                |
| #mitosis              actions=1 time=2237 usec                              |
| #mergetable           actions= 2 time=845 usec                              |
| #deadcode             actions=11 time=13 usec                               |
| #aliases              actions= 0 time=0 usec                                |
| #constants            actions= 3 time=174 usec                              |
| #commonTerms          actions= 5 time=26 usec                               |
| #projectionpath       actions= 0 time=14 usec                               |
| #deadcode             actions= 5 time=6 usec                                |
| #reorder              actions= 1 time=86 usec                               |
| #matpack              actions= 1 time=636 usec                              |
| #dataflow             actions= 1 time=37 usec                               |
| #multiplex            actions= 0 time=1 usec                                |
| #profiler             actions=1 time=1 usec                                 |
| #candidates           actions=1 time=0 usec                                 |
| #deadcode             actions= 0 time=32 usec                               |
| #wlc                  actions= 0 time=2 usec                                |
| #garbagecollector     actions= 1 time=112 usec                              |
| #total                actions=28 time=6334 usec                             |
+-----------------------------------------------------------------------------+

...