【问题标题】:Force multithreading in select query? [Oracle or Sql-Server]在选择查询中强制多线程? [Oracle 或 Sql-Server]
【发布时间】:2017-12-21 05:17:11
【问题描述】:

我有一个选择查询,它调用一个函数三次 [当然每次都使用 diff 输入 col]。我注意到执行时间 [多行] 为 8 秒,而当我调用该函数一次时为 3 秒。这是有道理的,因为工作量增加了两倍。

问:
是否可以提示数据库服务器强制多线程,因为它们是 3 个不同的独立列?

我尝试单独提取结果并加入它们。即使在 SQL-Server 或 Oracle 中,它们似乎也没有创建任何类型的并行性。使用下面的 SS 语法。

select top 200 dbo.CALC_DURATION (Col1, Col2 , 'PP', 553, '', 'N', 'H'),
               dbo.CALC_DURATION (Col3, Col4 , 'PP', 553, '', 'N', 'H'),
               dbo.CALC_DURATION (Col5, Col6 , 'PP', 553, '', 'N', 'H') 
from NNMP265_ISS;

上面的函数sn-p:

【问题讨论】:

  • 我怀疑这是可能的,因为 CALC_DURATION 是一个标量函数。见dba.stackexchange.com/questions/134453/…
  • 能否包含函数的代码?人们可能会想到如何以不妨碍并行性的其他方式完成它。
  • 当然,谢谢。该函数通过对 2 组数据的优先级计算工作时间,然后精确计算开始和结束时间之间的工作时间。在主要问题中附上屏幕截图,因为我不适合这里的程序。

标签: sql sql-server multithreading select oracle11g


【解决方案1】:

我只能回答有关 Oracle 的问题:在 Oracle 中,并行性适用于查找(和插入/修改)行。这意味着并行执行将帮助您找到结果——而不是在您对它们执行的 plsql 例程上。

现在棘手的部分来了:如果需要 PL/SQL 例程的结果来构建结果集(例如 WHERE my_function(col1) > 3),它将受益于并行性;如果例程仅用于“美化”最终结果(例如 SELECT my_function(col3) 则不会,因为它不会在 PX 执行器中发生。

您可以尝试通过使用具体化提示或隐藏在多个级别的子查询下来欺骗优化器以并行执行您的函数,但我强烈建议不要这样做。即使跨次要版本,优化器的行为也不稳定,并且可能在更新后突然表现完全不同。这要求在补丁日之后的星期一让许多人不开心。

解决问题的最佳方法是避免将 PL/SQL 应用于结果集,并重写查询以仅使用普通 SQL。在 Oracle 下尤其如此,因为您避免了在 SQL 和 PL/SQL 上下文之间切换的成本。

【讨论】:

    【解决方案2】:

    我遇到了和你一样的问题。我有一个标量函数来计算两点之间的汽车路线

    所以处理时间是线性的,一次计算需要 8 毫秒,但 1000 次计算需要 8 秒。

    我无法在 postgre sql 中进行并行处理,所以我创建了一个 C# 函数来使用 4 个线程向 db 发送多个请求,我实际上将总时间从 8 秒减少到 2 秒。

    您可以在此处查看对我的代码的引用:

    https://codereview.stackexchange.com/questions/155253/splitting-a-list-of-numbers-into-multiple-lists

    关注函数routeParallelGeneration,其中route_source拥有计算路线所需的信息。

    【讨论】:

    • 感谢您的想法。胡安。
    猜你喜欢
    • 1970-01-01
    • 2012-08-12
    • 2015-10-28
    • 2010-10-22
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-26
    相关资源
    最近更新 更多