Oracle分析功能的成本与双重提取

时间:2014-04-18 20:36:02

标签: sql oracle

我正在尝试从我的人员ID see here中删除重复的行
我使用Analytic函数得到了一个解决方案:

SELECT PersonID, LastName, FirstName, RecordId, RecordType
FROM   (SELECT PersonID, LastName, FirstName, RecordId, RecordType,
               ROW_NUMBER() OVER (PARTITION BY PersonID ORDER BY RecordType ASC) AS rn
        FROM   test_records) t
WHERE  rn = 1


我想了解使用此Analytic函数是否会更昂贵,然后只运行两个连续查询:

  SELECT distinct PersonID from test_records;

然后为每个PersonID(java代码或plsql):

  SELECT * from test_records where PersonID =X and rownum = 1;


比较解释计划和费用是否正确?
增加两个查询的成本并与分析函数成本进行比较是否正确?
谢谢!

2 个答案:

答案 0 :(得分:2)

正确的答案是尝试这两种方法并在您的环境中进行比较。我注意到这两种方法不会产生相同的结果。第一个查询给出了#34;第一个" RecordType。第二行给出一个任意行(我假设row_num应该是rownum

每个人都有好处。仅从SQL的角度来看,第二种方法将使用较少的Oracle资源。唉,这将(我几乎100%肯定)通过运行大量和大量查询的费用来克服。不要忘记循环逻辑和其他所有逻辑。

为什么第一种方法更好?首先,它只是一个查询,因此只会产生一次运行查询的开销。其次,它不需要很多额外的非SQL代码来进行循环等等。第三,查询可以并行运行。第四,Oracle分析功能通常非常快。

在某些情况下,第二种方法可能更好。例如,如果你有1,000,000条记录而且只有一个人,那么第二个肯定会更快。所以,对于哪个更好,这不是一个扣篮。但对于大多数数据分发,我都采用第一种方法。

答案 1 :(得分:2)

要注意的一般规则:

  1. 首选使用内置函数进行分析。由于他们是原生的,因此CBO可以做很多幕后魔术来加快速度。
  2. 如果可以的话,避免多次查询。从您的应用程序发送查询的开销将真正开始累积并导致许多性能问题。如果您在PL / SQL中执行此操作,则会减少惩罚,但效率仍然低于单个查询。
  3. 根据您发布的内容,我建议您使用分析功能。但是,我不确定您在此查询中尝试完成的任务,但看起来这两种方法都不会很好。我不知道这是否可行,但如果可以的话,您可能想要更改架构。

    您似乎以非常讨厌的方式存储数据。 From your other question,看起来你没有办法在桌面上放置好的索引。没有与这些分析函数结合的索引将显着降低该表的可伸缩性。如果你在那里放了几千行,你就会看到一些非常长时间运行的查询。