SQL解析...没有什么大不了的?#oracle(译文)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
简介: 在Oracle中编写SQL语句时,我们都强调使用共享SQL的重要性,换种说法是:在适当的情况下使用绑定变量,我们大多数人可能都已经看过关于这个原则的标准演示。经典的演示是比较两个类似的脚本,其中一个使用生成大量包含字面量的 SQL 语句,另一个使用绑定变量重新重写相同的脚本以获得显著的改进

在Oracle中编写SQL语句时,我们都强调使用共享SQL的重要性,换种说法是:在适当的情况下使用绑定变量,我们大多数人可能都已经看过关于这个原则的标准演示。经典的演示是比较两个类似的脚本,其中一个使用生成大量包含字面量的 SQL 语句,另一个使用绑定变量重新重写相同的脚本以获得显著的改进。这是我编写的一个简单例子:


SQL> create table t ( x int primary key) organization index;
Table created.
SQL> insert into t  2  select rownum from dual  3  connect by level <= 100000;
100000 rows created.
SQL> exec dbms_stats.gather_table_stats('','T');
PL/SQL procedure successfully completed.
SQL> set timing onSQL> declare  2    v int;  3  begin  4    for i in 1 .. 100000 loop  5      select x into v from t where x = i;  6    end loop;  7  end;  8  /
PL/SQL procedure successfully completed.
Elapsed: 00:00:01.56
SQL> set timing onSQL> declare  2    v int;  3  begin  4    for i in 1 .. 100000 loop  5      execute immediate 'select x from t where x = '||i into v;  6    end loop;  7  end;  8  /
PL/SQL procedure successfully completed.
Elapsed: 00:01:04.92

所以通常接下来是手指着花费的时间“看看绑定变量有多棒,看看使用字面量的SQL有多糟糕!”

但最近,有人乐于反驳,即“那又怎样?”他们的观点是:在“糟糕”的示例中,我们每秒执行大约 1600 个语句。这和绑定变量一样好吗?当然不是...但是谁在乎呢?有很多系统每秒 16 个语句就可以了,更不用说 1600 个了。那么,有必要对绑定变量的性能提升大惊小怪吗?虽然这样的观点在其他方面站不住脚——比如多用户场景下的latch的争用,还有SQL注入的风险,但我不会重新强调这些,让我们看看“性能已经够用了”的观点能不能站住脚。

我们不要忘记第一次“绑定变量与字面量”脚本出来的时代。对我个人而言,在90年代初,我的Oracle数据库(版本7)运行在Sparcstation 10上,它具有非常强大且非常昂贵的50 Mhz处理器!😀 (大家可到维基百科上重温一下回忆:https://en.wikipedia.org/wiki/SPARCstation_10 )


因此,在那些日子里,绑定变量和字面量之间的差异是巨大的,因为CPU处理器的周期非常有价值。但我们往往会忘记,正如处理器的发展一样,我们对访问数据的需求也在发展。是的,现代处理器确实可以轻松地处理那些基于字面量的简单主键查找SQL。但现在的SQL并不总是这么简单,如今,SQL就像

处理器一样不断发展——它们可能要复杂得多。那么解析成本会怎样呢?因此,让我们引入一些复杂性,并使用一些更复杂的SQL重新运行我们的测试。

显然,复杂的SQL可能具有很长的执行时间,因此我们将通过使用DBMS_SQL仅解析,而不执行SQL。我们在SQL中将包括几个字典视图,这些视图本身就包含多个字典视图,因此即使SQL只是一个简单的联接,也存在很大的复杂性。





SQL> set timing onSQL> declare  2    c int;  3  begin  4   c := dbms_sql.open_cursor;  5   for i in 1 .. 100000 loop  6      dbms_sql.parse(c,  7        q'{  8        select o.object_name, o.last_ddl_time, sum(s.bytes)  9        from   all_objects o, 10               dba_segments s 11        where  o.owner = s.owner 12        and    o.object_name = s.segment_name 13        and    o.object_type = 'TABLE' 14        and    o.object_id = :1 15        group by o.object_name, o.last_ddl_time 16        }', 17        dbms_sql.native ); 18    end loop; 19    dbms_sql.close_cursor(c); 20  end; 21  /
PL/SQL procedure successfully completed.
Elapsed: 00:00:01.14
SQL> declare  2    c int;  3  begin  4   c := dbms_sql.open_cursor;  5   for i in 1 .. 100000 loop  6      dbms_sql.parse(c,  7        q'{  8        select o.object_name, o.last_ddl_time, sum(s.bytes)  9        from   all_objects o, 10               dba_segments s 11        where  o.owner = s.owner 12        and    o.object_name = s.segment_name 13        and    o.object_type = 'TABLE' 14        and    o.object_id = }'||i|| 15        q'{ 16        group by o.object_name, o.last_ddl_time 17        }', 18        dbms_sql.native ); 19    end loop; 20    dbms_sql.close_cursor(c); 21  end; 22  /
PL/SQL procedure successfully completed.
Elapsed: 10:07:12.71

是的...你没看错!超过 10 个小时来完成所有这些SQL的解析。

所以不能因为CPU变得更加强大和聪明,就忽视了不带绑定变量的SQL对系统的伤害!

京东购物

欢迎购买号主的专著



相关文章
|
12天前
|
负载均衡 Oracle 网络协议
Oracle中TAF与SCANIP全面解析
通过本文的解析,读者可以清晰地理解Oracle中TAF与SCAN IP的概念、工作原理及其在实际应用中的优势和局限性。TAF通过自动故障转移提升了会话的高可用性,而SCAN则通过简化客户端连接和负载均衡提升了集群的可管理性和扩展性。这两种技术在现代企业数据库架构中扮演着重要角色,能够显著提高系统的稳定性和可用性。
31 6
|
7天前
|
SQL 监控 安全
员工上网行为监控软件:SQL 在数据查询监控中的应用解析
在数字化办公环境中,员工上网行为监控软件对企业网络安全和管理至关重要。通过 SQL 查询和分析数据库中的数据,企业可以精准了解员工的上网行为,包括基础查询、复杂条件查询、数据统计与分析等,从而提高网络管理和安全防护的效率。
20 0
|
29天前
|
SQL 监控 数据库
SQL语句是否都需要解析及其相关技巧和方法
在数据库管理中,SQL(结构化查询语言)语句的使用无处不在,它们负责数据的查询、插入、更新和删除等操作
|
29天前
|
SQL 数据可视化 BI
SQL语句及查询结果解析:技巧与方法
在数据库管理和数据分析中,SQL语句扮演着至关重要的角色
|
1月前
|
SQL 监控 关系型数据库
SQL错误代码1303解析与处理方法
在SQL编程和数据库管理中,遇到错误代码是常有的事,其中错误代码1303在不同数据库系统中可能代表不同的含义
|
1月前
|
SQL 存储 关系型数据库
SQL默认索引是什么:深入解析与技巧
在SQL数据库中,索引是一种用于提高查询性能的重要数据结构
|
27天前
|
存储 Oracle 关系型数据库
Oracle数据库的应用场景有哪些?
【10月更文挑战第15天】Oracle数据库的应用场景有哪些?
151 64
|
17天前
|
SQL Oracle 关系型数据库
Oracle数据库优化方法
【10月更文挑战第25天】Oracle数据库优化方法
25 7
|
17天前
|
Oracle 关系型数据库 数据库
oracle数据库技巧
【10月更文挑战第25天】oracle数据库技巧
21 6
|
17天前
|
存储 Oracle 关系型数据库
Oracle数据库优化策略
【10月更文挑战第25天】Oracle数据库优化策略
17 5