select

Exists与In效率分析

被刻印的时光 ゝ 提交于 2020-03-30 05:38:16
A: In:是把外表和内表做Hash 连接,而exists 是对外表作loop 循环,每次loop循环再对内表进行查询。 当查询两个表的大小相当时,用In 和 exists差别不大。 如果两个表中一个表较小,一个表较大,那么子查询表大的用exists,子查询表小的用In,效率会高的。 也就是说 IN 适合于外表大而内表小的情况;EXISTS适合于外表小而内表大的情况,这样效率会高的 例如 :表a(小表),表b(大表) 1.select * from a where aid in (select aid from b) --->效率低:全程扫描b表,用到 a 表上的aid的索引,因为a表小,b表大 上面in的语句可以理解为: select * from a, ( select distinct aid from b) b1 where a.aid = b1.aid. select * from a where exists (select aid from b where b.aid = a.aid) --->效率高: 全程扫描a表,用到 b 表上的aid的索引。因为b表大。 上面的exists的语句可以理解为: for aid in ( select * from a) loop if ( exists ( select aid from b where b.aid= a.aid

Select语句执行顺序

泪湿孤枕 提交于 2020-03-30 04:45:02
目的在于理解如何Select 【搜索所得】: 标准的 SQL 的解析顺序为: (1).FROM 子句, 组装来自不同数据源的数据 (2).WHERE 子句, 基于指定的条件对记录进行筛选 (3).GROUP BY 子句, 将数据划分为多个分组 (4).使用聚合函数进行计算 (5).使用 HAVING 子句筛选分组 (6).计算所有的表达式 (7).使用 ORDER BY 对结果集进行排序 上述未有Select语句。 为了准确说明Select语句所在位置: 1. FROM clause 2. WHERE clause 3. GROUP BY clause 4. HAVING clause 5. SELECT clause 6. ORDER BY clause #begin# 另一文章:http://www.cnblogs.com/chinabc/articles/1597198.html 【摘抄】 每个步骤都会产生一个虚拟表,该虚拟表被用作下一个步骤的输入。这些虚拟表对调用者(客户端应用程序或者外部查询)不可用。只是最后一步生成的表才会返回 给调用者。如果没有在查询中指定某一子句,将跳过相应的步骤。下面是对应用于SQL server 2000和SQL Server 2005的各个逻辑步骤的简单描述。 ( 8 ) SELECT ( 9 ) DISTINCT ( 11 ) < Top

转:SQLServer级联删除示例

自古美人都是妖i 提交于 2020-03-30 04:00:02
SQLServer 2000与Oracle 8i相比较,在级联删除上有太多的限制 表内自关联不支持级联删除和级联更新 一个表内在有多个列同时关联于另一个表时,不支持多个级联删除 还有什么循环级联删除限制,等等 ....... 一大堆限制,如果要迁移Oracle到SqlServer麻烦多多,特别对于用于构造树型结构的表内自关联(比如部门表)的级联删除特别讨厌 考虑来考虑去,对于SqlServer不能支持的诸多级联删除只有采用最原始的方法,彻底不用外键关联,而是用触发器来解决 以下是经过验证的触发器实现范例(自关联例子) 放弃外键关联后所有的完整性检查都要通过触发器实现 -- DELETE 级联删除,先删除,再删除所有级联的记录,采用递归触发器,当然要求数据库支持递归触发器功能开启(数据库属性设置中开启他),不过SqlServer只支持32级的递归啊 IF EXISTS (SELECT NAME FROM SYSOBJECTS WHERE NAME = 'DEL_DOCUMENTTYPE_001' AND TYPE = 'TR') DROP TRIGGER DEL_DOCUMENTTYPE_001 GO CREATE TRIGGER DEL_DOCUMENTTYPE_001 ON dbo.DOCUMENTTYPE FOR DELETE AS IF (SELECT COUNT(*)

.NET执行SQL性能优化一: 针对SQL Server批量执行SQL 语句

百般思念 提交于 2020-03-29 23:25:06
本文介绍了几种如何使用一个SqlCommand执行多条SQL语句的技术。 介绍 使用ADO.NET对SQL Server进行数据存储经常被忽略的功能之一是它能够使用单个语句执行多个SQL语句SqlCommand。通常,程序分别执行语句和/或调用存储过程来执行更大的语句。当然,使用存储过程是一种首选方法,但是在某些情况下,一次调用执行多个语句是有益的。这可以使用批处理来完成,这基本上意味着一组SQL或T-SQL语句在一起。 设置 为了测试功能,让我们有一张数据库表。 创建测试表 CREATE TABLE MultiStatementTest ( id int not null identity(1,1), somevalue int not null ); 并用几行填充它。 添加几行 DECLARE @counter int = 1 BEGIN WHILE (@counter <= 5) BEGIN INSERT INTO MultiStatementTest (somevalue) VALUES (RAND() * 1000); SET @counter = @counter + 1; END; END; 现在数据看起来像: 查询初始数据 SELECT * FROM MultiStatementTest; id somevalue 1 854 2 73 3 732 4 546 5

《数据库优化》- MySQL优化

瘦欲@ 提交于 2020-03-29 18:31:23
前言   MySQL作为我们最常用的 关系型数据库 ,在开发中,肯定会遇到数据量比较大的情况,而没有足够的性能作为保障,往往查询会比较慢。下面,我们展开来聊聊MySQL怎么优化的。 一、MySQL性能   1、最大数据量   没有数据量和并发数的数据库性能都是没有灵魂的。   MySQL没有限制 单表最大记录数 ,它取决于操作系统对文件大小的限制。   《阿里巴巴Java开发手册》推荐:单表行数超过 500 万行或者单表容量超过 2GB,才推荐进行分库分表。   性能由综合因素决定,抛开业务复杂度,影响程度依次是: 硬件配置、MySQL配置、数据表设计、索引优化 。 500万这个值仅供参考,并非铁律。   有位大佬操作过超过4亿行数据的单表,分页查询最新的20条记录耗时0.6秒。   SQL大致是: select field_1,field_2 from table where id < #{prePageMinId} order by id desc limit 20 ;   prePageMinId是上一页数据记录的最小ID。   虽然当时查询速度还凑合,随着数据不断增长,有朝一日必定不堪重负。   分库分表是个周期长而风险高的大活儿,应该尽可能在当前结构上优化,比如升级硬件、迁移历史数据等等,实在没辙了再分。对分库分表感兴趣的同学可以阅读分库分表的基本思想。      2

数据库原理及操作

不羁岁月 提交于 2020-03-29 17:34:06
数据库基础 传统的文件系统管理的缺陷 编写应用程序不方便; 数据冗余不可避免; 应用程序依赖性; 不支持对文件的并发访问; 数据间联系弱 难以按用户视图表示数据; 无阶段性安全控制功能。 数据库管理系统的优点 相互关联的数据的集合; 较少的数据冗余; 程序与数据相互独立; 保证数据的安全、可靠; 最大限度地保证数据的正确性; 数据可以并发使用并能同时保证一致性。 数据库管理系统 数据库是数据的汇集,它以一定的组织形式存在于存储介质上 DBMS是管理数据库的系统软件,它实现数据库系统的各种功能。是数据库系统的核心 DBA: 负责数据库的规划、设计、协调、维护和管理等工作 应用程序指以数据库为基础的应用程序; 关系型数据Key/Value 数据库 关系:关系就是二维表。并满足如下性质: 表中的行、列次序并不在重要 行row:表中的每一行,又称为一条记录(record) 列column:表中的没一列,称为属性,字段 主键(Primary key):用于唯一确定一个记录的字段 域domain:属性的取值范围,如,性别只能是‘男’和‘女’两个值 外键(Foreign key):用于表之间的一对多的关系 唯一键(Uniq key):可以为null, 非关系型数据库:NO SQL(not only SQL) mencached redis mogoDB RDBMS MySQL: MySQL,

跟随我在oracle学习php(19)

孤街浪徒 提交于 2020-03-29 17:29:56
Order by子句 形式: order by 排序字段1 [排序方式], 排序字段2 [排序方式], ..... 说明: 对前面取得的数据(含 from子句,where子句,group子句,having子句的所有结果)来指定按某个字段的大小进行排列(排序),排序只有2种方式: 正序: ASC(默认值),可以省略 倒序: DESC 如果指定多个字段排序(虽然不常见),则其含义是,在前一个字段排序中相同的那些数据里,再按后一字段的大小进行指定的排序。 limit子句 形式: limit [起始行号start], 要取出的行数num 说明: 表示将前面取得的数据并前面排好之后(如果有),对之指定取得 “ 局部连续的若干条 ” 数据。 起始行号start:第一行的行号为0, 可以省略,则为默认行号(0)。 要取得的行数:如果结果集中从指定的行号开始到最后没有这么多行,则就只取到最后。 此子句非常有用 —— 主要用于网页上最常见的一个需求(现象):分页。 分页原理: 分页的前提:人为指定每页显示的条数, $pageSize = 3; 显示(取得)第 1页数据:select * from 表名 limit 0, $pageSize; 显示(取得)第 2页数据:select * from 表名 limit 3, $pageSize; 显示(取得)第 3页数据:select * from 表名

2007年11月小记

一世执手 提交于 2020-03-29 16:46:03
1、使用SQL2005的XML类型分拆字符串。 DECLARE @TagNames XML; SET @TagNames = ' <?xml version="1.0" encoding="utf-8"?><ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><string>asp.net</string><string>sql</string><string>ajax</string></ArrayOfString> ' ; DECLARE @TagNameTable TABLE ( [ IndexId ] INT IDENTITY ( 1 , 1 ) NOT NULL PRIMARY KEY , [ TagName ] NVARCHAR ( 200 ) NOT NULL ) INSERT INTO @TagNameTable SELECT tab.col.value( ' text()[1] ' , ' nvarchar(200) ' ) AS [ TagName ] FROM @TagNames .nodes( ' /ArrayOfString/string ' ) AS tab(col); select

2007年11月小记

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-29 16:45:27
1、使用SQL2005的XML类型分拆字符串。 DECLARE @TagNames XML; SET @TagNames = ' <?xml version="1.0" encoding="utf-8"?><ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"><string>asp.net</string><string>sql</string><string>ajax</string></ArrayOfString> ' ; DECLARE @TagNameTable TABLE ( [ IndexId ] INT IDENTITY ( 1 , 1 ) NOT NULL PRIMARY KEY , [ TagName ] NVARCHAR ( 200 ) NOT NULL ) INSERT INTO @TagNameTable SELECT tab.col.value( ' text()[1] ' , ' nvarchar(200) ' ) AS [ TagName ] FROM @TagNames .nodes( ' /ArrayOfString/string ' ) AS tab(col); select