我正在尝试从我的人员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;
比较解释计划和费用是否正确?
增加两个查询的成本并与分析函数成本进行比较是否正确?
谢谢!
答案 0 :(得分:2)
正确的答案是尝试这两种方法并在您的环境中进行比较。我注意到这两种方法不会产生相同的结果。第一个查询给出了#34;第一个" RecordType
。第二行给出一个任意行(我假设row_num
应该是rownum
。
每个人都有好处。仅从SQL的角度来看,第二种方法将使用较少的Oracle资源。唉,这将(我几乎100%肯定)通过运行大量和大量查询的费用来克服。不要忘记循环逻辑和其他所有逻辑。
为什么第一种方法更好?首先,它只是一个查询,因此只会产生一次运行查询的开销。其次,它不需要很多额外的非SQL代码来进行循环等等。第三,查询可以并行运行。第四,Oracle分析功能通常非常快。
在某些情况下,第二种方法可能更好。例如,如果你有1,000,000条记录而且只有一个人,那么第二个肯定会更快。所以,对于哪个更好,这不是一个扣篮。但对于大多数数据分发,我都采用第一种方法。
答案 1 :(得分:2)
要注意的一般规则:
根据您发布的内容,我建议您使用分析功能。但是,我不确定您在此查询中尝试完成的任务,但看起来这两种方法都不会很好。我不知道这是否可行,但如果可以的话,您可能想要更改架构。
您似乎以非常讨厌的方式存储数据。 From your other question,看起来你没有办法在桌面上放置好的索引。没有与这些分析函数结合的索引将显着降低该表的可伸缩性。如果你在那里放了几千行,你就会看到一些非常长时间运行的查询。