Decode vs Joining Table

时间:2014-04-14 23:56:18

标签: sql oracle

我有一个类似于下面的查询,其中我在几个表中加入以获取所需的数据。我明确地加入了两个表(TableATableB,以便稍后我可以在TableB上放置where条件

我想知道以下哪个选项使用的资源更少。但是,性能更好,因此速度更快?

方法1

            SELECT
                TB.Column1,
                --Other Columns
            FROM 
               TableA TA
               INNER JOIN TableB TB ON (TA.Column1= TB.Column2)
              -- Some other Joins
            Where 
               TB.Column1 in ("Option1", "Option2"........,"Option12")

方法2

         SELECT
              DECODE(TA.Column1, 'AAAAAAAAAAAAA', 'Option1',
                    'BBBBBBBBBBBB', 'Option2',
                    .
                    .
                    .
                    'LLLLLLLLLLLLLL','Option12'),
             --Other Columns
         FROM 
               TableA TA
              -- Some other Joins
         WHERE TA.Column1 in ('AAAAAAAAAAAA',....,'LLLLLLLLLLLLLLLLLL')

我检查了Toad中的查询时间,结果令人困惑。对于较小的数据集,方法2似乎表现更好,但对于更大的数据集方法1更快。

1 个答案:

答案 0 :(得分:0)

为了获得最佳性能,我建议如下:

  1. 如果TB.Column1只包含您感兴趣的值,则删除where子句,内部联接将为您过滤。

  2. 如果没有,则将布尔列添加到tb(例如MySelectFlag),将此项查询中的项目设置为1,然后您的联接成为

    INNER JOIN TableB TB ON (TA.Column1= TB.Column2) AND TB.MySelectFlag = 1
    
  3. 这将非常快(特别是如果你向TB.MySelectFlag添加一个索引)