zoukankan      html  css  js  c++  java
  • SQLServer DMV Query

    1.DMV Query to identify all active SQL Server Sessions

    The query below identifies all currently active SQL Server user connections by their SQL Server Login name. It provides details of the IP address that the connection is sourced from, along with the number of sessions and connections that the SQL Server Login is currently responsible for.

    SELECT
        B.login_name,
        A.client_net_address,
        NoOfConnections = COUNT(*)
    FROM
       sys.dm_exec_connections A
       INNER JOIN sys.dm_exec_sessions B ON A.session_id = B.session_id
    GROUP BY login_name, client_net_address

    2. How to find out how much memory used by sqlserver per database?

    SELECT
    (CASE WHEN ([is_modified] = 1) THEN 'Dirty' ELSE 'Clean' END) AS 'Page State',
    (CASE WHEN ([database_id] = 32767) THEN 'Resource Database' ELSE DB_NAME (database_id) END) AS 'Database Name',
    COUNT (*) AS 'Page Count'
    FROM sys.dm_os_buffer_descriptors
    GROUP BY [database_id], [is_modified]
    ORDER BY [database_id], [is_modified];
    GO

     

        3. How to limit the amount of memory taken by SQL Server

     

    Below is an example to limit the amount of memory taken by SQL Server to 2000 Mb.

     

    --Enable advanced options:
    USE master
    EXEC sp_configure 'show advanced options', 1 RECONFIGURE WITH OVERRIDE

     

    --Set the maximum amount of memory to 2000 MB:
    USE master
    EXEC sp_configure 'max server memory (MB)', 2000 RECONFIGURE WITH OVERRIDE

     

    --Display the newly set configuration:
    USE master
    EXEC sp_configure 'max server memory (MB)'

     

    --Set 'show advanced options' back to default:
    USE master
    EXEC sp_configure 'show advanced options', 0 RECONFIGURE WITH OVERRIDE

    4. How to find out the most wait types for your SQL Server?

     

    SELECT
    wait_type,
    waiting_tasks_count,
    max_wait_time_ms,
    (wait_time_ms - signal_wait_time_ms) resource_wait_time_ms,
    (cast((wait_time_ms - signal_wait_time_ms) as decimal(19,2)) /
    (select sum((wait_time_ms - signal_wait_time_ms)) from sys.dm_os_wait_stats))* 100 PercentOfAllResourceWaitTime
    FROM sys.dm_os_wait_stats
    ORDER BY PercentOfAllResourceWaitTime DESC

     5. How to identify the most costly SQL in Average for SQL Server queries 

    SELECT TOP 20
    qs.sql_handle,
    qs.execution_count,
    qs.total_worker_time AS Total_CPU,
    total_CPU_inSeconds = --Converted from microseconds
    cast(qs.total_worker_time as decimal)/1000000 ,
    average_CPU_inSeconds = --Converted from microseconds
    cast(qs.total_worker_time as decimal) /1000000/ qs.execution_count,
    qs.total_elapsed_time,
    total_elapsed_time_inSeconds = --Converted from microseconds
    cast(qs.total_elapsed_time as decimal) /1000000,
    average_elapsed_inSeconds = --Converted from microseconds
    cast(qs.total_elapsed_time as decimal) /1000000/qs.execution_count,
    st.text,
    qp.query_plan
    FROM
    sys.dm_exec_query_stats AS qs
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st
    CROSS apply sys.dm_exec_query_plan (qs.plan_handle) AS qp
    ORDER BY average_elapsed_inSeconds DESC

     6. How to find out the implicit column convertion in the Plan Cache?

    SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED 

    DECLARE @dbname SYSNAME 
    SET @dbname = QUOTENAME(DB_NAME()); 

    WITH XMLNAMESPACES 
       (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/showplan') 
    SELECT 
       stmt.value('(@StatementText)[1]', 'varchar(max)'), 
       t.value('(ScalarOperator/Identifier/ColumnReference/@Schema)[1]', 'varchar(128)'), 
       t.value('(ScalarOperator/Identifier/ColumnReference/@Table)[1]', 'varchar(128)'), 
       t.value('(ScalarOperator/Identifier/ColumnReference/@Column)[1]', 'varchar(128)'), 
       ic.DATA_TYPE AS ConvertFrom, 
       ic.CHARACTER_MAXIMUM_LENGTH AS ConvertFromLength, 
       t.value('(@DataType)[1]', 'varchar(128)') AS ConvertTo, 
       t.value('(@Length)[1]', 'int') AS ConvertToLength, 
       query_plan 
    FROM sys.dm_exec_cached_plans AS cp 
    CROSS APPLY sys.dm_exec_query_plan(plan_handle) AS qp 
    CROSS APPLY query_plan.nodes('/ShowPlanXML/BatchSequence/Batch/Statements/StmtSimple') AS batch(stmt) 
    CROSS APPLY stmt.nodes('.//Convert[@Implicit="1"]') AS n(t) 
    JOIN INFORMATION_SCHEMA.COLUMNS AS ic 
       ON QUOTENAME(ic.TABLE_SCHEMA) = t.value('(ScalarOperator/Identifier/ColumnReference/@Schema)[1]', 'varchar(128)') 
       AND QUOTENAME(ic.TABLE_NAME) = t.value('(ScalarOperator/Identifier/ColumnReference/@Table)[1]', 'varchar(128)') 
       AND ic.COLUMN_NAME = t.value('(ScalarOperator/Identifier/ColumnReference/@Column)[1]', 'varchar(128)') 
    WHERE t.exist('ScalarOperator/Identifier/ColumnReference[@Database=sql:variable("@dbname")][@Schema!="[sys]"]') = 1

     7. How to view the partitions table in SQLServer inlcude the which file it is in , how many rows each partition, what's the first page of each partition.

    DECLARE @TableName NVARCHAR(200) = N'Facts.Credit'
    SELECT SCHEMA_NAME(o.schema_id) + '.' + OBJECT_NAME(i.object_id) AS [object]
    , p.partition_number AS [p#]
    , fg.name AS [filegroup]
    , p.rows
    , au.total_pages AS pages
    , CASE boundary_value_on_right
    WHEN 1 THEN 'less than'
    ELSE 'less than or equal to' END as comparison
    , rv.value
    , CONVERT (VARCHAR(6), CONVERT (INT, SUBSTRING (au.first_page, 6, 1) +
    SUBSTRING (au.first_page, 5, 1))) + ':' + CONVERT (VARCHAR(20),
    CONVERT (INT, SUBSTRING (au.first_page, 4, 1) +
    SUBSTRING (au.first_page, 3, 1) + SUBSTRING (au.first_page, 2, 1) +
    SUBSTRING (au.first_page, 1, 1))) AS first_page
    FROM sys.partitions p
    INNER JOIN sys.indexes i
    ON p.object_id = i.object_id
    AND p.index_id = i.index_id
    INNER JOIN sys.objects o
    ON p.object_id = o.object_id
    INNER JOIN sys.system_internals_allocation_units au
    ON p.partition_id = au.container_id
    INNER JOIN sys.partition_schemes ps
    ON ps.data_space_id = i.data_space_id
    INNER JOIN sys.partition_functions f
    ON f.function_id = ps.function_id
    INNER JOIN sys.destination_data_spaces dds
    ON dds.partition_scheme_id = ps.data_space_id
    AND dds.destination_id = p.partition_number
    INNER JOIN sys.filegroups fg
    ON dds.data_space_id = fg.data_space_id
    LEFT OUTER JOIN sys.partition_range_values rv
    ON f.function_id = rv.function_id
    AND p.partition_number = rv.boundary_id
    WHERE i.index_id < 2
    AND o.object_id = OBJECT_ID(@TableName);

     

           Second SQL:

     

    DECLARE @TableName NVARCHAR(200) = N'HumanResources.Department'

     

    SELECT SCHEMA_NAME(o.schema_id) + '.' + OBJECT_NAME(i.object_id) AS [object]
    , p.partition_number AS [p#]
    , FILEGROUP_NAME(au.filegroup_id) [filegroup]
    , p.rows
    , au.total_pages AS pages
    , CASE boundary_value_on_right
    WHEN 1 THEN 'less than'
    ELSE 'less than or equal to' END as comparison
    , rv.value
    , CONVERT (VARCHAR(6), CONVERT (INT, SUBSTRING (au.first_page, 6, 1) +
    SUBSTRING (au.first_page, 5, 1))) + ':' + CONVERT (VARCHAR(20),
    CONVERT (INT, SUBSTRING (au.first_page, 4, 1) +
    SUBSTRING (au.first_page, 3, 1) + SUBSTRING (au.first_page, 2, 1) +
    SUBSTRING (au.first_page, 1, 1))) AS first_page
    FROM sys.partitions p
    INNER JOIN sys.indexes i
    ON p.object_id = i.object_id
    AND p.index_id = i.index_id
    INNER JOIN sys.objects o
    ON p.object_id = o.object_id
    INNER JOIN sys.system_internals_allocation_units au
    ON p.partition_id = au.container_id
    INNER JOIN sys.partition_schemes ps
    ON ps.data_space_id = i.data_space_id
    INNER JOIN sys.partition_functions f
    ON f.function_id = ps.function_id
    INNER JOIN sys.destination_data_spaces dds
    ON dds.partition_scheme_id = ps.data_space_id
    AND dds.destination_id = p.partition_number
    LEFT OUTER JOIN sys.partition_range_values rv
    ON f.function_id = rv.function_id
    AND p.partition_number = rv.boundary_id
    WHERE i.index_id < 2
    AND o.object_id = OBJECT_ID(@TableName);

     

    Above query will only return information for partitioned table, for non-partition table, we can use below query to the total rows,total pages and  first pages.

    DECLARE @TableName NVARCHAR(200) = N'Production.Culture';

    SELECT SCHEMA_NAME(o.schema_id) + '.' + OBJECT_NAME(i.object_id) AS [object]
    , p.partition_number AS [p#]
    , fg.name AS [filegroup]
    , p.rows
    , au.total_pages AS pages
    , CONVERT (VARCHAR(6), CONVERT (INT, SUBSTRING (au.first_page, 6, 1) +
    SUBSTRING (au.first_page, 5, 1))) + ':' + CONVERT (VARCHAR(20),
    CONVERT (INT, SUBSTRING (au.first_page, 4, 1) +
    SUBSTRING (au.first_page, 3, 1) + SUBSTRING (au.first_page, 2, 1) +
    SUBSTRING (au.first_page, 1, 1))) AS first_page
    FROM sys.partitions p
    INNER JOIN sys.indexes i
    ON p.object_id = i.object_id
    AND p.index_id = i.index_id
    INNER JOIN sys.objects o
    ON p.object_id = o.object_id
    INNER JOIN sys.system_internals_allocation_units au
    ON p.partition_id = au.container_id
    INNER JOIN sys.data_spaces ds
    ON i.data_space_id = ds.data_space_id
    INNER JOIN sys.filegroups fg
    ON ds.data_space_id = fg.data_space_id
    WHERE i.index_id < 2
    AND o.object_id = OBJECT_ID(@TableName);

    Second SQL:

    DECLARE @TableName NVARCHAR(200) = N'Production.Culture';

    SELECT SCHEMA_NAME(o.schema_id) + '.' + OBJECT_NAME(o.object_id) AS [object]
    , p.partition_number AS [p#]
    , FILEGROUP_NAME(au.filegroup_id) AS [filegroup]
    , p.rows
    , au.total_pages AS pages
    , CONVERT (VARCHAR(6), CONVERT (INT, SUBSTRING (au.first_page, 6, 1) +
    SUBSTRING (au.first_page, 5, 1))) + ':' + CONVERT (VARCHAR(20),
    CONVERT (INT, SUBSTRING (au.first_page, 4, 1) +
    SUBSTRING (au.first_page, 3, 1) + SUBSTRING (au.first_page, 2, 1) +
    SUBSTRING (au.first_page, 1, 1))) AS first_page
    FROM sys.partitions p
    INNER JOIN sys.objects o
    ON p.object_id = o.object_id
    INNER JOIN sys.system_internals_allocation_units au
    ON p.partition_id = au.container_id
    WHERE p.index_id < 2 and o.object_id = OBJECT_ID(@TableName);

    8. How to Query partitions detail information

    --Just about everything here, including Total_page count for indexes. 
    SELECT OBJECT_NAME(i.OBJECT_ID) AS TableName, pf.name AS PFName, ps.name AS PSName, ds.name AS FGName, pv.value 
       ,CASE WHEN pf.boundary_value_on_right = 1 THEN 'Range Right' ELSE 'Range Left' END AS Type 
       ,t.name AS DataType, pp.max_length, pp.PRECISION, pp.scale 
       ,ps.is_default 
       ,pv.parameter_id, pf.fanout AS PartitionCount 
       ,i.index_id AS Index_ID, 
       p.partition_number,  
       rows AS ApproxRowCount,  
       au.total_pages 
    --select * 
    FROM sys.partitions p  
    JOIN sys.indexes i ON p.OBJECT_ID = i.OBJECT_ID AND p.index_id = i.index_id 
    JOIN sys.partition_schemes ps ON ps.data_space_id = i.data_space_id 
    JOIN sys.partition_functions pf ON pf.function_id = ps.function_id 
    LEFT JOIN sys.partition_range_values pv ON pf.function_id = pv.function_id 
             AND p.partition_number = pv.boundary_id 
    JOIN sys.destination_data_spaces dds ON dds.partition_scheme_id = ps.data_space_id 
             AND dds.destination_id = p.partition_number 
    JOIN sys.partition_parameters pp ON pf.function_id = pp.function_id 
    JOIN sys.types t ON t.system_type_id = pp.system_type_id 
    JOIN sys.data_spaces ds ON ds.data_space_id=dds.data_space_id 
    JOIN (SELECT container_id, SUM(total_pages) AS total_pages 
         FROM sys.allocation_units 
         GROUP BY container_id) AS au ON au.container_id = p.partition_id 
    ORDER BY partition_number

    
    

    --Without the datapage information: 
    SELECT OBJECT_NAME(i.OBJECT_ID) AS TableName, pf.name AS PFName, ps.name AS PSName, ds.name AS FGName, pv.value
       ,CASE WHEN pf.boundary_value_on_right = 1 THEN 'Range Right' ELSE 'Range Left' END AS Type 
       ,t.name AS DataType, pp.max_length, pp.PRECISION, pp.scale 
       ,ps.is_default 
       ,pv.parameter_id, pf.fanout AS PartitionCount 
       ,p.partition_number 
       ,rows AS ApproxRowCount 
    --select * 
    FROM sys.partitions p  
    JOIN sys.indexes i ON p.OBJECT_ID = i.OBJECT_ID AND p.index_id = i.index_id 
    JOIN sys.partition_schemes ps ON ps.data_space_id = i.data_space_id 
    JOIN sys.partition_functions pf ON pf.function_id = ps.function_id 
    LEFT JOIN sys.partition_range_values pv ON pf.function_id = pv.function_id 
             AND p.partition_number = pv.boundary_id 
    JOIN sys.destination_data_spaces dds ON dds.partition_scheme_id = ps.data_space_id 
             AND dds.destination_id = p.partition_number 
    JOIN sys.partition_parameters pp ON pf.function_id = pp.function_id 
    JOIN sys.types t ON t.system_type_id = pp.system_type_id 
    JOIN sys.data_spaces ds ON ds.data_space_id=dds.data_space_id 
    WHERE i.index_id = 1 
    ORDER BY partition_number

    
    

    --Very simplified version of above. But if you haven't applied PF to a table yet, you need this. 
    SELECT  
    pf.name AS PFName, ps.name AS PSName, ds.name AS FGName, pv.value AS RangeValue 
       ,CASE WHEN pf.boundary_value_on_right = 1 THEN 'Range Right' ELSE 'Range Left' END AS Type 
       ,t.name AS DataType, pp.max_length, pp.PRECISION, pp.scale 
       ,ps.is_default 
       ,pf.fanout AS PartitionCount 
    --select * 
    FROM sys.partition_schemes ps 
    JOIN sys.destination_data_spaces dds ON dds.partition_scheme_id = ps.data_space_id 
    JOIN sys.data_spaces ds ON ds.data_space_id = dds.data_space_id 
    LEFT JOIN sys.partition_range_values pv ON pv.boundary_id = dds.destination_id 
    JOIN sys.partition_functions pf ON pf.function_id = ps.function_id 
    JOIN sys.partition_parameters pp ON pf.function_id = pp.function_id 
    JOIN sys.types t ON t.system_type_id = pp.system_type_id

    9. How to check the cache hit ration and total cpu time percentage and other performace counter? 

    select sum(total_physical_reads) physical,
    sum(total_logical_reads) logical,
    sum(total_worker_time) total_cpu,
    sum(total_elapsed_time) duration_time,
    (1- CAST(sum(total_physical_reads) AS DECIMAL)/ CAST(sum(total_logical_reads) AS DECIMAL)) cache_hit,
    (CAST(sum(total_worker_time) AS DECIMAL) / CAST(sum(total_elapsed_time) AS DECIMAL)) CPU_hit
    from sys.dm_exec_query_Stats

    select * from sys.dm_os_performance_counters

     
    10. How to find out all the indexes under a special schema?


    SELECT 
    t.name as [Table Name],
    i.name as [Index Name], 
    ic.index_column_id as[Column order], 
    c.name as [ColumnName], 
    ic.is_included_column as[IsIncluded],
    c.is_nullable as [IsNullAble]
    FROM sys.indexes i inner join sys.tables t on t.object_id = i.object_id 
    left outer join SYS.index_columns ic on i.object_id = ic.object_id and ic.index_id = i.index_id
    left outer join sys.columns c on c.object_id = ic.object_id and c.column_id = ic.column_id
    where t.schema_id = schema_id('GPCOMP1') and i.name is not null
    order by [Table Name],[Index Name],[Column order];



    11. How to find
    those tables and indexes are using the most memory in the buffer cache?

    -- each buffer is 8K size
    SELECT OBJECT_NAME(p.object_id) AS [ObjectName],
    p.object_id,
    p.index_id,
    i.name,
    COUNT(*) / 128 AS [buffer size(MB)],
    COUNT(*) AS [buffer_count]
    FROM sys.allocation_units AS a
    INNER JOIN sys.dm_os_buffer_descriptors AS b ON a.allocation_unit_id = b.allocation_unit_id
    INNER JOIN sys.partitions AS p ON a.container_id = p.hobt_id
    INNER JOIN sys.indexes i on p.object_id = i.object_id and p.index_id = i.index_id
    WHERE b.database_id = DB_ID() AND p.object_id > 100
    GROUP BY p.object_id, p.index_id,i.name
    ORDER BY buffer_count DESC;

     

    12. How to find the most biggest table and indexes in current database?

    -- the most biggest top 20 tables including cluster table or heap table.
    SELECT top 20
    OBJECT_NAME(p.object_id) as [Table Name],
    au.total_pages * 8048/1024 as [DataPageSize In MB]
    FROM sys.allocation_units au
    INNER JOIN sys.partitions p on p.hobt_id = au.container_id
    where p.index_id<=1 order by total_pages desc

    
    

    -- the most biggest top 20 indexes.
    SELECT top 20
    OBJECT_NAME(p.object_id)as [Table Name],
    p.index_id,
    i.name,
    au.total_pages/128 as [IndexPageSize In MB]
    FROM sys.allocation_units au
    INNER JOIN sys.partitions p on p.hobt_id = au.container_id
    INNER JOIN sys.indexes i on p.object_id = i.object_id and p.index_id = i.index_id
    where p.index_id>1 order by total_pages desc

    sys.dm_os_buffer_descriptors

    sys.allocation_units

     


    13. how many pages of a table including indexes was loaded into the buffer cache?

    -- all the indexes/tables size in memory divid all the indexes/tables storage in Disk.
    SELECT
    DB_NAME(a.database_id) AS [DataBaseName],
    SCHEMA_NAME(t.schema_id) as [SchemaName],
    t.name as [TableName],
    sum(a.totalPagesNumbers) * 8 AS [MemorySpaceKB],
    SUM(au.data_pages) * 8 AS [StorageSpaceKB],
    CASE WHEN SUM(au.data_pages) <> 0 THEN
    SUM(a.totalPagesNumbers)/CAST(SUM(au.data_pages) AS DECIMAL) END AS 'Percentage Of Object In Memory'
    FROM
    (
    SELECT database_id, allocation_unit_id, COUNT(page_id) totalPagesNumbers
    FROM sys.dm_os_buffer_descriptors WHERE database_id = DB_ID()
    GROUP BY database_id, allocation_unit_id
    ) a
    INNER JOIN sys.allocation_units au ON a.allocation_unit_id = au.allocation_unit_id
    JOIN sys.partitions p ON (au.type IN (1,3) AND au.container_id = p.hobt_id) OR (au.type = 2 AND au.container_id = p.partition_id)
    JOIN sys.tables t ON p.object_id = t.object_id AND t.is_ms_shipped = 0
    GROUP BY database_id,t.schema_id,t.name

    
    
  • 相关阅读:
    【WPF】给下拉列表ComboBox绑定数据
    【C#】POST请求参数含中文,服务器解析得到乱码
    CentOS下搭建SVN服务器
    MySQL之ALTER
    深入PHP内核之ZVAL
    关于zend_parse_parameters函数
    PHP数组
    shell中比较字符串大小,>和<前需要加上进行转义,否则会输出到文件了
    awk编程基础
    【读书笔记】《Python_Cookbook3》第一章:数据结构和算法
  • 原文地址:https://www.cnblogs.com/princessd8251/p/3681244.html
Copyright © 2011-2022 走看看