答:SQLServer DBA 三十问之六:Job信息我们可以通过哪些表获取;系统正在运行的语句可以通过哪些视图获取;如何获取某个T-SQL语句的IO、Time等信息;
6. Job信息我们可以通过哪些表获取;系统正在运行的语句可以通过哪些视图获取;如何获取某个T-SQL语句的IO、Time等信息;
我的MSDB数据库中有全部的表;
sys.all_columns,sys.all_objects,sys.columns;
系统正在运行的语句:
SELECT [Spid] = session_Id
,ecid
,[Database] = DB_NAME(sp.dbid)
,[User] = nt_username
,[Status] = er.STATUS
,[Wait] = wait_type
,[Individual Query] = SUBSTRING(qt.TEXT, er.statement_start_offset / 2, (
CASE
WHEN er.statement_end_offset = - 1
THEN LEN(CONVERT(NVARCHAR(MAX), qt.TEXT)) * 2
ELSE er.statement_end_offset
END - er.statement_start_offset
) / 2)
,[Parent Query] = qt.TEXT
,Program = program_name
,Hostname
,nt_domain
,start_time
FROM sys.dm_exec_requests er
INNER JOIN sys.sysprocesses sp ON er.session_id = sp.spid
CROSS APPLY sys.dm_exec_sql_text(er.sql_handle) AS qt
WHERE session_Id > 50 /* Ignore system spids.*/
AND session_Id NOT IN (@@SPID)
-------------------------------------------
查询--->>查询选项 --->>高级
set statistics io
set statistics time 来获取
declare @d datetime
set @d=getdate()
/*你的SQL脚本开始*/
SELECT [TestCase] FROM
[TestCaseSelect]
/*你的SQL脚本结束*/
select [语句执行花费时间(毫秒)]=datediff(ms,@d,getdate())
1.查看执行时间和cpu占 用时间
set statistics time on select * from dbo.Product set statistics time off
2.查看查询对I/0的操作 情况
set statistics io on select * from dbo.Product set statistics io off
扫描计数:索引或表扫描次数
逻辑读取:数据缓存中读取的页数
物理读取:从磁盘中读取的页数
预读:查询过程中,从磁盘放入缓存的页数
lob逻辑读取:从数据缓存中读 取,image,text,ntext或大型数据的页数
lob物理读取:从磁盘中读 取,image,text,ntext或大型数据的页数
lob预读:查询过程中,从磁盘放入缓存的 image,text,ntext或大型数据的页数
如果物理读取次数和预读次说比较多,可以使用 索引进行优化。
3.查看执行计划,执行计划详解
分析:鼠标放在图标上会显示此步骤执行的详细内容,每个表下面都显示 一个开销百分比,分析站百分比多的的一块,可以根据重新设计数据结构,或这重写sql语句,来对此进行优化。如果存在扫描表,或者扫描聚集索引,这表示在 当前查询中你的索引是不合适的,是没有起到作用的,那么你就要修改完善优化你的索引,具体怎么做,你可以根据我上一篇文章中的sql优化利器--数据库引 擎优化顾问对索引进行分析优化。
select查询艺术
1.保证不查询多余的列与 行。
- 尽量避免select * 的存在,使用具体的列代替*,避免多余的列
- 使用where限定具体要查询的数据,避免 多余的行
- 使用top,distinct关键字减少多 余重复的行
2. 慎用distinct关键字
distinct在查询一个字段或者很少字段 的情况下使用,会避免重复数据的出现,给查询带来优化效果。
但是查询字段很多的情况下使用,则会大大降低 查询效率。
3.慎用union关键字
此关键字主要功能是把各个查询语句的结果集合 并到一个结果集中返回给你
执行过程:
依次执行select语句 -->>合并结果集--->>对结果集进行排序,过滤重复记录
使用union all能对union进行一定的优化
4.判断表中是否存在数据
select count(*) from product select top(1) id from product
很显然下面完胜
5.连接查询的优化
select * from
( (select * from orde where OrderId>10000) o left join orderproduct op on o.orderNum=op.orderNum )
select * from
( orde o left join orderproduct op on o.orderNum=op.orderNum )
where o.OrderId>10000
insert插入优化
分析说明:insert into select批量插入,明显提升效率。所以以后尽量避免一个个循环插入
优化修改删除语句
delete product where id<1000 delete product where id>=1000 and id<2000 delete product where id>=2000 and id<3000