欢迎投稿

今日深度:

Oracle中的DETERMINISTIC,deterministic

Oracle中的DETERMINISTIC,deterministic


   多次看到DETERMINISTIC,一直很疑惑,今天做了一个实验。我们欺骗ORACLE说是一个DETERMINISTIC函数,它在SQL中只调用一次。如果不使用DETERMINISTIC,可以看到出来的值都不一样。使用DETERMINISTIC后,不同的会话都出来一样的值。

SQL> create or replace function f_t(i_p int) return number DETERMINISTIC is

      i_rtn number;
    begin
      i_rtn := i_p * dbms_random.value(1,10);
      return i_rtn;
    end;
    /
函数已创建。

session1:
SQL> select LEVEL,f_t(1) FROM DUAL CONNECT BY LEVEL<=10;
     LEVEL     F_T(1)
---------- ----------
         1 2.55732959
         2 2.55732959
         3 2.55732959
         4 2.55732959
         5 2.55732959
         6 2.55732959
         7 2.55732959
         8 2.55732959
         9 2.55732959
        10 2.55732959
已选择10行。


session2:
SQL> select LEVEL,f_t(1) FROM DUAL CONNECT BY LEVEL<=10;
     LEVEL     F_T(1)
---------- ----------
         1 2.55732959
         2 2.55732959
         3 2.55732959
         4 2.55732959
         5 2.55732959
         6 2.55732959
         7 2.55732959
         8 2.55732959
         9 2.55732959
        10 2.55732959
已选择10行。


SQL> create or replace function f_t(i_p int) return number is
       i_rtn number;
    begin
       i_rtn := i_p * dbms_random.value(1,10);
       return i_rtn;
    end;
    /
函数已创建。


SQL> select LEVEL,f_t(1) FROM DUAL CONNECT BY LEVEL<=10;
     LEVEL     F_T(1)
---------- ----------
         1 8.48649118
         2  8.9396978
         3  2.2786135
         4 5.29205905
         5 5.32847713
         6 8.70095819
         7 6.20471031
         8 2.00101537
         9 3.53814265
        10 3.64991086
已选择10行。

oracle中:=与=:的不同?

变量绑定 是指在sql语句的条件中使用变量而不是常量。比如shared pool里有两条sql语句,
select * from tab1 where col1=1;
select * from tab1 where col1=2;
对oracle数据库来说,这是两条完全不同的SQL,对这两条语句都需要进行hard parse。因为oracle会根据sql语句的文本去计算每个字符在内存里的hash值,因此虽然上述两条SQL只有一个字符不一样,oracle根据hash算法在内存中得到的hash地址就不一样,所以oracle就会认为这是两条完全不同的语句。而如果将上述SQL改写成select * from tab1 where col1=:var1;,然后通过对变量var1的赋值去查询,那么oracle对这条语句第一次会进行hard parse,以后就只进行soft parse。假设某条语句被重复执行了几十万次,那么使用bind var带来的好处是巨大的。一个应用程序如果bind var使用不充分,那么几乎一定会伴随着严重的性能问题。

绑定变量是相对文本变量来讲的,所谓文本变量是指在SQL直接书写查询条件,这样的SQL在不同条件下需要反复解析,绑定变量是指使用变量来代替直接书写条件,查询bind value在运行时传递,然后绑定执行。优点是减少硬解析,降低CPU的争用,节省shared_pool ;缺点是不能使用histogram,sql优化比较困难
 

Oracle中 $ 干什的

$ 在oracle常见于:

1.正则表达式:
它表示一行的末尾,如:
SQL> SELECT description, REGEXP_INSTR(description,'ing$') where_it_is
2 FROM testTable
3 WHERE REGEXP_INSTR(description,'ing$') > 0;

DESCRIPTION WHERE_IT_IS
---------------------------------------- -----------
2003 Movie showing 16

2. 系统视图/伪表:
如:sys.tab$
x$ktfbue
v$session

这些都由系统维护,用户不能修改。
 

www.htsjk.Com true http://www.htsjk.com/shujukunews/2600.html NewsArticle Oracle中的DETERMINISTIC,deterministic 多次看到DETERMINISTIC,一直很疑惑,今天做了一个实验。 我们欺骗ORACLE说是一个DETERMINISTIC函数,它在SQL中只调用一次。如果不使用 DETERMINISTIC,可以看到...
相关文章
    暂无相关文章
评论暂时关闭