语句

   

不走索引而是表扫描的字句 

  • “Is null”
  • “<>”,
    “!=”, “!>”, “!<“, 
  • “Not”, “Not exist”, “Not in”, “Not like”
  • “Like ‘%500′”
    (字符串前面有%的)

       

  • NOT IN会数十次扫描表,使用EXISTS、NOT EXISTS ,IN , LEFT OUTEKuga JOIN 来代替,极度是左连接,而Exists比IN更加快,最慢的是NOT操作.借使列的值含有空,在此之前它的索引不起成效,以往三千的优化器能够管理了。同样的是IS NULL,”NOT”, “NOT EXISTS”, “NOT IN”能优化它,而”<>”等依然无法优化,用不到目录。

       

    优化的八个思路:
    根据作业法则优化

  • 例如:

  • 从职业准则角度尽量制止使用distinct

 
account_table中著录用户的不及情状,
想要列出table第11中学享有的用户name(恐怕再度)。

select distinct name from
account_table

选拔所有name都设有且不会重新的一个状态(比方注册行为)来实现同等坚守

select name from account_table
where status = 1

 

  Union all + 调换条件 代替 Union

  遵照业务准绳,尝试把union中不互逆的规格改为互逆的口径

 

 

From 小表驱动大表
from子句中写在最终的表(基础表 driving
table)将被初始拍卖。
from子句中蕴涵七个表的气象下,你不能够不选择记录条数最少的表作为基础表。

假诺有3个以上的表连接查询, 这就供给采纳交叉表(intersection
table)作为基础表,交叉表是指那多少个被此外表所援用的表。

table中著录用户的两样处境。   

无须在Where字句中的列名加函数

如Convert,substring等,借使必须用函数的时候,1.
创建总结列又创立索引来代替. 2.
浮动写法:WHERE SUBST奥德赛ING(firstname,1,1) = ‘m’改为WHERE firstname like ‘m%’(索引围观)。

将函数和列名分开,并且索引无法建得太多和太大。 
 

Where子句中的连接各种

Oracle选用自下而上的逐一剖析where子句,依照那些原理,表之间的连天必须写在其它where条件以前,那三个能够过滤掉最大数目记录的规范化必须写在where子句的结尾。 

  • like模糊查询

    select *
    from contact where username like %yue%’
    table中著录用户的两样处境。第一词%yue%,由于yue后边用到了”%”,由此该查询必然走全表扫描,除非须求,不然不要在重要词前加%。

       

    and 替代 betweentable中著录用户的两样处境。

    不等数据库中也许对between的拍卖差异,分拆成and五个条件能担保科学

  • 例如: where x_date between
    ‘2018-01-01’ and  ‘2018-02-05’ 

  •   ->    where x_date >=  ‘2018-01-01’ and x_table中著录用户的两样处境。date <=
    ‘2018-02-05’ 

    • In字句中
      出现率高优先顺序

    在IN前边值的列表中,将出现最频仍的值放在最前面,出现得最少的放在最终边,收缩剖断的次数
    eg:
    id in (二〇〇八, 2007,
    贰零零伍, 二零零六)

       

    or 替代 in

    a=1 or a=2 假若a=1, 那么a=2将不会被总计和拍卖

    a in(1,2) 假使编写翻译器未有做优化, 则会先说明再剖断, 时间会相对长. 固然编译器做了优化管理, 功能与or至极

       

    between 替代 in

类似id 为int型或只包含整数值的情况


select fields from table where id in (1,2,3,4)

==&gt;

select fields from table where id between 1 and 4

   

**union/union all
替代 or** 

两个条件不互逆使用union,互逆使用union all

   

-- union all 替代 or


   

select fields from table where flag=4 or flag=9

==&gt;

select fields from table where flag=4

union
all 

select fields from table where flag=9


   

-- union 替代 or


   

select fields from table where category
= 'new' or date = '2018-01-26'

==&gt;

select fields from table where category
= 'new'

union 

select fields from table where date =
'2018-01-26'

 

   

   

 

**函数** 

**Count(\*)** 

count(1) count(\*)
count(列名) 

--  https://www.cnblogs.com/Caucasian/p/7041061.html
  • Select COUNT(*)的成效好低,尽量变通写法,而EXISTS快.同一时间请留意区分: select
    count(Field of null) from Table 和 select
    count(Field of NOT null) from Table 的再次回到值是例外的! 

    语句 1:

    where stt.date_of_settlement <=
    @ddt

    and stt.date_of_settlement >=
    khb.date_of_settlement

    and stt.date_of_settlement >=
    crm.date_of_begin

    and stt.date_of_settlement <
    crm.date_of_end

    and stt.date_of_settlement >=
    scrm.date_of_begin

    and stt.date_of_settlement <
    scrm.date_of_end

    改进
    2:

    where stt.date_of_settlement

BETWEEN
greast(khb.date\_of\_settlement, crm.date\_of\_begin,
scrm.date\_of\_begin) and @ddt  

and stt.date\_of\_settlement &lt;
least(crm.date\_of\_begin, scrm.date\_of\_end) 

   

相关文章