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

MS SQL Server Discussion :

Update sur grosse volumétrie


Sujet :

MS SQL Server

  1. #21
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Michel.Priori Voir le message
    Et oui.
    On notera qu'à ce jeux là c'est Oracle qui gagne avec le partitionnement par référence (https://docs.oracle.com/cd/B28359_01...n.htm#CACIHDII)
    On attendra que M$ comprenne le problème
    Quand oracle aura compris l'intérêt d'un partitionnement générique… Essaye de partitionner 70 tables et les index alignés avec Oracle et dis m'en des nouvelles lorsque tu veut rajouter des partitions… Dans SQL Server, 2 commandes. Dans Oracle 70 + autant que d'index !!!

    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/ * * * * *

  2. #22
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Bonsoir,
    Citation Envoyé par SQLpro Voir le message
    Essaye de partitionner 70 tables et les index alignés avec Oracle et dis m'en des nouvelles
    Oui.
    Mais entre une fonctionnalité pénible à mettre en place et une absence, quel est le moindre mal ?
    Le savoir est une nourriture qui exige des efforts.

  3. #23
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par Michel.Priori Voir le message
    Et oui.
    On notera qu'à ce jeux là c'est Oracle qui gagne avec le partitionnement par référence (https://docs.oracle.com/cd/B28359_01...n.htm#CACIHDII)
    On attendra que M$ comprenne le problème

    C'est tout à fait possible dans SQL Server. Il suffit d'incorporer la colonne de partitionnement dans une contrainte d'unicité et se servir ce cette référence en mode ON UPDATE/DELETE CASCADE…

    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/ * * * * *

  4. #24
    Membre expérimenté
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 731
    Points : 1 416
    Points
    1 416
    Par défaut
    Bonsoir,
    Citation Envoyé par SQLpro Voir le message
    C'est tout à fait possible dans SQL Server. Il suffit d'incorporer la colonne de partitionnement dans une contrainte d'unicité et se servir ce cette référence en mode ON UPDATE/DELETE CASCADE…
    Ok
    D'un coté, la syntaxe est complexe
    De l'autre, faut repenser le modèle des données

    Le bilan n'est pas null.
    Désolé.
    Le savoir est une nourriture qui exige des efforts.

  5. #25
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 766
    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 766
    Points : 52 563
    Points
    52 563
    Billets dans le blog
    5
    Par défaut
    Oui mais cela permet de meilleures optimisations des plans de requête... Donc oui le bilan n'est pas nul, mais il est plutôt positif pour sql server...
    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/ * * * * *

  6. #26
    Modérateur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Janvier 2005
    Messages
    5 826
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2005
    Messages : 5 826
    Points : 12 371
    Points
    12 371
    Par défaut
    Bonjour,

    Avant même de parler de (re)partitionner, il faudrait regarder en premier lieu la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE gtm_crb_consolide_pt10
          SET puissance_arenh = NULL
        WHERE year (dateadd (minute, -10, crb.datepoint)) = @iYear
    Comme Aieuuuuuuuu le disait, elle ne peut pas utiliser d'index : dès lors qu'on pose une fonction sur une colonne, c'est mort (cf ici)

    Donc ici on écrira quelque chose comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    UPDATE	dbo.gtm_crb_consolide_pt10
    SET		puissance_arenh = NULL
    WHERE	crb.datepoint BETWEEN CAST(@iYear AS char(4)) + '0101' AND CAST(@iYear + 1 AS char(4)) + '0101'
    Ensuite il faut lire le plan d'exécution pour vérifier si le filtre permettra d'accéder aux bonnes partitions.
    Si ce n'est pas le cas, remplacez les calculs dans le BETWEEN ci-dessus par des variables du même type que la colonne datepoint, que vous affecterez avec la bonne valeur. Un petit OPTION (RECOMPILE) juste après l'UPDATE pour que la valeur des variables locales soit prise en compte à la compilation du plan de l'UPDATE

    Ensuite vu le volume, l'idéal est de stocker la valeur de la clé primaire dans une table utilitaire, puis de "batcher", comme vous le conseille SQLPro.
    L'intérêt de la table utilitaire est de linéariser l'accès à la table cible, c'est à dire à minimiser le parcours de l'index cluster. Voici un exemple :

    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
    SELECT	colonne_de_la_cle_primaire
    INTO	dbo.table_utilitaire
    FROM	dbo.gtm_crb_consolide_pt10
    WHERE	crb.datepoint BETWEEN CAST(@iYear AS char(4)) + '0101' AND CAST(@iYear + 1 AS char(4)) + '0101'
     
    -- Pour bien supporter les ORDER BY des expressions de tables communes du WHILE qui suit
    ALTER TABLE dbo.table_utilitaire
    ADD CONSTRAINT PK_table_utilitaire PRIMARY KEY(colonne_de_la_cle_primaire)
     
    DECLARE @dt datetime2(3)
    	, @i int = 0
    	, @msg varchar(1024)
     
    WHILE EXISTS
    (
    	SELECT	*
    	FROM	dbo.table_utilitaire
    )
    BEGIN
    	SELECT @dt = SYSDATETIME()
    		, @i += 1
     
    	;WITH
    		cte AS
    		(
    			SELECT TOP (10000) colonne_de_la_cle_primaire
    			FROM dbo.table_utilitaire
    			ORDER BY colonne_de_la_cle_primaire
    		)
    	DELETE FROM	dbo.gtm_crb_consolide_pt10
    	FROM		dbo.gtm_crb_consolide_pt10 AS tgt
    	INNER JOIN	cte AS src
    				ON src.colonne_de_la_cle_primaire = tgt.colonne_de_la_cle_primaire;
     
    	WITH
    		cte AS
    		(
    			SELECT TOP (10000) colonne_de_la_cle_primaire
    			FROM dbo.table_utilitaire
    			ORDER BY colonne_de_la_cle_primaire
    		)
    	DELETE FROM	dbo.table_utilitaire
    	FROM		dbo.table_utilitaire AS tgt
    	INNER JOIN	cte AS src
    				ON src.colonne_de_la_cle_primaire = tgt.colonne_de_la_cle_primaire;
     
    	SELECT @msg = 'Batch #' + CAST(@i AS varchar(10) + '	-	Duration (ms) : ' + CAST(DATEDIFF(millisecond, @dt, SYSDATETIME() AS varchar(10)));
    	RAISERROR(@msg, 0, 1) WITH NOWAIT;
    END

    Cela permet de circonscrire le verrouillage aux seules 10000 lignes touchées par chaque tour de boucle.
    On peut arrêter le batch à tout moment, éventuellement changer la taille du batch si l'on constate que son exécution génère trop de blocages, et relancer sans perte du travail déjà effectué. Et bien sûr l'impact sur la taille du fichier du journal des transactions est faible. Le RAISERROR vous permet de suivre l'exécution du batch dans la console (onglet Messages du panneau des résultats de requête dans SQL Server Management Studio)

    Le fait d'ajouter un index va pénaliser les écritures et ajouter du volume à backuper.
    Les écritures ont besoin dans une première phase de trouver les lignes à affecter, ce qui peut justement être facilité par les index.
    Donc il est préférable de bien concevoir ses index, et de bien faire attention à ce qu'il n'y ait pas de doublons et de "sur-clés", de façon effectivement à minimiser le travail du moteur de stockage.

    @++

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. Tri sur grosses volumétries
    Par crashtib dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 10/06/2009, 10h18
  2. Grosses volumétries sur sqlserver
    Par genio dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 31/08/2007, 12h33
  3. Pbleme UPDATE sur POSTGRESQL
    Par $grm$ dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/04/2004, 14h50
  4. [Crystal] Performance sur grosses base de données
    Par Nico118 dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 14/11/2003, 15h27
  5. update sur plusieurs nouvelles valeurs
    Par Mut dans le forum Langage SQL
    Réponses: 4
    Dernier message: 02/11/2003, 16h15

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