`
yingwuhahahaha
  • 浏览: 17615 次
  • 性别: Icon_minigender_1
  • 来自: 南京
最近访客 更多访客>>
社区版块
存档分类
最新评论

一个复杂的SQL语句优化的疑惑

阅读更多

背景:两个表workacacdata.movementdata.

movementdata中为日期提供过滤,及db_id提供过滤(此表中db_id是主键,唯一)

workacacdata中存在三种数据(此表中db_id不唯一,引用自上表)

A类型

    recordkind的顺序为

   A101 ->其他->A110   或者    A101->其他(不包括A110)

B类型   A110->A101->其他->A110

C类型   A110->A101->其他  

 

数据的db_id相同代表数据属于同一组,每一组数据只属于一种类型A或B或C

 

相同db_id的一组数据 用record_id来表示它插入的顺序

 

所以

对A类数据来说

 

record_kind=A101的数据的record_id肯定小于和它同组的record_kind=A110的数据的record_id

 

以此类推

B类型数据:必存在两个record_kind=A110 的和一个record_kind=A101的数据,且 record_kind=A101的数据的record_id在三者record_id中排序居中

 

C........

 

要求:

取出所有A类型数据的开始日期

delivery_start_date

 

 看起来超复杂,感觉做了很多次的重复查询.

于是修改之:

 

 结果却不尽如人意,修改后的语句怎么看执行的查询数也不多啊,可用SQLServer自带的性能分析工具一测,优化后的反而更慢.

尤其在日期条件发生变化后.

 

 

修改后的语句read指数明显减少,但cpu指数明显增加

 

难道是我测试的表不够大???

workacacdata表1400条

movementdata表80条

 

 

原sql语句:

select distinct( convert(char(10),delivery_start_date,112)  ) as selectdate 
from movementdata  

where (

delivery_start_date >= '2008-04-24 00:00:00' and 

delivery_start_date < '2008-07-26 00:00:00') and  
(
(
--选出A和B类型
		(db_id in  
			  (select db_id from  

				    (
				    select 
				    a.db_id, 
				    count(a.record_kind) as cnt 
				    from workacacdata a, workacacdata b,movementdata c 
				    where 
				    (upper(a.record_kind)='A110') and 
				    (upper(b.record_kind)='A201') and 
				    a.db_id=c.db_id and 
				    c.delivery_start_date >= '2008-04-24 00:00:00' and 
				    c.delivery_start_date < '2008-07-26 00:00:00' and 
				    a.db_id=b.db_id 
				    group by a.db_id
				    ) 

			  deliverytbl 
			  where (cnt=1)
			  )
		) and  

--选出A存在A110数据
		(db_id in  
				    (
				    select a.db_id as db_id 
				    from workacacdata a, workacacdata b,movementdata c 
				    where 
				    upper(a.record_kind)='A101' and 
				    upper(b.record_kind) = 'A110' and 
				    a.db_id=c.db_id and 
				    c.delivery_start_date >= '2008-04-24 00:00:00'and 
				    c.delivery_start_date < '2008-07-26 00:00:00' and 
				    a.db_id = b.db_id and 
				    a.record_id<b.record_id
				    )
		)
) 
--选出不存在A110的A类型数据
or  	(    
        db_id in  
        	 		(
        	 		select distinct(db_id) 
        	 		from movementdata  
        	 		where 
        	 		delivery_start_date >= '2008-04-24 00:00:00' and 
        	 		delivery_start_date < '2008-07-26 00:00:00' and 
        	 		db_id not in 
       	 					(
      	 					select distinct(a.db_id) 
     	 					from workacacdata a,movementdata b  
        	 					where 
       	 					a.db_id=b.db_id and 
      	 					b.delivery_start_date >= '2008-04-24 00:00:00' and 
     	 					b.delivery_start_date < '2008-07-26 00:00:00'  and 
        	 					upper(a.record_kind)='A110'
        	 					)
    				)

       )
) 
order by selectdate 

 

 

 

 

修改后的语句:

--选出所有不同的db_id,包括A.B.C
select distinct( convert(char(10),delivery_start_date,112)  )
	from workacacdata a,movementdata b 
	where
	b.delivery_start_date >= '"+start_time+"' and 
	b.delivery_start_date < '"+end_time+"'  and 
	upper(a.record_kind)='A101' and
	a.db_id=b.db_id and
--排除B和C类型的	
a.db_id not in(
--选出B和C类型的
	select a.db_id as db_id
	from workacacdata a,movementdata b ,workacacdata c
	where
	b.delivery_start_date >= '"+start_time+"' and 
	b.delivery_start_date < '"+end_time+"'  and
	upper(a.record_kind)='A101' and
	a.db_id=b.db_id and
	upper(c.record_kind) = 'A110' and
	c.db_id=a.db_id and
	c.record_id<a.record_id 
) 

 

分享到:
评论

相关推荐

    T-SQL编程大全完全解析

    6. **批处理语句**:批处理是指将多个SQL语句组合在一起,一次性提交给数据库执行。了解批处理的机制和优点,如提高性能,减少网络通信,以及如何使用GO关键字分隔语句,对于优化数据库操作非常重要。 在本章中,...

    ACCP北大青鸟4.0—SQL(含PPT及所有代码)

    通过运行和修改这些代码,学生能掌握SQL语句的编写,理解如何创建数据库、设计表结构、执行复杂的查询、实现数据更新和删除操作。 3. **教学指导书源代码** - 可能包含了教师的教学示例和解答,帮助学生解决疑惑,...

    读懂oracle的执行计划

    2. **SQL*Plus AUTOTRACE**:这是一个在执行SQL语句时提供执行计划的工具。它同样要求有plan_table存在,并且实际执行SQL语句。虽然能够提供真实的执行计划,但使用除EXPLAIN PLAN之外的语句时,所生成的执行计划...

    oracle优化笔记

    那 SQL2 如何优化,哦,好简单,就是在 name 列建一个索引就好了。索引在这条 SQL 中因为可以让应用少做事和不做事,最终到了速度大幅度提升,果然,优化后的执行速度从 原来的 20 秒缩减为 1 秒。 到此优化完毕,...

    LinQer翻译软件

    另一方面,LinQer还提供了一个反向功能,即从Linq代码生成SQL语句。这在调试和优化查询性能时特别有用,因为有些情况下,查看底层生成的SQL可以帮助我们更好地理解查询的执行逻辑,以及可能存在的性能瓶颈。 在实际...

    微软c# SqlServer编程规范

    - **事务管理**:在执行多条SQL语句时,考虑使用事务确保数据一致性。 - **安全性**:遵循最小权限原则,限制数据库用户访问特定资源,使用强密码策略。 - **存储过程和函数**:合理使用存储过程和用户定义函数,...

    jsp+sql操作系统教学网站的设计与实现(毕设+源代码).zip

    本项目主要涵盖了使用Java服务器页面(JSP)技术和SQL数据库来构建一个操作系统教学网站的全过程。这个教学网站旨在为计算机科学和技术的学生提供一个互动的学习平台,使他们能够深入理解操作系统的原理与实践。 一...

    oracle&sql

    这个文件很可能是一个关于SQL的通用帮助文件,可能涵盖了更广泛的SQL语法和概念,不仅限于Oracle数据库。它可能包括SQL的各个部分,如DQL(数据查询语言)用于查询数据,DDL(数据定义语言)用于定义表结构,DCL...

    mysqlsqljc

    至于mysqlsqljc,这可能是一个目录名或者教程的主体部分,可能包含了各种SQL语句的实例、练习题和解决方案。在学习MySQL SQL时,了解基本的数据库概念如表、字段、主键、外键至关重要。SQL的主要命令包括SELECT用于...

    Oracle_PlSql帮助文档.zip

    2. **Oracle_PlSql存储过程.doc**:存储过程是PL/SQL的重要组成部分,它是预编译的SQL语句集合,可以在数据库中执行复杂的业务逻辑。这个文档很可能是关于如何创建、调用和管理Oracle PL/SQL存储过程的详细教程,...

    DB2一千问

    "DB2一千问"无疑是一个全面涵盖DB2使用、管理和优化问题的资源集合,旨在帮助用户解决在实际操作中遇到的各种疑惑。这里我们将从多个方面对DB2进行深入探讨。 一、DB2基础概念 1. 什么是DB2?它有哪些版本? DB2是...

    oracle OCP认证学习资料

    4. 性能优化:掌握SQL性能分析工具如EXPLAIN PLAN,了解索引原理,优化查询语句,以及使用SQL Tuning Advisor。 5. 高可用性与备份恢复:理解RAC(Real Application Clusters)、Data Guard、闪回技术以及备份和恢复...

    Oracle常用傻瓜问题1000问

    - SQL Tuning Advisor:自动优化SQL语句的工具。 - 分区技术:通过将大表分成小部分,提高查询效率和管理灵活性。 6. **故障排查**: - Alert Log:记录数据库运行时的警告和错误信息。 - V$视图:提供关于...

    四级数据库工程师练习软件

    软件包含数据库性能监控、索引优化、查询优化等方面的内容,模拟真实环境下的数据库管理问题,让用户学习如何调整配置参数、创建和使用索引,以及优化SQL查询语句,提升系统性能。 五、实战演练 该软件提供模拟考试...

    mysql书籍学习笔记.rar

    《MySQL数据库应用从入门到精通》是一本深入浅出的MySQL学习资料,涵盖了数据库的基础概念、安装配置、SQL语句的使用以及高级特性的探讨。通过这本书的学习,读者可以了解到MySQL在实际工作中的广泛应用和重要性。...

    关于达梦数据库的表空间在线迁移数据文件的疑惑

    总的来说,达梦数据库的表空间在线迁移数据文件是一个涉及多个步骤的过程,需要对数据库操作有深入理解。在遇到问题时,可以尝试手动执行SQL命令来调试和解决问题。同时,确保在执行这些操作时有足够的权限,并在...

    北大青鸟三单元项目

    SQL语句.txt文件则包含了一系列的SQL查询命令,学习者可以通过这些例子学习如何创建、修改和查询数据库表,这是所有数据驱动应用程序的基础。 "学士后Java工程师第三单元阶段项目需求及评分.pdf"文档提供了项目的...

    图书馆管理系统 asp 课程设计

    6. 性能优化:对于大量数据的操作,考虑使用存储过程,预编译SQL语句,以提高查询速度。 7. 安全性:防止SQL注入、XSS攻击等安全问题,确保用户信息的安全。 通过这个“图书馆管理系统 asp 课程设计”,学习者可以...

    人工智能-项目实践-C#-基于oracle的题库系统.zip

    在题库系统中,Oracle将用来存储题目、答案、分类等信息,并通过SQL语句进行数据操作。我们需要了解Oracle的数据类型、表结构设计、索引优化以及事务处理等核心概念,确保数据的安全性和一致性。 人工智能在题库...

Global site tag (gtag.js) - Google Analytics