• 答: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
  • 相关阅读:
    ZooKeeper 的选举机制,你了解多少?
    验证码无法显示:Could not initialize class sun.awt.X11GraphicsEnvironment 解决方案
    docker-compose入门
    Fabric中LevelDB转CouchDB
    查看证书内容
    Hyperledger Fabric数据存储结构
    Fabric中数据存储
    Pytest学习(二十二)- allure之@allure.link()、@allure.issue()、@allure.testcase()的使用
    Sqoop
    drop、truncate和delete的区别
  • 原文地址:https://www.cnblogs.com/dc2014/p/5209046.html
Copyright © 2020-2023  润新知