IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration SQL Server Discussion :

Problèmes de performaces sur une base


Sujet :

Administration SQL Server

  1. #1
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 348
    Points : 604
    Points
    604
    Par défaut Problèmes de performaces sur une base
    Bonsoir,

    voilà, on remonte des temps de réponse sur l'une de mes bases, j'ai lancé cette requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select counter_name, instance_name, cntr_value from sys.dm_os_performance_counters where cntr_value <> 0 and instance_name ='STOPRD'
    Je cherche par quel indicateur/compteur commencé dont la valeur est anormale:
    counter_name cntr_value
    Data File(s) Size (KB) 3121152
    Log File(s) Size (KB) 1843192
    Log File(s) Used Size (KB) 23227
    Transactions/sec 749999
    Log Pool Requests/sec 2012580
    Log Pool Cache Misses/sec 1
    Log Pool Disk Reads/sec 2
    DBCC Logical Scan Bytes/sec 28025495552
    Log Flushes/sec 436361
    Log Bytes Flushed/sec 12929272832
    Log Flush Waits/sec 414809
    Log Flush Write Time (ms) 485533
    Write Transactions/sec 718890
    Redone Bytes/sec 12929345024
    Redones/sec 579024
    Log Bytes Received/sec 12929272832
    Log Bytes Decompressed/sec 2782323534
    Log Decompressions/sec 307757
    Cache Hit Ratio 220122
    Cache Hit Ratio Base 301845
    Cache Entries Count 661


    MERCI.

    A+
    SDR.
    "ceux qui vivent, ce sont ceux qui luttent."

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 768
    Points : 52 719
    Points
    52 719
    Billets dans le blog
    5
    Par défaut
    Toutes ces informations ne servent à rien si on ne sait pas ce que fait votre serveurs et vos bases. De plus la lecture des données de performant via des requêtes nécessite des corrélations entre divers compteurs…

    Commençons par le commencement :

    0) ressources hardware de la machine :
    RAM ? (exec xp_readerrorlog 0, 1, N'Detected', N'of RAM.')
    CPU ? (exec xp_readerrorlog 0, 1, N'core')
    DISQUES ? (config RAID, disques physique, ect.)
    Machine ? (exec xp_readerrorlog 0, 1, N'System Manufacturer:')

    1)
    Version/Edition de l'OS et patch ?
    Version/Edition de SQL Server et patch ?
    2)
    Configuration du serveur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM sys.configurations
    3) Structure des fichiers des bases et volume des données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select DB_NAME(database_id), file_id, type, size, growth, is_percent_growth  
    from   sys.master_files
    4) latences des disques
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT volume_mount_point,
           SUM(io_stall_read_ms / NULLIF(num_of_reads, 0)) AS LATENCE_LECTURE,
           SUM(io_stall_write_ms / NULLIF(num_of_writes, 0)) AS LATENCE_ECRITURE,
           SUM(io_stall / NULLIF(num_of_reads + num_of_writes, 0)) AS LATENCE_GLOBALE,
           SUM(num_of_bytes_read) / SUM(NULLIF(num_of_reads, 0)) AS MOYENNE_OCTETS_PAR_LECTURE,
           SUM(num_of_bytes_written) / SUM(NULLIF(num_of_writes, 0)) AS MOYENNE_OCTETS_PAR_ECRITURE,
           SUM((num_of_bytes_read + num_of_bytes_written)) / SUM(NULLIF(num_of_reads + num_of_writes, 0)) AS MOYENNE_OCTET_PAR_OPERATION
    FROM   sys.master_files AS mf
           OUTER APPLY sys.dm_io_virtual_file_stats (mf.database_id,mf.file_id) AS vfs
           OUTER APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) AS vs
    WHERE  vfs.database_id = vs.database_id AND vfs.file_id = vfs.file_id
    GROUP  BY volume_mount_point
    ORDER  BY LATENCE_GLOBALE DESC;
    5) latences par base, type de fichiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    SELECT DB_NAME(mf.database_id), mf.type_desc,
           SUM(io_stall_read_ms / NULLIF(num_of_reads, 0)) AS LATENCE_LECTURE,
           SUM(io_stall_write_ms / NULLIF(num_of_writes, 0)) AS LATENCE_ECRITURE,
           SUM(io_stall / NULLIF(num_of_reads + num_of_writes, 0)) AS LATENCE_GLOBALE,
           SUM(num_of_bytes_read) / SUM(NULLIF(num_of_reads, 0)) AS MOYENNE_OCTETS_PAR_LECTURE,
           SUM(num_of_bytes_written) / SUM(NULLIF(num_of_writes, 0)) AS MOYENNE_OCTETS_PAR_ECRITURE,
           SUM((num_of_bytes_read + num_of_bytes_written)) / SUM(NULLIF(num_of_reads + num_of_writes, 0)) AS MOYENNE_OCTET_PAR_OPERATION
    FROM   sys.master_files AS mf
           OUTER APPLY sys.dm_io_virtual_file_stats (mf.database_id,mf.file_id) AS vfs
           OUTER APPLY sys.dm_os_volume_stats(mf.database_id, mf.file_id) AS vs
    WHERE  vfs.database_id = vs.database_id AND vfs.file_id = vfs.file_id
    GROUP  BY DB_NAME(mf.database_id), mf.type_desc
    ORDER  BY DB_NAME(mf.database_id), mf.type_desc
    6) pour chaque base la volumétrie :
    Ce sera déjà un bon début !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  3. #3
    Membre expérimenté
    Homme Profil pro
    DBA SQL Server
    Inscrit en
    Octobre 2012
    Messages
    862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA SQL Server
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Octobre 2012
    Messages : 862
    Points : 1 736
    Points
    1 736
    Par défaut
    J'utilise ça en général pour commencer :

    https://www.sqlskills.com/blogs/paul...SRNvMgrg%3D%3D

    https://www.sqlskills.com/help/waits...SRNvMgrg%3D%3D

    https://www.brentozar.com/responder/...SRNvMgrg%3D%3D

    --Il fait, sans l'afficher, une multiplication de la colonne "Number of Waits" et "Avg ms Per Wait", et donc c'est le plus au dessus qui est le plus important. C'est pour ça, que la première colonne, il classe par Wait Time (Hours)
    --La colonne Wait_category aide bien pour avoir une vue rapide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exec sp_BlitzFirst @SinceStartup = 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    /*
    SQL Server Wait Information from sys.dm_os_wait_stats
    Copyright (C) 2014, Brent Ozar Unlimited.
    See http://BrentOzar.com/go/eula for the End User Licensing Agreement.
    */
    /*********************************
    Let's build a list of waits we can safely ignore.
    *********************************/
    IF OBJECT_ID('tempdb..#ignorable_waits') IS NOT NULL
    DROP TABLE #ignorable_waits;
    GO
    create table #ignorable_waits (wait_type nvarchar(256) PRIMARY KEY);
    GO
    /* We aren't using row constructors to be SQL 2005 compatible */
    set nocount on;
    insert #ignorable_waits (wait_type) VALUES ('REQUEST_FOR_DEADLOCK_SEARCH');
    insert #ignorable_waits (wait_type) VALUES ('SQLTRACE_INCREMENTAL_FLUSH_SLEEP');
    insert #ignorable_waits (wait_type) VALUES ('SQLTRACE_BUFFER_FLUSH');
    insert #ignorable_waits (wait_type) VALUES ('LAZYWRITER_SLEEP');
    insert #ignorable_waits (wait_type) VALUES ('XE_TIMER_EVENT');
    insert #ignorable_waits (wait_type) VALUES ('XE_DISPATCHER_WAIT');
    insert #ignorable_waits (wait_type) VALUES ('FT_IFTS_SCHEDULER_IDLE_WAIT');
    insert #ignorable_waits (wait_type) VALUES ('LOGMGR_QUEUE');
    insert #ignorable_waits (wait_type) VALUES ('CHECKPOINT_QUEUE');
    insert #ignorable_waits (wait_type) VALUES ('BROKER_TO_FLUSH');
    insert #ignorable_waits (wait_type) VALUES ('BROKER_TASK_STOP');
    insert #ignorable_waits (wait_type) VALUES ('BROKER_EVENTHANDLER');
    insert #ignorable_waits (wait_type) VALUES ('SLEEP_TASK');
    insert #ignorable_waits (wait_type) VALUES ('WAITFOR');
    insert #ignorable_waits (wait_type) VALUES ('DBMIRROR_DBM_MUTEX')
    insert #ignorable_waits (wait_type) VALUES ('DBMIRROR_EVENTS_QUEUE')
    insert #ignorable_waits (wait_type) VALUES ('DBMIRRORING_CMD');
    insert #ignorable_waits (wait_type) VALUES ('DISPATCHER_QUEUE_SEMAPHORE');
    insert #ignorable_waits (wait_type) VALUES ('BROKER_RECEIVE_WAITFOR');
    insert #ignorable_waits (wait_type) VALUES ('CLR_AUTO_EVENT');
    insert #ignorable_waits (wait_type) VALUES ('DIRTY_PAGE_POLL');
    insert #ignorable_waits (wait_type) VALUES ('HADR_FILESTREAM_IOMGR_IOCOMPLETION');
    insert #ignorable_waits (wait_type) VALUES ('ONDEMAND_TASK_QUEUE');
    insert #ignorable_waits (wait_type) VALUES ('FT_IFTSHC_MUTEX');
    insert #ignorable_waits (wait_type) VALUES ('CLR_MANUAL_EVENT');
    insert #ignorable_waits (wait_type) VALUES ('SP_SERVER_DIAGNOSTICS_SLEEP');
    insert #ignorable_waits (wait_type) VALUES ('QDS_CLEANUP_STALE_QUERIES_TASK_MAIN_LOOP_SLEEP');
    insert #ignorable_waits (wait_type) VALUES ('QDS_PERSIST_TASK_MAIN_LOOP_SLEEP');
    GO
    /* Want to manually exclude an event and recalculate?*/
    /* insert #ignorable_waits (wait_type) VALUES (''); */
    /*********************************
    What are the highest overall waits since startup?
    *********************************/
    SELECT TOP 25
    os.wait_type,
    SUM(os.wait_time_ms) OVER (PARTITION BY os.wait_type) as sum_wait_time_ms,
    CAST(
    100.* SUM(os.wait_time_ms) OVER (PARTITION BY os.wait_type)
    / (1. * SUM(os.wait_time_ms) OVER () )
    AS NUMERIC(12,1)) as pct_wait_time,
    SUM(os.waiting_tasks_count) OVER (PARTITION BY os.wait_type) AS sum_waiting_tasks,
    CASE WHEN SUM(os.waiting_tasks_count) OVER (PARTITION BY os.wait_type) > 0
    THEN
    CAST(
    SUM(os.wait_time_ms) OVER (PARTITION BY os.wait_type)
    / (1. * SUM(os.waiting_tasks_count) OVER (PARTITION BY os.wait_type))
    AS NUMERIC(12,1))
    ELSE 0 END AS avg_wait_time_ms,
    CURRENT_TIMESTAMP as sample_time
    FROM sys.dm_os_wait_stats os
    LEFT JOIN #ignorable_waits iw on
    os.wait_type=iw.wait_type
    WHERE
    iw.wait_type is null
    ORDER BY sum_wait_time_ms DESC;
    GO
    /*********************************
    What are the higest waits *right now*?
    *********************************/
    /* Note: this is dependent on the #ignorable_waits table created earlier. */
    if OBJECT_ID('tempdb..#wait_batches') is not null
    drop table #wait_batches;
    if OBJECT_ID('tempdb..#wait_data') is not null
    drop table #wait_data;
    GO
    CREATE TABLE #wait_batches (
    batch_id int identity primary key,
    sample_time datetime not null
    );
    CREATE TABLE #wait_data
    ( batch_id INT NOT NULL ,
    wait_type NVARCHAR(256) NOT NULL ,
    wait_time_ms BIGINT NOT NULL ,
    waiting_tasks BIGINT NOT NULL
    );
    CREATE CLUSTERED INDEX cx_wait_data on #wait_data(batch_id);
    GO
    /*
    This temporary procedure records wait data to a temp table.
    */
    if OBJECT_ID('tempdb..#get_wait_data') IS NOT NULL
    DROP procedure #get_wait_data;
    GO
    CREATE PROCEDURE #get_wait_data
    @intervals tinyint = 2,
    @delay char(12)='00:00:30.000' /* 30 seconds*/
    AS
    DECLARE @batch_id int,
    @current_interval tinyint,
    @msg nvarchar(max);
    SET NOCOUNT ON;
    SET @current_interval=1;
    WHILE @current_interval <= @intervals
    BEGIN
    INSERT #wait_batches(sample_time)
    SELECT CURRENT_TIMESTAMP;
    SELECT @batch_id=SCOPE_IDENTITY();
    INSERT #wait_data (batch_id, wait_type, wait_time_ms, waiting_tasks)
    SELECT
    @batch_id,
    os.wait_type,
    SUM(os.wait_time_ms) OVER (PARTITION BY os.wait_type) as sum_wait_time_ms,
    SUM(os.waiting_tasks_count) OVER (PARTITION BY os.wait_type) AS sum_waiting_tasks
    FROM sys.dm_os_wait_stats os
    LEFT JOIN #ignorable_waits iw on
    os.wait_type=iw.wait_type
    WHERE
    iw.wait_type is null
    ORDER BY sum_wait_time_ms DESC;
    set @msg= CONVERT(char(23),CURRENT_TIMESTAMP,121)+ N': Completed sample '
    + cast(@current_interval as nvarchar(4))
    + N' of ' + cast(@intervals as nvarchar(4)) +
    '.'
    RAISERROR (@msg,0,1) WITH NOWAIT;
    SET @current_interval=@current_interval+1;
    if @current_interval <= @intervals
    WAITFOR DELAY @delay;
    END
    GO
    /*
    Let's take two samples 30 seconds apart
    */
    exec #get_wait_data @intervals=2, @delay='00:00:30.000';
    GO
    /*
    What were we waiting on?
    This query compares the most recent two samples.
    */
    with max_batch as (
    select top 1 batch_id, sample_time
    from #wait_batches
    order by batch_id desc
    )
    SELECT
    b.sample_time as [Second Sample Time],
    datediff(ss,wb1.sample_time, b.sample_time) as [Sample Duration in Seconds],
    wd1.wait_type,
    cast((wd2.wait_time_ms-wd1.wait_time_ms)/1000. as numeric(12,1)) as [Wait Time (Seconds)],
    (wd2.waiting_tasks-wd1.waiting_tasks) AS [Number of Waits],
    CASE WHEN (wd2.waiting_tasks-wd1.waiting_tasks) > 0
    THEN
    cast((wd2.wait_time_ms-wd1.wait_time_ms)/
    (1.0*(wd2.waiting_tasks-wd1.waiting_tasks)) as numeric(12,1))
    ELSE 0 END AS [Avg ms Per Wait]
    FROM max_batch b
    JOIN #wait_data wd2 on
    wd2.batch_id=b.batch_id
    JOIN #wait_data wd1 on
    wd1.wait_type=wd2.wait_type AND
    wd2.batch_id - 1 = wd1.batch_id
    join #wait_batches wb1 on
    wd1.batch_id=wb1.batch_id
    WHERE (wd2.waiting_tasks-wd1.waiting_tasks) > 0
    ORDER BY [Wait Time (Seconds)] DESC;
    GO
    https://www.brentozar.com/archive/20...it-times-mean/
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC sp_BlitzCache @SortOrder = 'duration';
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    EXEC sp_BlitzCache @SortOrder = 'avg duration';
    Ce que nous avons fait pour nous-même meurt avec nous, ce que nous avons fait pour les autres et le monde est immortel. Albert Pike

    http://www.datacrossroad.be

  4. #4
    Membre confirmé
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Novembre 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 348
    Points : 604
    Points
    604
    Par défaut
    Bonjour et Merci de votre aide.

    C'est une petite base OLTP de moins de 2 Go sollicitée pour des stats/mesures ... sur une instance 2012 EE ....

    Latence Disque
    volume_mount_point LATENCE_LECTURE LATENCE_ECRITURE LATENCE_GLOBALE
    F:\ 38 63 63
    G:\ 0 7 6

    Latence base
    (Aucun nom de colonne) type_desc LATENCE_LECTURE LATENCE_ECRITURE LATENCE_GLOBALE
    STOPRD LOG 0 1 1
    STOPRD ROWS 1 3 3

    MOYENNE_OCTETS_PAR_LECTURE MOYENNE_OCTETS_PAR_ECRITURE MOYENNE_OCTET_PAR_OPERATION
    7555 29315 29301
    60793 40332 41827
    14368 5183 5189
    63600 12980 14756


    MERCI A+
    SDR.
    "ceux qui vivent, ce sont ceux qui luttent."

Discussions similaires

  1. [Lazarus] Problème de requête sur une base de données
    Par bubulemaster dans le forum Lazarus
    Réponses: 1
    Dernier message: 09/11/2007, 18h14
  2. Problème de logique sur une base de données
    Par neuneu1 dans le forum Bases de données
    Réponses: 18
    Dernier message: 07/10/2007, 16h47
  3. Problèmes de performances sur une base oracle 10g
    Par ORAMEL dans le forum Oracle
    Réponses: 3
    Dernier message: 11/09/2007, 09h11
  4. [ASP.NET]Problème de droits sur une base access
    Par dacid dans le forum ASP.NET
    Réponses: 8
    Dernier message: 25/11/2006, 11h04
  5. problème de connexion sur une base mysql
    Par boss_gama dans le forum Installation
    Réponses: 4
    Dernier message: 05/09/2006, 14h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo