问题标签 [cost-based-optimizer]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
9 回答
135033 浏览

sql - PostgreSQL - 获取列的最大值的行

我正在处理一个 Postgres 表(称为“lives”),其中包含带有 time_stamp、usr_id、transaction_id 和 live_remaining 列的记录。我需要一个查询,该查询将为我提供每个 usr_id 的最新 lives_remaining 总数

  1. 有多个用户(不同的 usr_id)
  2. time_stamp 不是唯一标识符:有时用户事件(在表中逐行)会以相同的 time_stamp 发生。
  3. trans_id 仅在非常小的时间范围内是唯一的:随着时间的推移它会重复
  4. 剩余寿命(对于给定用户)可以随时间增加和减少

例子:

因为我需要使用每个给定 usr_id 的最新数据访问行的其他列,所以我需要一个查询,它会给出如下结果:

如前所述,每个 usr_id 都可能获得或失去生命,有时这些带时间戳的事件发生得如此接近以至于它们具有相同的时间戳!因此,此查询将不起作用:

相反,我需要同时使用 time_stamp(第一)和 trans_id(第二)来识别正确的行。然后,我还需要将该信息从子查询传递到主查询,主查询将为相应行的其他列提供数据。这是我已经开始工作的黑客查询:

好的,所以这行得通,但我不喜欢它。它需要一个查询中的一个查询,一个自连接,在我看来,通过抓取 MAX 发现具有最大时间戳和 trans_id 的行可以更简单。表“lives”有数千万行要解析,所以我希望这个查询尽可能快速和高效。我尤其是 RDBM 和 Postgres 的新手,所以我知道我需要有效地使用正确的索引。我对如何优化有点迷茫。

我在这里找到了类似的讨论。我可以执行某种与 Oracle 分析功能等效的 Postgres 类型吗?

任何有关访问聚合函数(如 MAX)使用的相关列信息、创建索引和创建更好的查询的建议将不胜感激!

PS您可以使用以下内容创建我的示例案例:

0 投票
2 回答
531 浏览

oracle - 执行计划中的节点如何比其子节点具有更小的成本?

我一直认为执行计划中的节点只有在其子节点执行后才能执行,因此节点的总成本必须大于或等于子节点的成本。但是,情况并非总是如此,如下例所示:

读取第 6 行和第 7 行之间成本差异的正确方法是什么?

0 投票
6 回答
320 浏览

algorithm - 使用仿射成本优化笛卡尔请求

我有一个成本优化请求,我不知道是否有相关文献。这有点难以解释,所以我提前为问题的长度道歉。

我正在访问的服务器以这种方式工作:

  • 对记录 (r1, ...rn) 和字段 (f1, ...fp) 发出请求
  • 您只能请求笛卡尔积 (r1, ..., rp) x (f1,...fp)
  • 与此类请求相关的成本(时间和金钱)与请求的大小相关:

T((r1, ..., rn)x(f1, ..., fp) = a + b * n * p

不失一般性(仅通过归一化),我们可以假设b=1成本为:

T((r1, ...,rn)x(f1,...fp)) = a + n * p

  • 我只需要请求 pair 的一个子集(r1, f(r1)), ... (rk, f(rk)),一个来自用户的请求。我的程序充当用户和服务器(外部)之间的中间人。我有很多这样的请求(每天数万个)。

从图形上看,我们可以将其视为一个 nxp 稀疏矩阵,为此我想用一个矩形子矩阵覆盖非零值:

有:

  • 由于成本不变,子矩阵的数量保持合理
  • 所有的 'x' 必须位于子矩阵内
  • 由于线性成本,覆盖的总面积不能太大

我将 g 命名为我的问题的稀疏系数(所需对的数量超过可能的对总数,g = k / (n * p)。我知道系数a

有一些明显的观察结果:

  • 如果 a 很小,最好的解决方案是独立请求每个 (record, field) 对,总成本为:k * (a + 1) = g * n * p * (a + 1)
  • 如果 a 很大,最好的解决方案是请求整个笛卡尔积,总成本为:a + n * p
  • 第二种解决方案更好g > g_min = 1/ (a+1) * (1 + 1 / (n * p))
  • 当然笛卡尔积中的顺序并不重要,因此我可以转置矩阵的行和列以使其更容易覆盖,例如:

可以重新排序为

并且有一个最佳的解决方案是要求(f1,f3) x (r1,r3) + (f2) x (r2)

  • 尝试所有解决方案并寻找更低的成本不是一种选择,因为组合学爆炸了:

所以我正在寻找一个近似的解决方案。我已经有某种贪心算法,可以在给定矩阵的情况下找到覆盖(它从单一单元格开始,如果合并中空单元格的比例低于某个阈值,则合并它们)。

记住一些数字,我的 n 介于 1 和 1000 之间,而我的 p 介于 1 和 200 之间。覆盖模式真的是“块状”,因为记录来自所要求的字段相似的类。不幸的是,我无法访问记录类...

问题 1:有人有什么想法、一个巧妙的简化或可能有用的论文参考吗?由于我有很多请求,因此我正在寻找一种平均运行良好的算法(但我无法承受它在某些极端情况下运行不佳,例如当 n 和 p 很大时请求整个矩阵,并且请求确实非常稀疏)。

问题2:其实问题更复杂:cost其实更像是这样的形式:a + n * (p^b) + c * n' * p',其中b是一个常数<1(一个记录一旦求一个字段,再求其他也不算太贵字段)并且n' * p' = n * p * (1 - g)是我不想请求的单元格的数量(因为它们是无效的,并且请求无效的东西需要额外的费用)。我什至无法想到一个快速解决这个问题的方法,但仍然......任何人的想法?

0 投票
2 回答
5048 浏览

performance - 外键约束会影响 Oracle 中的查询转换吗?

我有这样的情况:

Nowb.a_id实际上是一个外键引用a.a_id,但它没有被正式声明为这样。显然,这应该是出于完整性的原因。但是外键约束在一般情况下还是在特定情况下也能提高连接性能?如果是,对于什么类型的查询转换?

有没有关于这个主题的相关文档?

我正在使用 Oracle 11g (11.2.0.2.0)

0 投票
1 回答
7850 浏览

oracle - Oracle CBO 何时选择执行“合并加入笛卡尔”操作?

有时,Oracle 似乎更喜欢MERGE JOIN CARTESIAN操作而不是常规的MERGE JOIN. 了解数据并查看具体的执行计划后,我可以看到此操作通常不是问题,因为其中一个连接实体只能返回手头查询中的一条记录。

但是,由于历史原因,我们的 DBA 普遍不喜欢笛卡尔积。

所以我想更好地分析这些案例,并在我的论证中得到文件的支持。是否有任何关于查询转换和 CBO 的官方 Oracle 文档,我可以在其中了解 Oracle 更喜欢MERGE JOIN CARTESIAN(或类似)操作的情况?

在这种情况下,我使用的是 Oracle 11g (11.2.0.2.0)

更新

这些是类似的问题,但它们没有解释为什么何时Oracle 更喜欢MJC常规的MERGE JOIN

0 投票
1 回答
599 浏览

sql - Oracle to_date() 计划和时间执行的差异

我有两个疑问

解释计划

第二次查询

解释计划

索引 ddl

DATE_OF 是日期类型的列。MVIEW 未分区。

为什么查询成本差异如此之大?

0 投票
2 回答
784 浏览

machine-learning - 为什么 1-norm SVM 比 2-norm SVM 更稀疏?

与在 SVM 的相同成本函数中使用 2 范数权重相比,我们如何通过在成本函数中使用 1 范数权重来增加稀疏性。

对于 1 范数Minimize ||w||_1
:成本函数 - 对于 2 范数:成本函数 -Minimize ||w||_2

它与LP-SVM有关吗?

0 投票
2 回答
210 浏览

sql - 使 Oracle SQL 优化器相信索引列(尽管非唯一)实际上包含唯一值

我正在编写一个使用带有非UNIQUE索引列的视图。但是,在我的观点范围内,我相信该列将仅包含唯一值(由于该WHERE子句中施加的条件)。

当有人基于该列(例如SELECT * FROM MY_VIEW WHERE COLUMN_WITH_NON_UNIQUE_INDEX = 'foo')查询视图时,就会出现真正的问题。优化器确信它将接收许多行(因为索引在技术上不是UNIQUE)。因此,优化器避免在视图中的其他位置使用其他索引以支持全表扫描(不酷)。

有没有办法让优化器相信具有非UNIQUE索引的列实际上将包含唯一值?当然,重复值可能会潜入列中,但这将被视为错误,不应导致合法的唯一数据受到影响。

不幸的是,我无法控制有问题的桌子(叹气)。

0 投票
1 回答
95 浏览

sql - 定义没有数据的表的大小 (Oracle)

我的问题有点复杂,所以当我试图解释它时请多多包涵^_^。

我致力于从星型模式输入自动生成几个(大量)DW 雪花模式。另一方面,我有一组查询,当然会根据架构而变化。

我的目的是计算每个模式上每个查询的成本模型,知道我只有关于表大小、行大小、页面系统大小等的统计信息(计算成本模型所需的所有参数)。如果有数据,我可以使用“dbms 的解释计划”来生成每个查询的“最佳”计划,以计算成本模型,这将为我节省大量时间:)

但是很遗憾,我没有数据,我想知道我是否可以使用“解释计划”,只设置没有数据的参数,换句话说,定义没有数据的表的大小。是否有可能在 Oracle 或任何其他 DBMS 上?

提前致谢。

PS:我可以问一个问题:“我可以在 oracle(或任何其他 DBMS)中设置表的大小(没有数据),但我更愿意解释整个问题,希望我会有其他建议。

0 投票
1 回答
115 浏览

algorithm - 具有线性固定点的基于成本的样条最小化

让我看看我是否可以在没有图片的情况下充分描述这个问题。

假设我有两个变量都线性影响速度,a 和 b。随着 a 的增加,速度线性增加,反之亦然。b- 也是如此,随着它的增加,速度线性增加,反之亦然。现在假设已经确定了随时间变化的速度,并且是一个很好的平滑样条曲线,称为 v(t)。我们还知道给定时间 v = f(a,b),其中 f 是一些基本的线性函数,可根据 a 和 b 确定 v。最后,我们有一些成本函数 c(a,b,t),它定义了特定时间的成本以及 a 和 b 的值。

我要做的是绘制一个成本最小化样条曲线,其中每个点在特定时间确定 a 和 b,硬条件是 f(a,b,t) = v(t) 始终存在,并且我们试图最小化 c(a,b,t) 的软条件。如果您将其展平为二维,a 在一个轴上,b 在另一个轴上,在特定时间,您会看到为了满足硬约束,我们必须在 ab 平面中有一条线be on,但是我们应该在哪条线上放置一个点取决于成本函数。

如果成本函数很简单,这将是一个相对容易解决的问题——在每个 t 处,只需确定 a 和 b 以最小化成本,然后就可以完成。但是,成本可能会在保留边界处突然变化(例如,对于 t >= 5,a < 0.6 的成本会急剧增加),我希望我的样条能够预测到这一点并在我们到达 t = 之前开始增加 a 5、这样才能顺利进行。

对我来说,它崩溃的地方是我能找到的所有样条公式都需要 n 空间中的固定点。他们可能不会通过这些点,但他们确实需要它们。我的案例不需要样条通过 [a,b,t] 中的特定点,但确实需要它们通过特定 t 值的线(其余的是最小化)。有没有办法通过查看导数等将这个问题简化为基本样条问题?

本文描述了如何解决类似的问题,但它似乎要求样条曲线通过点而不是线进行最佳拟合。http://www.cs.berkeley.edu/~ravir/dspline.pdf

感谢您的任何帮助,您可以提供。