sql优化一:时间字段
2012-10-25 11:34
169 查看
当数据库中数据量很大或一次查询需要等待很长时间才会显示查询结果时,我们就要考虑sql的优化了
sql优化中有很重要的一点,不要使用函数,以oracle为例,即使字段上建有索引,但是如果对该字段的查询包含数据库函数,
数据库在进行查询时是不会使用索引的,此时索引失去了预期的作用,并且数据库维护这个并没有用到的索引还有些许性能开销
在支持多个数据库的项目中这个问题也是比较常见的:
如果忘记进行格式转换,就会产生如下问题
查询语句却是这种情况
最终的结果是执行了下面这么一个语句
显然是错误的,但是换一种方式来试一下
一点问题都没有,当查询数据量较大时,每次都先进行时间格式转换再进行时间判断会严重影响性能
如果查询语句中的时间字符串格式和数据库默认时间格式一致,在查询时就不需要首先转换时间格式,
更重要的一点,对于oracle数据库,查询时将会利用建在时间字段上的索引进行查询
对于时间格式来说,有几个参数比较重要
NLS_DATE_FORMAT
NLS_TIME_FORMAT
NLS_TIMESTAMP_FORMAT
当然,下面还有几个带timezone的时间格式,不过timezone不是很常用到,可以不修改
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不是很常用到,可以不修改
相关文章推荐
- sql优化:从设计表结构开始(SQL Server中如何让数据库中某一个字段随时间自动更新?)
- [Oracle]sql优化-时间字段
- paip.程序功能时间性能优化及SQL语句优化
- sql 时间转换格式 convert(varchar(10),字段名,转换格式)
- oracle sql 合并,分解时间字段
- SQL的优化整理以及时间信息(持续更新)+ 中级以上sql
- SQL里怎么用Like搜时间字段
- SQL记录查找时间字段
- 转 sql 时间转换格式 convert(varchar(10),字段名,转换格式)
- 一个Web报表项目的性能分析和优化实践(一):小试牛刀,统一显示SQL语句执行时间
- asp.net/c#下用参数化SQL访问时间字段
- sql大字段Lob查询优化,防止内存溢出!
- 浅谈sql 时间转换格式 convert(varchar(10),字段名,转换格式)
- SQL 综合运用(SQL Server 2005)(别名、时间处理、字段处理、联合查询……)
- JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法
- sql 中 如果添加 时间戳 字段 timestamp
- 拆分字段优化SQL
- 一个Web报表项目的性能分析和优化实践(一):小试牛刀,统一显示SQL语句执行时间
- JAVA 处理时间 - java.sql.Date、java.util.Date与数据库中的Date字段的转换方法 转载自:
- SQL语句格式化时间字段