请问,SQLserver执行一条语句的详细过程,我如果想在数据库本地获取到执行过的SQL语句,可以在哪个地方取??比如它的缓存?

解决方案 »

  1.   


    -- 此语句可以获取执行过的,并且当前仍在过程缓冲区中的 sql 语句、执行计划和相关的统计信息
    select t.text,p.query_plan,
    q.creation_time,q.last_execution_time,q.execution_count,
    q.total_physical_reads,q.total_logical_reads,q.total_logical_writes,
    q.total_elapsed_time,q.total_worker_time
    from sys.dm_exec_query_stats q cross apply
    sys.dm_exec_query_plan(q.plan_handle) p cross apply
    sys.dm_exec_sql_text(q.sql_handle) t;-- 由于执行过的 sql 语句(特别是 ad-hoc 查询)并不会永久缓存在过程缓冲区中,因此 SQL Server 当前提
    -- 供的动态性能视图不可能提供过去执行过的所有 sql 语句。
    -- 如果想要获得执行过的所有 sql 语句,应该使用 SQL Profiler 跟踪。
      

  2.   

    猫兄威武,冒着被关xhw的风险来水一个。
      

  3.   

    请问,这个是2005还是2000,我想写程序来审计这些SQL语句,可否指教一二!
      

  4.   

    SQL 2005 的 
    2000中用dbcc inputbuffer
      

  5.   

    请问SQLserver里会和oracle那样有块SGA似的内存空间吗,我能不能在那里面拿到SQL语句和会话详细信息!
      

  6.   

    SQL Server 的过程缓冲区与 oracle 的 sga 中 share pool 中的 library cache 作用相同。SQL Server 通过动态管理视图 sys.dm_exec_query_stats,动态管理函数 sys.dm_exec_query_plan、sys.dm_exec_sql_text 获取缓存的语句、执行计划和统计信息。oracle 通过动态性能视图 v$sql、v$sql_plan、v$sql_plan_statistics 获取缓存的语句、执行计划和统计信息。虽然 SQL Server 和 oracle 使用的视图不同,但是方法相同。
      

  7.   

    我在oracle里面可以查到SGA的基地址和SQL语句等的地址,请问在SQLserver里可以获得这些结果的地址吗?我想通过程序直接取出来,这样对数据库的影响会小点!!十分谢谢你啊
      

  8.   

    sys.dm_exec_cached_plans 动态管理视图可以获得缓存的执行计划的内存地址,至于 SQL 语句的内存地址似乎还没有什么方法可以获取。关于 SQL Server 内部机制的公开文档中一般只介绍基本原理和机制,而对内存中的数据结构介绍的不怎么详细。这可能是因为 SQL Server 完全自动管理内存,用户无法干预(与 oracle 不同)。
      

  9.   

    微软同样没有提供公开的事务日志格式说明。只能通过第三方的 log explorer 才可以读取日志中的 sql 语句。
      

  10.   

    审计什么东西?
    可以用SQL PROFILER来进行审计,将产生的trace信息放在数据库的一个表里面,读取表中的数据就可以了;或者也可以保持成trc文件,然后调用fn_get_traceinfo读取生成的trc文件。
      

  11.   

    是这样的!obuntu
    我想审计,什么时间,谁,对数据库做了什么,具体执行的SQL语句!
    请问我可以在什么地方得到这些信息,尽可能的对数据库性能影响很小!~
    谢谢您拉!~
      

  12.   

    sql server 的审核可以通过跟踪 sql server 内部事件处理,通常用自带的 sql profiler 处理。sql server 2008 的 ssms 中有很方便的审核配置。如果要开发自己的审核程序,sql server 也提供了一些存储过程(sp_trace_*),也可以通过事件通知(Event Notifications,http://technet.microsoft.com/en-us/library/ms182602(SQL.90).aspx)实现。也可以通过 smo 实现。可以参考一下
    http://technet.microsoft.com/en-us/library/ms130271(SQL.90).aspx
      

  13.   

    sp_trace_* 我试了下为什么无法用呢!~~是不是要什么配置,权限?
      

  14.   


    是永久的,还是临时的呢。审计肯定会带来性能开销的,而且还要看你系统的负载大不大。
    如果需要做的话,
    1,采用c2 audit模式
    sp_configure 'c2 audit mode', 1
    go在安装目录的DATA文件夹里面就会产生相关的审计信息了,包括权限、登录、DDL,DML等语句。
    想要获取TRC文件的话,用SELECT *
     FROM ::fn_trace_gettable(
       'C:\Program Files\Microsoft SQL Server\...\Data\audittrace_xxx.trc', default
    )
    GO就可以查看里面的信息,你也可以用select into,存储到具体的表里面,然后根据需要筛选吧。2,自定义的SQL PROFILER审计。
    新建SQL PROFILER审计,只选择与SQL 相关的,如SQL:statementfinished(好像是这个),然后生成脚本,用脚本来运行,这样性能影响也会比较小的。然后也最好保存为trc文件,再用fn_trace_gettable来得到有关信息。其他的就看下SQL Profiler的联机丛书和使用帮助吧。最好先测试下,因为有时候审计的开销还是蛮大的。
      

  15.   

    smo提供了一套的类,我分析了下,请问用哪个类对象可以做这样的事,谢谢了,分不多,问题倒很多!~
      

  16.   


    猫兄,能不能再提供些SMO的资料呢,貌似很有意思。
      

  17.   

    Microsoft.SqlServer.Management.Trace namespace
    http://msdn.microsoft.com/en-us/library/ms162565.aspx
      

  18.   

    感觉本质还是跟profiler一样。不过对编程实现会很灵活。