database - 具有排序属性的 KDB 表的插入操作复杂度
问题描述
假设有一个包含 A、B 和 C 列的 KDB 表,并且它在 A 列上排序。我想了解将记录插入该表的复杂性(假设它必须保持表在 A 上排序)。
- 如果保证对该表的插入按 A 的排序顺序进行,它会有所帮助(就复杂性而言)。这意味着在任何时候 t2>t1, A(t2)>A(t1) ?
- 有没有办法可以利用上述事实 (t2>t1 => A(t2)>A(t1)) 并优化查询,甚至无需在 A 上应用排序属性?
- 我知道有一种方法可以对列执行二进制搜索,但我主要想知道是否有一种方法可以告诉查询计划程序“假设”列已排序(实际上没有排序属性,因为我想避免与之相关的插入复杂性)并相应地执行查询?
解决方案
我的想法(其中一些只是意见,因为我们无法确切地看到 kdb 在幕后做了什么):
A. 澄清一下 - kdb 本身不会“保持表格排序”。无论如何,Kdb 都会插入数据,由用户来确保表格保持排序。
B. 我认为您不应该担心 kdb 插入的开销/复杂性 - 我估计这insert
是所有 kdb 中最优化的操作之一
C. 无论该列是否具有属性,kdb 都会以任何一种方式进行插入,并且可能只有在插入之后才会检查该属性是否保留。这将是一个高度优化的检查。s#
将在非排序插入时丢失。u#
将在非唯一插入上丢失。p#
任何插入都会丢失,因为它通常用于静态/磁盘数据。
D. 唯一会产生不可忽略的插入成本/复杂性的情况是在维护分组属性的情况下,因为g#
始终保留在插入时,并且存在更新隐藏哈希表的开销。但即便如此,这种开销也不会影响在一天内有数十亿次插入的大容量 RDB。
这些都不是实际的硬数字或大 O/复杂性信息,但根据我的经验,大 O/复杂性与查找具有属性的数据更相关,而不是属性/数据的插入/维护。根据我的经验,插入从来不是一个问题。
要回答您的实际问题:
正如我在 (A) 中所避免的那样,如果您想要一个已排序的属性并且想要保留它,那么您必须确保数据按排序顺序插入
如果没有属性,那么 kdb 会像对待任何其他向量一样对待列/向量——它每次都会扫描整个向量,因为没有标志/属性告诉它使用优化。唯一的例外是 as-of 连接(或窗口连接)
aj/wj
,其中aj
on say`sym`time
假设时间在 sym 中排序,而没有明确s#
的时间属性。除了
aj/wj
上面的例外,不,如果你想利用数据的排序特性来加速查询,那么你需要一个s#
属性。当然,除非您使用不同的属性,例如p#
我前面提到的有自己的警告
推荐阅读
- google-apps-script - 修改 Google Apps 脚本全局变量
- android - 找不到构建工具修订版 30.0.1
- angular - variable.scss 从数据库中获取动态值 - Ionic 5
- python - numpy 点积的向量化抛出值错误
- angularjs - 使用 Angular 从 Firestore 中删除数据
- google-apps-script - 在 Google 表格中计算生日
- firebase - 自动计算与存储在 Firebase Firestore Flutter 中的地理坐标数据的距离
- excel - 更改图表对象属性时出现运行时错误
- firebase-cloud-messaging - 如何在 ejabberd 上使用 FCM 连接和发送推送通知?
- python - 如何从数组的numpy数组中删除外部数组