sql优化一:时间字段

当数据库中数据量很大或一次查询需要等待很长时间才会显示查询结果时,我们就要考虑sql的优化了

sql优化中有很重要的一点,不要使用函数,以oracle为例,即使字段上建有索引,但是如果对该字段的查询包含数据库函数,

数据库在进行查询时是不会使用索引的,此时索引失去了预期的作用,并且数据库维护这个并没有用到的索引还有些许性能开销

在支持多个数据库的项目中这个问题也是比较常见的:

oracle:select a.time from D_TIME a where a.time > 
    to_date('2012-10-10 10:10:10','yyyy-mm-dd hh24:mi:ss') 
sybase:select a.time from D_TIME a where a.time >
    convert(datetime,'2012-10-10 10:10:10',101)

如果忘记进行格式转换,就会产生如下问题

SQL> select sysdate from dual;

SYSDATE
--------------
25-10月-12

查询语句却是这种情况

select a.time from D_TIME a where a.time > sysdate

最终的结果是执行了下面这么一个语句

select a.time from D_TIME a where '2012-10-10 10:10:10'>'25-10月-12'

显然是错误的,但是换一种方式来试一下

SQL> select 1 from dual where '26-10月-12'>sysdate;

         1
----------
         1

一点问题都没有,当查询数据量较大时,每次都先进行时间格式转换再进行时间判断会严重影响性能

如果查询语句中的时间字符串格式和数据库默认时间格式一致,在查询时就不需要首先转换时间格式,

更重要的一点,对于oracle数据库,查询时将会利用建在时间字段上的索引进行查询

SQL> select * from nls_database_parameters;

PARAMETER
------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_LANGUAGE
AMERICAN

NLS_TERRITORY
AMERICA

NLS_CURRENCY
$


PARAMETER
------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_ISO_CURRENCY
AMERICA

NLS_NUMERIC_CHARACTERS
.,

NLS_CHARACTERSET
AL32UTF8


PARAMETER
------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_CALENDAR
GREGORIAN

NLS_DATE_FORMAT
DD-MON-RR

NLS_DATE_LANGUAGE
AMERICAN


PARAMETER
------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_SORT
BINARY

NLS_TIME_FORMAT
HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT
DD-MON-RR HH.MI.SSXFF AM


PARAMETER
------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_TIME_TZ_FORMAT
HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT
DD-MON-RR HH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY
$


PARAMETER
------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_COMP
BINARY

NLS_LENGTH_SEMANTICS
BYTE

NLS_NCHAR_CONV_EXCP
FALSE


PARAMETER
------------------------------------------------------------
VALUE
--------------------------------------------------------------------------------
NLS_NCHAR_CHARACTERSET
AL16UTF16

NLS_RDBMS_VERSION
10.2.0.1.0


20 rows selected.

对于时间格式来说,有几个参数比较重要

NLS_DATE_FORMAT

NLS_TIME_FORMAT

NLS_TIMESTAMP_FORMAT

当然,下面还有几个带timezone的时间格式,不过timezone不是很常用到,可以不修改


 

转载于:https://www.cnblogs.com/sean-zou/archive/2012/10/25/3710103.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值