SQLServer总结
nvarchar 和 varchar等的区别
1、nvarchar多了一个N,n表示使用的unicode编码,不用N开头的是用的utf-8编码。
2、所以中文在varchar中占两个字符长度,在nvarchar中占一个字符长度。
3、现在存在表[dbo].[Table],有col1 nvarchar(50),col2 nvarchar(50),按下面的SQL写入数据库
INSERT INTO [dbo].[Table]
([col1] ,[col2])
VALUES
('☺',N'☺')
GO
col1存入的是?,col2存入的是☺
因为SQL语句中的N,表示使用Unicode编码,不使用N,表示使用utf-8编码格式
索引假脱机
1、索引可以加快查询速度。
2、索引字段必须出现在where 条件中,数据库才会使用索引
3、当数据库会用到某一没有索引的字段时,当数据库觉得加了索引会更快一些,会自动加临时索引,出现索引假脱机状态。
4、出现索引假脱机一般需要将手动建立数据库创建的临时索引(不包括第5条的情况)。
5、当索引假脱机添加的索引没有出现在where语句中,这时不会用到数据库手动建立的索引(见2),只能依靠索引假脱机为我们创建的临时索引。
系统表
1、sysobjects 存放了包括,表、视图、存储过程、函数等信息。
2、syscolumns 存放了表的字段信息。
3、sys.extended_properties 表说明
4、sys.extended_properties 字段说明
示例:查找某表的信息
select 字段名 = a.name,
标识 = case when columnproperty(a.id, a.name, 'IsIdentity') =
then '√'
else ''
end,
主键 = case when exists (select from sysobjects
where xtype = 'PK'
and name in (select name
from sysindexes
where indid in (select indid
from sysindexkeys
where id = a.id and colid = a.colid)) )
then '√'
else ''
end,
类型 = b.name ,
占用字节数 = a.length ,
长度 = columnproperty(a.id, a.name, 'PRECISION') ,
允许空 = case when a.isnullable =
then '√'
else ''
end,
默认值 = isnull(e.text, '') ,
字段说明 = isnull(g.[value], '')
from syscolumns a
left join systypes b on a.xusertype = b.xusertype
inner join sysobjects d on a.id = d.id and d.xtype = 'U' and d.name <> 'dtproperties'
left join syscomments e on a.cdefault = e.id
left join sys.extended_properties g on a.id = g.major_id and a.colid = g.minor_id
where d.name='Work' --需要查询的表名
order by a.id,a.colorder
实例:缓存的查询计划
--查询
select * from sys.dm_exec_cached_plans
cross apply sys.dm_exec_sql_text(plan_handle) t --清除
dbcc freeproccache (plan_handle字段的值)
存储过程的执行计划
SELECT usecounts, cacheobjtype, objtype, text, query_plan, value as set_options
FROM sys.dm_exec_cached_plans
CROSS APPLY sys.dm_exec_sql_text(plan_handle)
CROSS APPLY sys.dm_exec_query_plan(plan_handle)
cross APPLY sys.dm_exec_plan_attributes(plan_handle) AS epa
where text like '%sql片段%' and attribute='set_options'
清理索引碎片
update STATISTICS 表
哪些地方用到了表或存储过程
select b.name from syscomments a,sysobjects b where a.id=b.id and a.text LIKE '%要查找的表或者存储过程%'
锁查询
IF EXISTS(SELECT * FROM master.sys.sysprocesses WHERE spid
IN (SELECT blocked FROM master.sys.sysprocesses)) --确定有进程被其他的进程锁住
SELECT
DISTINCT '进程ID' = STR(a.spid, 4)
,'进程ID状态' = CONVERT(CHAR(10), a.status)
,'登入帐号'=SUBSTRING(SUSER_SNAME(sid),1,30)
,'工作站名称' = CONVERT(CHAR(10), a.hostname)
,'执行命令的用户' = CONVERT(CHAR(10), SUSER_NAME(a.uid))
,'是否被锁住'=CONVERT(char(3),blocked)
,'数据库名' = CONVERT(CHAR(10), DB_NAME(a.dbid))
,'正在执行的命令' = CONVERT(CHAR(16), a.cmd)
,'登录名' = a.loginame
,'执行语句' = b.text
,'等待型态' = a.waittype
FROM master..sysprocesses a CROSS APPLY sys.dm_exec_sql_text(a.sql_handle) b
--列出锁住别人(在别的进程中 blocked字段出现的值),但自己未被锁住(blocked=0)
WHERE spid IN (SELECT blocked FROM master.sys.sysprocesses)
AND blocked=0
ELSE
SELECT 'No Blocked Session(s)'
--a.status = suspended,a.blocked(阻塞者id)
--DBCC INPUTBUFFER (阻塞者id);--就可以看到语句了或者join
-----------------------------------------------------
--经常出现的是,在sysprocesses视图中 status是'sleeping',
--waittype字段是0x0000,打开事务数open_tran大于0
-----------------------------------------------------
select * from master.sys.sysprocesses
where status = 'sleeping' and waittype=0x0000 and open_tran > 0 --dbcc inputbuffer(spid)
--kill spid
该模块引用:http://www.cnblogs.com/spring_wang/p/4021715.html
一、库里有多少个表,表名等
select * from INFORMATION_SCHEMA.TABLES二、查询表、字段、类型、是否主键、长度、小数位、是否允许空、默认值等详细查询
效果:
SELECT
(case when a.colorder=1 then d.name else '' end) as 表名,--如果表名相同就返回空
a.colorder as 字段序号,
a.name as 字段名,
(case when COLUMNPROPERTY( a.id,a.name,'IsIdentity')=1 then '√'else '' end) as 标识,
(case when (SELECT count(*) FROM sysobjects--查询主键
WHERE (name in
(SELECT name FROM sysindexes
WHERE (id = a.id) AND (indid in
(SELECT indid FROM sysindexkeys
WHERE (id = a.id) AND (colid in
(SELECT colid FROM syscolumns
WHERE (id = a.id) AND (name = a.name))
)))))
AND (xtype = 'PK'))>0 then '√' else '' end) as 主键,--查询主键END
b.name as 类型,
a.length as 占用字节数,
COLUMNPROPERTY(a.id,a.name,'PRECISION') as 长度,
isnull(COLUMNPROPERTY(a.id,a.name,'Scale'),0) as 小数位数,
(case when a.isnullable=1 then '√'else '' end) as 允许空,
isnull(e.text,'') as 默认值,
isnull(g.[value],'') AS 字段说明
FROM syscolumns a left join systypes b
on a.xtype=b.xusertype
inner join sysobjects d
on a.id=d.id and d.xtype='U' and d.name<>'dtproperties'
left join syscomments e
on a.cdefault=e.id
left join sys.extended_properties g
on a.id=g.major_id AND a.colid = g.minor_id
order by a.id,a.colorder三、系统表:
sys.allocation_units 数据库中的每个分配单元都在表中占一行。 sys.assembly_modules 为公共语言运行时 (CLR) 程序集所定义的每个函数、过程或触发器返回一行。此目录视图将 CLR 存储过程、CLR 触发器或 CLR 函数映射到其基础实现。类型为 TA、AF、PC、FS 和 FT 的对象具有相关联的程序集模块。若要查找对象和程序集之间的关联,可以将此目录视图联接到其他目录视图。例如,在创建 CLR 存储过程时,该存储过程由 sys.objects 中的一行、sys.procedures(继承自 sys.objects)中的一行以及 sys.assembly_modules 中的一行表示。该存储过程本身由 sys.objects 和 sys.procedures 中的元数据表示。在 sys.assembly_modules 中可以找到对该过程的基础 CLR 实现的引用。 sys.check_constraints 每个作为 CHECK 约束的对象 (sys.objects.type = ‘C’) 均存在对应的一行。 sys.columns 为包含列的对象(如视图或表)的每列返回一行。下面是包含列的对象类型的列表。
- 表值程序集函数 (FT)
- 内联表值 SQL 函数 (IF)
- 内部表 (IT)
- 系统表 (S)
- 表值 SQL 函数 (TF)
- 用户表 (U)
- 视图 (V)
sys.computed_columns sys.columns 中的每个计算列对应一行。 sys.default_constraints 作为默认定义且 sys.objects.type = D 的每个对象在表中各对应一行,该默认定义是作为 CREATE TABLE 或 ALTER TABLE 语句的一部分创建的,而不是作为 CREATE DEFAULT 语句的一部分创建的。 sys.events 导致触发器或事件通知激发的每个事件对应一行。这些事件表示在使用 CREATE TRIGGER 或 CREATE EVENT NOTIFICATION 创建触发器或事件通知时所指定的事件类型。 sys.event_notifications 为作为事件通知的每个对象返回一行,且 sys.objects.type = EN。 sys.extended_procedures 每个作为扩展存储过程且 sys.objects.type = X 的对象对应一行。因为扩展存储过程安装在 master 数据库中,它们只有在该数据库上下文中才可见。从任何其他数据库上下文中的sys.extended_procedures 视图中进行选择,将返回空的结果集。 sys.foreign_key_columns 组成外键的每一列或列集在表中对应一行。 sys.foreign_keys 每个作为 FOREIGN KEY 约束并且 sys.object.type = F 的对象都在表中占一行。 sys.function_order_columns 针对每列返回一行,该列是公共语言运行时 (CLR) 表值函数 ORDER 表达式的一部分。 sys.identity_columns 用作标识列的每列都在表中占一行。 sys.index_columns 属于 sys.indexes 索引或未排序的表(堆)的每个列都对应一行。 sys.indexes 每个表格对象(例如,表、视图或表值函数)的索引或堆都包含一行。 sys.key_constraints 每个作为主键或唯一约束的对象对应一行。包括 sys.objects.type PK 和 UQ。 sys.numbered_procedure_parameters 带编号过程的每个参数都在表中对应一行。当您创建带编号的存储过程时,基过程的编号为 1。所有后续过程的编号依次为 2、3等。sys.numbered_procedure_parameters 包含所有后续过程(编号大于等于 2)的参数定义。该视图不显示基存储过程(编号 = 1)的参数。基存储过程类似于无编号的存储过程。因此,它的参数表示在 sys.parameters (Transact-SQL) 中。 sys.numbered_procedures 每个作为带编号的过程而创建的 SQL Server 存储过程都占一行。对于基(编号 = 1)存储过程,它不显示行。可以在诸如 sys.objects 和 sys.procedures 之类的视图中找到基存储过程的项。 sys.objects 在数据库中创建的每个用户定义的架构范围内的对象在该表中均对应一行。 sys.parameters 接受参数的对象的每个参数在表中对应一行。如果对象是标量函数,则另有一行说明返回值。该行将有一个值为 0 的 parameter_id。 sys.partitions 数据库中所有表和大多数类型的索引的每个分区在表中各对应一行。Fulltext、Spatial 和 XML 之类的特殊索引类型在此视图中不包括。SQL Server 2008 中所有表和索引都至少包含一个分区,无论它们是否已进行显式分区均为如此。 sys.procedures 于同类过程并且 sys.objects.type = P、X、RF 和 PC 的每个对象对应一行。 sys.service_queues 数据库中每个作为服务队列的对象(sys.objects.type = SQ)都在表中对应一行。 sys.spatial_index_tessellations 表示有关每个空间索引的分割方案和参数的信息。 sys.spatial_indexes 表示空间索引的主索引信息。 sys.sql_dependencies 对在定义另一引用对象的 Transact-SQL 表达式或语句中引用的被引用的实体的每一依赖关系,均存在对应的一行。 sys.sql_expression_dependencies 当前数据库中用户定义实体的每个按名称依赖项在此表中均占一行。当一个称为“被引用的实体”的实体按名称显示在另一个称为“引用实体”的实体的持久化 SQL 表达式中时,将创建这两个实体之间的依赖关系。例如,在视图定义中引用表时,作为引用实体的视图将依赖于表这个被引用的实体。如果删除该表,则该视图不可用。您可以使用此目录视图来报告以下实体的依赖关系信息:
- 绑定到架构的实体。
- 非绑定到架构的实体。
- 跨数据库和跨服务器的实体。报告了实体名称;但实体 ID 尚未解析。
- 绑定到架构的实体的列级依赖关系。可以使用 sys.dm_sql_referenced_entities 返回非绑定到架构的对象的列级依赖关系。
- 服务器级别的 DDL 触发器(在 master 数据库的上下文中时)。
sys.sql_modules 对每个 SQL 语言定义的模块对象都返回一行。类型为 P、RF、V、TR、FN、IF、TF 和 R 的对象均有关联的 SQL 模块。在此视图中,独立的默认值,即 D 类型的对象也具有 SQL 模块定义。有关这些类型的说明,请参阅 sys.objects 目录视图中的类型列。 sys.stats U、V 或 TF 类型表格对象的每个统计信息都对应一行。 sys.stats_columns sys.stats 统计信息包含的每列对应一行。 sys.synonyms 在该视图中,sys.objects.type = SN 的每个同义词对象对应一行。 sys.table_types 显示用户定义表类型的属性。表类型是指无法从其中声明表变量或表值参数的类型。每个表类型都包含 type_table_object_id,它是指向sys.objects 目录视图的外键。此 ID 可用于查询各种目录视图,查询方式与常规表的 object_id 类似,以便发现表类型的结构,如表的列、约束等。 sys.tables 为每个表对象返回一行,当前仅用于 sys.objects.type = U 的表对象。 sys.trigger_event_types 为可以激发触发器的每个事件或事件组返回一行。 sys.trigger_events 触发触发器的每个事件对应一行。 sys.triggers 每个类型为 TR 或 TA 的触发器对象对应一行。DML 触发器名称在架构范围内,因此,可在 sys.objects 中显示。DDL 触发器名称的作用域取决于父实体,只能在此视图中显示。parent_class 和 name 列唯一标识了数据库中的触发器。 sys.views ys.objects.type = V 的每个视图对象在该表中对应一行。
常用SQL
分页:
--sql2012之后
select * from [表名]
order by [排序字段]
offset [起始行号 1开始] ROWS FETCH NEXT [数量] ROWS ONLY --之前
select *
from (SELECT *,Row_Number() OVER (ORDER BY [排序字段] desc) number FROM [表名])a
where number between [起始行号] and [起始行号]+[数量]-1(结束行号)
分组筛选(如 每天最后一条数据)
select * from
( SELECT *,
row_number() over (partition BY dep
ORDER BY 排序字段) rows
FROM 表
) a where rows=1
SQL优化思路
1、避免子查询嵌套,in嵌套。因为会导致循环读库,数据量较大会卡死
2、多个GroupBy组合到一起,最后根据某一项排序,可以与子查询的模式对比,在不同情况下,两种实现方式的速度不一样。
3、使用链接服务器和不使用链接服务器对SQL的优化方式不一样。使用链接服务器,应该避免传输大量数据。
4、连表时,应保证on语句在索引上。
SQLServer总结的更多相关文章
- 01.SQLServer性能优化之----强大的文件组----分盘存储
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 文章内容皆自己的理解,如有不足之处欢迎指正~谢谢 前天有学弟问逆天:“逆天,有没有一种方 ...
- 03.SQLServer性能优化之---存储优化系列
汇总篇:http://www.cnblogs.com/dunitian/p/4822808.html#tsql 概 述:http://www.cnblogs.com/dunitian/p/60413 ...
- SQLSERVER将一个文件组的数据移动到另一个文件组
SQLSERVER将一个文件组的数据移动到另一个文件组 有经验的大侠可以直接忽视这篇文章~ 这个问题有经验的人都知道怎麽做,因为我们公司的数据量不大没有这个需求,也不知道怎麽做实验 今天求助了QQ群里 ...
- SQLSERVER走起微信公众帐号已经开通搜狗微信搜索
SQLSERVER走起微信公众帐号已经开通搜狗微信搜索 请打开下面链接 http://weixin.sogou.com/gzh?openid=oIWsFt-hiIb_oYqQHaBMoNwRB2wM ...
- SQLSERVER走起 APP隆重推出
SQLSERVER走起 APP隆重推出 为方便大家查看本微信公众以前推送的文章,QQ群里面的某位SQLSERVER重度爱好者开发了<SQLSERVER走起>的APP 以供大家一起交流 网页 ...
- 分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间)
分享一个SQLSERVER脚本(计算数据库中各个表的数据量和每行记录所占用空间) 很多时候我们都需要计算数据库中各个表的数据量和每行记录所占用空间 这里共享一个脚本 CREATE TABLE #tab ...
- SQLSERVER走起微信公众帐号全新改版 全新首页
SQLSERVER走起微信公众帐号全新改版 全新首页 今天,SQLSERVER走起微信公众帐号增加了首页功能 虽然还是订阅号,不过已经对版面做了比较大的修改,希望各位亲用得放心.用得安心O(∩_∩)O ...
- 记一次SQLServer的分页优化兼谈谈使用Row_Number()分页存在的问题
最近有项目反应,在服务器CPU使用较高的时候,我们的事件查询页面非常的慢,查询几条记录竟然要4分钟甚至更长,而且在翻第二页的时候也是要这么多的时间,这肯定是不能接受的,也是让现场用SQLServerP ...
- 我是如何在SQLServer中处理每天四亿三千万记录的
首先声明,我只是个程序员,不是专业的DBA,以下这篇文章是从一个问题的解决过程去写的,而不是一开始就给大家一个正确的结果,如果文中有不对的地方,请各位数据库大牛给予指正,以便我能够更好的处理此次业务. ...
- 干货分享:SQLSERVER使用裸设备
干货分享:SQLSERVER使用裸设备 这篇文章也适合ORACLE DBA和MYSQL DBA 阅读 裸设备适用于Linux和Windows 在ORACLE和MYSQL里也是支持裸设备的!! 介绍 大 ...
随机推荐
- SpringBoot切面控制业务逻辑
业务逻辑:写一个公共拦截类,过滤传进Controller的参数 为了调用接口安全起见,每个需要调用的接口有一个参数accessToken,用于安全验证 注:先进入过滤器Filter,再进入aop,最后 ...
- 一次FCK拿bc全过程
和大家简单的弄下fckeditor 漏洞在红客我看到好多人对fck 这个漏洞很干兴趣 其实这个漏洞这的很老了 也非常好利用 我也扫了一点fck的漏洞网址 下面我们就来打开一个我们看看这个一号站平台 ...
- 利用jmeter+JAVA对RPC的单接口(dubbo接口等)进行性能测试
建立JAVA项目 建立maven项目,加入Jmeter所需要的JAR包依赖. POM.xml 加入如下: <dependency> <groupId>org.apache.j ...
- exjs上传图片异常:com.jspsmart.upload.SmartUploadException: File can't be saved (1120).
错误: 文件名格式不对:未命??.jpg SmartUpload mySmartUpload = new SmartUpload(); com.jspsmart.upload.File myFile ...
- 分享一个 jmeter ant的build.xml
<?xml version="1.0" encoding="UTF-8"?> <project name="ant-jmeter-t ...
- C# 单例模式(Singleton Pattern)(转SuagrMatl)
单例模式的定义: 确保一个类只有一个实例,并提供一个全局访问点. 首先实例大家应该都明白就是类生成对象的过程简单的就是String s=new String(),则s就是个实例. Q:如何只生成一个实 ...
- 大道至简第一章观后感——java伪代码
一节: public class Yugongyishan_ { //定义一个名为Yugongyishan_的类 Public static void main(string args[]) // ...
- poj 3621 二分+spfa
题意:给出一个有向图,问求一个回路,使得回路上的点权之和/边权之和最大. 这题主要是分析出如何确定ans值.我们将(a1*x1+a2*x2+..+an*xn)/(b1*x1+b2*x2+..+bn*x ...
- EmEditor编辑器正则表达式的优点
(1)^[ \t]*\n这个正则表达式代表所有的空行,指含有零个或零个以上空格或制表符.以换行符结尾.不含其它字符的行.(2)(^|(?<=中国)).*?(?=中国|$)用正则表达式匹配特定字符 ...
- Mac 下如何使用sed -i命令
今天在学习Linux的过程中发现了sed这一项指令 首先,sed的全称是:Stream Editor 调用sed命令有两种形式: sed [options] 'command' file(s) sed ...