Вот простая проблема с производительностью:
- Я создаю таблицу 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 |
+-----------------------------------------------------------------------------+