indexing - 我们怎么知道 monetDB 正在使用索引?

标签 indexing explain monetdb

我已将 1.5 亿条记录加载到 MonetDB 中。所有数据都插入到单个表中。该表没有任何约束(例如UNIQUE,..)。我自己没有创建任何索引。原始源 CSV 文件约为 7.2 GB,导入数据库后约为 8 GB。我用 WHERE 运行了 COUNT(*),它在 12 秒内返回。根据文档:

The index statements in the SQL standard are recognized, but their implementation is different from competitive products. MonetDB/SQL interprets these statements as an advice and often freely neglects it, relying on its own decision to create and maintain indexes for fast access.

现在如何知道MonetDB自己创建了索引?我使用了 EXPLAIN 但我不明白输出: 这是实际的查询:

EXPLAIN SELECT COUNT(*) FROM vbvdata WHERE vbvdata_speed > 80 AND vbvdata_lane_id = 2;

这是EXPLAIN输出:

+--------------------------------------------------------------------------------+
| mal                                                                            |
+================================================================================+
| function user.s11_1{autoCommit=true}(A0:bte,A1:bte):void;                      |
|     X_4 := sql.mvc();                                                          |
|     X_46:bat[:oid,:bte]  := sql.bind(X_4,"sys","vbvdata","vbvdata_speed",0);   |
|     X_38:bat[:oid,:bte]  := sql.bind(X_4,"sys","vbvdata","vbvdata_speed",2);   |
|     X_48 := algebra.kdifference(X_46,X_38);                                    |
|     X_49 := algebra.kunion(X_48,X_38);                                         |
|     X_32:bat[:oid,:bte]  := sql.bind(X_4,"sys","vbvdata","vbvdata_speed",1);   |
|     X_50 := algebra.kunion(X_49,X_32);                                         |
|     X_18:bat[:oid,:oid]  := sql.bind_dbat(X_4,"sys","vbvdata",1);              |
|     X_19 := bat.reverse(X_18);                                                 |
|     X_51 := algebra.kdifference(X_50,X_19);                                    |
|     X_25:bat[:oid,:bte]  := sql.bind(X_4,"sys","vbvdata","vbvdata_lane_id",0); |
|     X_27 := algebra.uselect(X_25,A1);                                          |
|     X_23:bat[:oid,:bte]  := sql.bind(X_4,"sys","vbvdata","vbvdata_lane_id",2); |
|     X_28 := algebra.kdifference(X_27,X_23);                                    |
|     X_24 := algebra.uselect(X_23,A1);                                          |
|     X_29 := algebra.kunion(X_28,X_24);                                         |
|     X_21:bat[:oid,:bte]  := sql.bind(X_4,"sys","vbvdata","vbvdata_lane_id",1); |
|     X_22 := algebra.uselect(X_21,A1);                                          |
|     X_30 := algebra.kunion(X_29,X_22);                                         |
|     X_31 := algebra.kdifference(X_30,X_19);                                    |
|     X_52 := algebra.semijoin(X_51,X_31);                                       |
|     X_53 := algebra.thetauselect(X_52,A0,">");                                 |
|     X_55 := algebra.kdifference(X_53,X_38);                                    |
|     X_41 := algebra.semijoin(X_38,X_31);                                       |
|     X_42 := algebra.thetauselect(X_41,A0,">");                                 |
|     X_56 := algebra.kunion(X_55,X_42);                                         |
|     X_35 := algebra.semijoin(X_32,X_31);                                       |
|     X_36 := algebra.thetauselect(X_35,A0,">");                                 |
|     X_57 := algebra.kunion(X_56,X_36);                                         |
|     X_58 := algebra.kdifference(X_57,X_19);                                    |
|     X_59 := algebra.markT(X_58,0@0:oid);                                       |
|     X_60 := bat.reverse(X_59);                                                 |
|     X_12:bat[:oid,:lng]  := sql.bind(X_4,"sys","vbvdata","vbvdata_id",0);      |
|     X_10:bat[:oid,:lng]  := sql.bind(X_4,"sys","vbvdata","vbvdata_id",2);      |
|     X_14 := algebra.kdifference(X_12,X_10);                                    |
|     X_15 := algebra.kunion(X_14,X_10);                                         |
|     X_6:bat[:oid,:lng]  := sql.bind(X_4,"sys","vbvdata","vbvdata_id",1);       |
|     X_16 := algebra.kunion(X_15,X_6);                                          |
|     X_61 := algebra.leftjoin(X_60,X_16);                                       |
|     X_62 := aggr.count(X_61);                                                  |
|     sql.exportValue(1,"sys.vbvdata","L1":str,"wrd",64,0,6,X_62,"");            |
| end s11_1;                                                                     |
| # optimizer.mitosis()                                                          |
| # optimizer.dataflow()                                                         |
+--------------------------------------------------------------------------------+

有人可以帮忙吗?

最佳答案

一般来说,您无法知道 MonetDB 何时创建/使用索引。这是根据每个运算符调用动态确定的。

关于indexing - 我们怎么知道 monetDB 正在使用索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10598796/

相关文章:

mysql - MySQL中的eq_ref和ref类型是什么意思解释

mysql with OR 语句返回全表扫描

mysql - 为什么解释分区在每个选择查询中显示第一个分区?

database - MonetDB 通过事件连接进行查询以后台最佳策略刷新数据

mysql - 寻找moSTLy read应用的数据库解决方案,查询3亿条记录

mysql - 为 MySQL 配置更好的索引选择

indexing - solr web界面无法通过互联网访问

python - 确保 Pandas 数据框中连续观察之间的最小时间间隔

arrays - Array.Find和IndexOf用于完全相同对象的多个元素

sql - MonetDB - 如何从 SQL 文件中调用 .SQL 文件?