数据库的多表大数据查询应如何优化?
专业回答
信息系统架构师 XX研究所软件研发
1.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。
3.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
4.in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
5.尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。
见如下例子:
SELECT * FROM T1 WHERE NAME LIKE ‘%L%’
SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’
SELECT * FROM T1 WHERE NAME LIKE ‘L%’
即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。
6. 必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
SELECT * FROM T1 WHERE F1/2=100
应改为:
SELECT * FROM T1 WHERE F1=100*2
SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’
应改为:
SELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’
SELECT member_number, first_name, last_name FROM members
WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21
应改为:
SELECT member_number, first_name, last_name FROM members
WHERE dateofbirth < DATEADD(yy,-21,GETDATE())
即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
11.很多时候用 exists是一个好的选择:
elect num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)
SELECT SUM(T1.C1)FROM T1 WHERE(
(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)
SELECT SUM(T1.C1) FROM T1WHERE EXISTS(
SELECT * FROM T2 WHERE T2.C2=T1.C2)
两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。
select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
select id from t where num=0
2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。优化器将无法通过索引来确定将要命中的行数,因此需要搜索该表的所有行。
3.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
可以这样查询:
select id from t where num=10
union all
select id from t where num=20
4.in 和 not in 也要慎用,因为IN会使系统无法使用索引,而只能直接搜索表中的数据。如:
select id from t where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:
select id from t where num between 1 and 3
5.尽量避免在索引过的字符数据中,使用非打头字母搜索。这也使得引擎无法利用索引。
见如下例子:
SELECT * FROM T1 WHERE NAME LIKE ‘%L%’
SELECT * FROM T1 WHERE SUBSTING(NAME,2,1)=’L’
SELECT * FROM T1 WHERE NAME LIKE ‘L%’
即使NAME字段建有索引,前两个查询依然无法利用索引完成加快操作,引擎不得不对全表所有数据逐条操作来完成任务。而第三个查询能够使用索引来加快操作。
6. 必要时强制查询优化器使用某个索引,如在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然 而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:
select id from t where num=@num
可以改为强制查询使用索引:
select id from t with(index(索引名)) where num=@num
7.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:
SELECT * FROM T1 WHERE F1/2=100
应改为:
SELECT * FROM T1 WHERE F1=100*2
SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’
应改为:
SELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’
SELECT member_number, first_name, last_name FROM members
WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21
应改为:
SELECT member_number, first_name, last_name FROM members
WHERE dateofbirth < DATEADD(yy,-21,GETDATE())
即:任何对列的操作都将导致表扫描,它包括数据库函数、计算表达式等等,查询时要尽可能将操作移至等号右边。
8.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id
select id from t where datediff(day,createdate,'2005-11-30')=0--‘2005-11-30’生成的id
应改为:
select id from t where name like 'abc%'
select id from t where createdate>='2005-11-30' and createdate<'2005-12-1'
9.不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
10.在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
11.很多时候用 exists是一个好的选择:
elect num from a where num in(select num from b)
用下面的语句替换:
select num from a where exists(select 1 from b where num=a.num)
SELECT SUM(T1.C1)FROM T1 WHERE(
(SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)
SELECT SUM(T1.C1) FROM T1WHERE EXISTS(
SELECT * FROM T2 WHERE T2.C2=T1.C2)
两者产生相同的结果,但是后者的效率显然要高于前者。因为后者不会产生大量锁定的表扫描或是索引扫描。
为您推荐:
2014-10-20 10:45
提问者采纳
视图的唯一优势就是简化开发时查询的SQL,效率上和直接查询没有区别。 而实体表可以用来做汇聚,这个虽然查询很快但缺点是它是静态的,如果客户信息发生变化就要重新汇聚才能保证信息准确。
追问:
因为要在前台进行查询啊,如果直接在前台的程序中直接进行sql即时查询,400w+的数据一张一张的连接费时的很,所以要考虑直接在数据库中用一张表存储拼接后的各业务数据,这样前台用到的时候直接去查这张表就行了
追答:
那就是做汇聚咯,静态表肯定是最快的。但缺点我上面也提到了。
追问:
重新汇聚的缺点不用考虑,因为业务表也是每天都要重新加载的,主要问题还是怎么做表汇聚,如何优化速度更快
追答:
汇聚就后台执行,搞个定时的批处理或者使用oracle的job,每天凌晨1点左右跑一次汇聚的sql。 汇聚完毕后,前台就可以直接查询这个静态表,然后呈现时做好分页就OK了啊。
相关推荐
K-DB数据库技术,作为新一代融合数据处理技术的展望,是由金学东先生在浪潮提出的。K-DB技术涉及多个方面的数据分析与处理,包括OLTP(联机事务处理)、OLAP(联机分析处理)、大数据及非结构化数据处理等。本文将...
《K-DB新一代融合数据处理技术展望》这篇文章深入探讨了当前数据处理领域的最新进展,特别是K-DB系统在其中扮演的重要角色。K-DB是一种创新的数据库管理系统,它结合了多种数据处理技术,旨在提供更高效、灵活和可...
在本文中,我们将深入探讨如何使用C#编程语言来读取西门子PLC(可编程逻辑控制器)的DB(数据块)...通过学习这个DEMO,开发者能够掌握如何连接PLC,读取DB块数据,并对其进行处理,从而实现更复杂的自动化控制任务。
"利用DB-Library访问SQL Server来提高数据处理速度的方法" DB-Library是Sybase公司开发的一种数据库访问接口,它提供了一个统一的接口来访问不同的数据库管理系统,包括SQL Server。DB-Library可以帮助开发者快速地...
这个"西门子DB数据Demo"项目利用了开源类库Snap7,它使得开发者能够便捷地与西门子PLC进行交互,而无需购买昂贵的第三方库。 首先,让我们了解一下Snap7库。Snap7是为.NET Framework设计的一个全面的库,支持TCP/IP...
总的来说,DB2DB是一款功能强大的数据库转换工具,它的出现极大地简化了不同数据库系统之间的数据迁移和同步工作。无论是在企业级的系统升级,还是小型项目的数据库调整,都能提供高效、可靠的支持。通过熟练掌握并...
滑坡监测是地质灾害防治中的一...对于专业人士而言,理解和掌握基于DB小波阈值法的数据处理技术是非常有价值的,它能够帮助研究者和工程师更有效地对滑坡监测数据进行分析和处理,进而为滑坡的预防和治理提供决策支持。
在本资料包“TIA博途DB块清零(非优化的DB块)-通用FC全局库文件-GF-Reset-DB-V17版本.zip”中,我们关注的是如何处理非优化的DB块并进行清零操作。 首先,非优化的DB块是指那些在程序执行过程中没有达到最佳效率的DB...
1. 大块事务:优化的DB块可以支持更大的单个事务,允许一次性处理更多的数据,减少了事务处理中的磁盘I/O次数。 2. 更大的行大小:针对大行数据,优化的DB块可能设置为更大的尺寸,以避免行溢出和额外的I/O操作。 3....
本文将深入探讨两种数据迁移工具——DB2DB和mysql to oracle,以及它们在不同数据库间迁移数据的关键知识点。 首先,DB2DB工具,正如其名,专门用于在IBM的DB2数据库之间进行数据迁移。DB2是一款强大的关系型数据库...
而将I1.0映射到一个DB数据块的变量,如DB1.DBW0,意味着在程序中只需要改变DB1.DBW0的赋值,就可以实现所有引用的更新,极大地提高了代码的可维护性和修改效率。 其次,映射到V数据存储区也具有类似的好处。在S7-...
4. **事务处理**:为了确保数据的一致性,DB2DB 可能会使用事务来执行迁移操作,确保在迁移过程中如果发生错误,可以进行回滚,保持数据的完整性。 5. **日志记录与报告**:在迁移过程中,工具会记录详细的日志信息...
MongoDB与Hadoop MapReduce的海量非结构化数据处理方案 ...本文的MongoDB与Hadoop MapReduce的海量非结构化数据处理方案旨在解决大数据时代下的数据处理难题,为大数据处理提供了一种高效、可靠的解决方案。
### DB29.7数据移动指南和参考 #### 概述 DB29.7数据移动指南和参考是一份详尽的技术文档,旨在为用户...通过掌握这些工具的功能和用法,用户可以更加自信地处理复杂的数据迁移任务,从而提高工作效率和数据处理能力。
### DB29.7数据恢复及高可用性指南与参考 #### 一、DB29.7概述 DB29.7是IBM公司推出的一款针对Linux、UNIX和Windows操作系统的高性能数据库管理系统。它旨在为企业级应用提供可靠的数据管理和处理能力,并支持多种...
### db2db配置详细说明 #### 一、db2db简介 `db2db`是一款功能强大的数据库同步工具,能够实现不同数据库之间的...此外,通过设置定时任务,可以实现自动化、定期的数据同步过程,极大地提高了数据处理效率和准确性。
数据挖掘和大数据处理是现代信息技术领域的核心组成部分,它们涉及到从海量数据中提取有价值的信息和洞察。在这个经验笔记中,我们将探讨数据挖掘的整体流程,数据库编程技巧,以及处理大数据的关键概念。 首先,...
1. 高效修复:这款工具能够处理各种类型的DB文件损坏情况,包括结构损坏、记录丢失、页头损坏等,对绝大多数损坏的DB文件都能进行有效修复。 2. 易于使用:作为一个小型应用程序,它通常具有直观的用户界面,使得非...
同时,考虑到隐私和合规性问题,使用此类数据时应确保符合相关的数据保护法规,尤其是处理涉及个人位置信息时。 综上所述,“global_area.db”是一个包含全球地区信息的数据库文件,具备中英文双语,适用于多种应用...