代码之家  ›  专栏  ›  技术社区  ›  Konstantin Spirin

如何:SQL Server 2008 Express中基于使用情况的性能优化

  •  1
  • Konstantin Spirin  · 技术社区  · 15 年前

    1 回复  |  直到 15 年前
        1
  •  1
  •   Hakan Winther    15 年前

    SQL Server Express中是否存在动态管理视图?尝试使用sys.dm_exec_query_stats查看是否返回任何结果。如果是这样的话,我有一些可以执行的存储过程来优化性能。我给你一个例子,其中一个程序,我可以张贴一些其他如果你想。

    CREATE PROCEDURE [ADMIN].[spExecutionTimeStats]
                    @DBName                 AS SYSNAME
        AS
         -- +----------------------------------------------------------------------------------------------------------------
          -- ! O b j e c t         : ADMIN.spExecutionTimeStats
          -- ! R e t u r n s       : NONE
          -- ! P a r a m e t e r s : Name                    DataType       Description
          -- +                       ======================= ============== ==================================================
            -- !                                             @dbname                                    sysname 
          -- + ---------------------------------------------------------------------------------------------------------------
          -- ! O b j e c t i v e   : 
          -- + ---------------------------------------------------------------------------------------------------------------
          -- ! S A M P L E S       :
          -- !                                              EXEC ADMIN.spExecutionTimeStats 'DWH'
          -- !                                              EXEC ADMIN.spExecutionTimeStats 'DWH_TOOLKIT'
          -- !                                              EXEC ADMIN.spExecutionTimeStats 'DWH_HISTORY'
          -- + ---------------------------------------------------------------------------------------------------------------
          -- ! H i s t o r y       :
          -- + ---------------------------------------------------------------------------------------------------------------
          -- !                       Date       Who   What
          -- +                       ========== ===== ========================================================================
          -- !                                           2009-09-04 HAWI    Initial version
          -- +----------------------------------------------------------------------------------------------------------------
    
        --DECLARE @DBName AS SYSNAME='DWH'
        DECLARE @SQL NVARCHAR(MAX)
    
        SET @SQL='SELECT TOP 100 percent 
                                ''' +@DBName +'''AS DBName,
                    OBJECT_SCHEMA_NAME(s.object_id, DB_ID(''' +@DBName +''')) AS Schema_name,
                    S.name, 
                    D.execution_count,
                    D.total_physical_reads,
                    D.total_logical_reads,
                    d.total_logical_writes,
                    d.last_execution_time,
                    total_elapsed_time_s=convert(money,d.total_elapsed_time)/1000000,
                    max_elapsed_time_s=convert(money,D.max_elapsed_time)/1000000,
                    last_elapsed_time_s=convert(money,d.last_elapsed_time)/1000000,
                    min_elapsed_time_s=convert(money,D.min_elapsed_time)/1000000,
                    avg_time_s=(convert(money,d.total_elapsed_time)/d.execution_count)/1000000,
                    d.sql_handle as proc_handle,
                    stmnt.*
        FROM ' + @dbname + '.sys.procedures s
                    INNER JOIN ' + @dbname + '.sys.dm_exec_procedure_stats d
                                 ON s.object_id = d.object_id
                    LEFT JOIN 
                                    (
                                        SELECT TOP 100 PERCENT
                                        QS.sql_handle,         
                                        ROW_NUMBER() OVER(PARTITION BY qs.sql_handle ORDER BY statement_start_offset) AS statement_no,    
                                        qs.execution_count,
                                        qs.total_physical_reads,
                                        qs.total_logical_reads,
                                        qs.total_logical_writes,
                                        qs.last_execution_time,
                                        sql_total_elapsed_time_s=convert(money,qs.total_elapsed_time)/1000000,
                                        sql_max_elapsed_time_s=convert(money,qs.max_elapsed_time)/1000000,
                                        sql_last_elapsed_time_s=convert(money,qs.last_elapsed_time)/1000000,
                                        sql_min_elapsed_time_s=convert(money,qs.min_elapsed_time)/1000000,
                                        sql_avg_time_s=(convert(money,qs.total_elapsed_time)/qs.execution_count)/1000000,            
                                        SUBSTRING(ST.text, (QS.statement_start_offset/2) + 1,
                                            ((CASE statement_end_offset 
                                                WHEN -1 THEN DATALENGTH(st.text)
                                                ELSE QS.statement_end_offset END 
                                                - QS.statement_start_offset)/2) + 1) AS statement_text
                                        FROM ' + @dbname + '.sys.dm_exec_query_stats AS QS
                                        CROSS APPLY ' + @dbname + '.sys.dm_exec_sql_text(QS.sql_handle) as ST 
                                    ) AS stmnt
                                ON d.sql_handle=stmnt.sql_handle
        WHERE 
                    convert(money,d.total_elapsed_time)/d.execution_count/1000000>10
                    OR
                    d.last_elapsed_time > (d.total_elapsed_time/d.execution_count)*1.15
        ORDER BY avg_time_s DESC;'
    
        PRINT @SQL;
        EXEC sp_executeSQL @SQL;
        GO
    
    推荐文章