字符串Concat与查询中的子字符串 - 哪个性能更好?

时间:2014-07-24 11:05:02

标签: sql oracle

我有2个表,比如table1和table2,样本数据如下:

Table1 (User_id)
--------------------
    X1011
    X1175
    X1234

Table2 (User_id)
-----------------    
    1011
    1175
    1234

我需要编写一个带有where条件的查询,我将比较这两个值。一般而言,下列哪一项更好/可取,为什么?

1. WHERE TABLE1.USER_ID = 'X' || TABLE2.USER_ID;

2. WHERE TABLE1.USER_ID = CONCAT ('X', TABLE2.USER_ID);

3. WHERE SUBSTR(TABLE1.USER_ID,2) = TABLE2.USER_ID;

两列都已编入索引。

2 个答案:

答案 0 :(得分:2)

回答性能问题的方法是测试数据和系统上的不同选项。

除了对执行计划的影响之外,我不希望这些表现完全不同。在函数中包装列时,会影响执行计划。首先它影响索引的使用,其次它影响用于选择各种底层算法的统计数据。函数的实际执行(很可能)影响很小。

我建议你创建一个功能索引。例如,使用第三个例子:

create index idx_table1_f1 on table1(substr(user_id, 2));

或者第二个例子:

create index idx_table2_f1 on table2(CONCAT('X', TABLE2.USER_ID));

除了修复数据结构以使密钥真的相同之外,这可能是您提高性能的最佳步骤。

答案 1 :(得分:1)

实施例1和2是等同的。选择介于1和3之间取决于表格的前导和连接中的前导(如果您要使用连接)。无论如何给出你将要使用的实际查询,至少,这些表的行数将有助于给你答案。

而且,你可以尝试一起使用1和3。因此,优化器可以根据统计信息更改最佳访问路径。

相关问题