`
wanglei8
  • 浏览: 68347 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

SQL语句重构

阅读更多
消除重复的模式(union之类的集合操作符的不同部分;子查询中的select,from,where子句中;from子句中以各种其他方式出现的引用) 技术:case,汇总技术; with子句;去掉没必要的distinct转移到子查询;min之类的函数会忽略null;去掉无用的连接;union去掉了重复记录,因此distinct不是必要的;如果有外部连接需要返回记录,则外连接没有意义会更慢,应该改为内连接; in() 隐含着一个distinct
玩转子查询
及早启用过滤条件
简化条件(让访问每个表的次数尽可能的少)
  如果几个子查询引用的是同一个表,那么就检查一下是否能一遍就收集到所有的信息
and c1 in (select col1 from t1 where ...)
and c2 in (select col2 from t1 where ...)

select ...
  from a, (select distinct col1, col2
              from t1
             where ... or ...) b
where a.c1 = b.col1
  and a.c2 = b.col2

  相反,如果外层查询的同一个字段所关联到不同的子查询所访问的是不同的表
and c1 in (select col1 from t1 where ...)
and c1 in (select col2 from t2 where ...)

and c1 in (select col1
             from t1 inner join t2
                        on t2.col1 = t1.col1
            where ...)

  另一个相对常见的模式是那些对两个键进行了排序的子查询
select t.text
  from t
where t.textdate = (select max(x.textdate)
                      from t as x
                     where x.id = t.id)
  and t.versionnumber = (select max(y.versionnumber)
                           from t as y
                          where y.id = t.id
                            and y.textdate = t.textdate)
order by t.id

  SELECT x.text
    FROM (SELECT id,
                 text,
                 RANK()
                     OVER (PARTITION BY id
                           ORDER BY textdate DESC, versionnumber DESC)
                     AS rnk
            FROM t) x
   WHERE x.rnk = 1
ORDER BY x.id

其他优化
  简化汇总(通常可以将在不同子查询中对同一张表分别计算汇总的操作转换成一个一遍的操作。作法:取不同子查询所返回的结果集的合集,对该合集进行查询,然后使用case构造块来仔细地计算各种和,计数或者其他用到的每个子集上的东西)
  使用with(如果子查询在主查询中被引用了若干次的话,使用with就可以使该子查询只运行一次)
with my_subquery as (select distinct blah from ...)
select ...
from ...
where somecol = my_subquery.blah

  合并集合操作符(把子查询作为一个整体考虑,如果不将这两个强大的连接union起来,可以把它们的联合以一种因式分解的方式转移到一个子查询中)
select ...
from a, b, t1
where ...
union
select ...
from a, b, t2
where ...

select ...
from a, b,
  (select ...
     from t1
    where ...
    union
   select ...
     from t2
    where ...)
where ...

select ...
from a,
  (select ...
     from b, t1
    where ...
    union
   select
     from b, t2
   where ...)
where ...


声明:JavaEye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
分享到:
评论

相关推荐

    常考SQL语句.pdf

    常用的SQL语句笔记,采用例题的形式进行增、删、改、查等基本操作,可用于参考去做数据库的课后习题,也可当作数据库课后练习来做

    SqlServer重建索引

    用于SqlServer的索引重建,全语句实现,可根据实际情况进行部分关键表的索引重建。

    MySQL优化SQL语句的技巧

    在面对不够优化、或者性能极差的SQL语句时,我们通常的想法是将重构这个SQL语句,让其查询的结果集和原来保持一样,并且希望SQL性能得以提升。而在重构SQL时,一般都有一定方法技巧可供参考,本文将介绍如何通过这些...

    SQLPrompt for SQLServer2016 智能提示插件 SQL2016 提示

    SQLPrompt for SQLServer2016 智能提示插件 SQL2016 提示 SQLPrompt最新版本 绿色版 SQL Prompt 是一款拥有SQL智能提示功能的SQL Server和VS插件。...从查询语句中直接将对象改编为ALTER 找到未使用的变量和参数

    JavaDatabaseSerialisation:将 java 对象序列化为 SQL 语句

    项目制作序列化方法将Java对象序列化为SQL语句。 所有相关类都在 src/database/ 中,其他类来自 fitterizer ( ) 用于测试。 支持表的创建、插入和更新。 主键和外键尚未实现,但如果熟悉代码库,实现起来应该相对...

    SQLPrompt_7.2.4.291(含注册机+图文安装)完美支持SQL2008R2,2012,2014,2016

    自动使得对象名称合格 三:代码重构 无需打断相关性即可对对象重命名 将SQL代码封装成一个存储好的程序 扩展通配符 拆分表格 四:浏览数据库 查找无效的数据库对象 从查询语句中直接将对象改编为ALTER 找到未使用的...

    Devart dbForge Studio for SQL Server Enterprise 破解版

     智能代码完成,代码格式化,SQL重构,片段,配置文件,语句扩展,列选择器等等!  处理模式/数据差异没有麻烦  比较不同SQLServer实例中的数据并生成同步脚本。  管理源代码管理中的数据库更改  做一个...

    SQLPrompt_7.2.2.273〖含注册机〗(支持低版本和最高版本SQL2016+VS2015)

    SQL Prompt 是一款拥有SQL智能提示功能的SQL Server和VS插件。SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段自动进行检索,智能的为用户...从查询语句中直接将对象改编为ALTER 找到未使用的变量和参数

    SQL.Prompt5.3

    SQL Prompt介绍: SQL Prompt是一款拥有SQL智能提示功能的SQL Server和VS插件。SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段自动进行...从查询语句中直接将对象改编为ALTER 找到未使用的变量和参数

    SQLPrompt_6.3.0.344

    SQL Prompt介绍编辑 SQL Prompt[1] 是一款拥有SQL智能提示功能的SQL Server和VS插件。SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段...从查询语句中直接将对象改编为ALTER 找到未使用的变量和参数

    SQL Prompt 6最新版+注册机-亲测可用 破解

    SQL Prompt 是一款拥有SQL智能提示功能的SQL Server和VS插件。SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段自动进行检索,智能的为...从查询语句中直接将对象改编为ALTER 找到未使用的变量和参数

    SQL Prompt 5.3.4

    SQL Prompt介绍: SQL Prompt是一款拥有SQL智能提示功能的SQL Server和VS插件。SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段自动进行检索...从查询语句中直接将对象改编为ALTER 找到未使用的变量和参数

    SQL.Prompt5.3.rar{内含破解教程和注册机}

    SQL Prompt介绍: SQL Prompt是一款拥有SQL智能提示功能的SQL Server和VS插件。SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段自动进行...从查询语句中直接将对象改编为ALTER 找到未使用的变量和参数

    tsqlc:T-SQL 编译器。 Transact-SQL 的解析器。 该项目旨在为 Transact-SQL 创建一个抽象语法树,允许创建重构和分析工具

    tsqlc T-SQL 编译器。 Transact-SQL 的解析器。 该项目旨在为 Transact-SQL 创建一个抽象语法树,它将允许创建重构和分析工具。

    最新 Devart dbForge Studio for SQL Server Enterprise 5.5破解版

    受益于Intellisense类似的功能开箱即用 智能代码完成,代码格式化,SQL重构,片段,配置文件,语句扩展,列选择器等等! 处理模式/数据差异没有麻烦 比较不同SQLServer实例中的数据并生成同步脚本。 管理源代码管理...

    SQLPrompt_7工具(包含注册机和使用说明)

    SQL Prompt能根据数据库的对象名称,语法和用户编写的代码片段自动进行检索,智能的为用户提供唯一合适的代码选择。自动脚本设置为用户提供了简单的代码易...从查询语句中直接将对象改编为ALTER 找到未使用的变量和参数

    SQL Prompt v9.0.10.4053

    1、顺利的编写SQL代码。 2、根据部分代码比对进行代码补全。 3、自定义代码片段。 4、智能JOIN条件提示。 5、即时访问模式信息。...18、从查询语句中直接将对象改编为ALTER。 19、找到未使用的变量和参数。

    Devart dbForge Studio for SQL Server v5.2.177 Enterprise.和谐版

     智能代码完成,代码格式化,SQL重构,片段,配置文件,语句扩展,列选择器等等!  处理模式/数据差异没有麻烦  比较不同SQLServer实例中的数据并生成同步脚本。  管理源代码管理中的数据库更改  做一个...

    Rafy领域实体框架设计-重构ORM中的Sql生成

    随着不断使用,我们也不断对ORM的源码做了不少改动,让它在支持简单语句生成的同时,也支持让开发人员直接使用手动编写的Sql语句来查询领域实体。但是过程中,一直没有修改最核心的Sql语句生成模块。随着应用

Global site tag (gtag.js) - Google Analytics