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

Développement SQL Server Discussion :

[2019] Problème entre partitionnement et Full text Search


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 460
    Par défaut [2019] Problème entre partitionnement et Full text Search
    Bonjour,
    Je rencontre la problématique suivante : j'ai une table qui doit être partitionnée sur un champ date et qui doit accepter le Full Text Search sur une autre colonne.
    Pour le partitionnement, j'ai fait les étapes suivantes :
    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
     
    CREATE PARTITION FUNCTION myRangePF1 (date)
        AS RANGE RIGHT FOR VALUES ('2025-04-01', '2025-05-01', '2025-06-01') ;
    GO
     
    CREATE PARTITION SCHEME ValueDatePartScheme
        AS PARTITION myRangePF1    ALL TO ('PRIMARY') ;
    GO
     
     
    CREATE TABLE [test].[ImportedFiles](
        [ID] [bigint] IDENTITY(1,1) NOT NULL,
        [ImportName] [varchar](256) NOT NULL,
        [ImportDate] [date] NOT NULL,
        CONSTRAINT [PK_ImportedFiles] PRIMARY KEY NONCLUSTERED
        (
            [ID] ASC, [ImportDate] ASC
        ) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [ValueDatePartScheme]([ImportDate])
    ) ;

    Mais lorsque j'essaie de mettre le Full Text Search en place sur la colonne ImportName, j'ai ce message d'erreur
    PK_ImportedFiles is not a valid index to enforce a full-text search key.
    A full-text search key must be a unique, non-nullable, single-column index which is not offline, is not defined on a non-deterministic or imprecise nonpersisted computed column, does not have a filter, and has maximum size of 900 bytes.
    Choose another index for the full-text key.
    Je comprend qu'il faut un index CLUSTERED mais je ne vois pas sur quel champ le créer.

    Comment faire pour avoir en même temps une table partitionnée sur le champ date et FTS activé sur le champ ImportName svp ?

    merci d'avance

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 754
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 754
    Par défaut
    Hello,

    L'erreur ne dit pas qu'il faut un index CLUSTERED. Elle dit qu'il faut un index unique... single-column. Votre PK (ID, ImportDate) échoue car elle a deux colonnes.

    La solution consiste à ne pas utiliser la Clé Primaire comme clé pour le FTS :

    1. Créer une Clé Primaire optimisée pour le partitionnement (alignée).
    2. Créer un deuxième index, unique et sur une seule colonne, spécifiquement pour le FTS, et le rendre non-aligné.


    Que donne ce code ?

    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
    -- Vos fonctions et schémas sont corrects (pas de changement)
    CREATE PARTITION FUNCTION myRangePF1 (date)
        AS RANGE RIGHT FOR VALUES ('2025-04-01', '2025-05-01', '2025-06-01') ;
    GO
    CREATE PARTITION SCHEME ValueDatePartScheme
        AS PARTITION myRangePF1
        ALL TO ('PRIMARY') ; -- Pour cet exemple, tout sur PRIMARY. En production, vous auriez des filegroups différents.
    GO
     
    -- ÉTAPE 1: Modifier la création de la table
    -- Nous changeons la PK pour qu'elle soit CLUSTERED et alignée.
    -- C'est la meilleure pratique pour le partitionnement.
    CREATE TABLE [test].[ImportedFiles](
        [ID] [bigint] IDENTITY(1,1) NOT NULL,
        [ImportName] [varchar](256) NOT NULL,
        [ImportDate] [date] NOT NULL,
     
        -- La PK est maintenant CLUSTERED et ALIGNÉE.
        -- Elle commence par la colonne de partition pour une performance optimale.
        CONSTRAINT [PK_ImportedFiles] PRIMARY KEY CLUSTERED
        (
            [ImportDate] ASC, -- Clé de partition en premier
            [ID] ASC          -- ID pour garantir l'unicité
        )
        WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF)
        -- La PK elle-même est placée sur le schéma de partition
        ON [ValueDatePartScheme]([ImportDate])
    )
    -- La table (le CLUSTERED INDEX) est placée sur le schéma de partition
    ON [ValueDatePartScheme]([ImportDate]);
    GO
     
    -- ÉTAPE 2: Créer l'index dédié pour le Full-Text Search
    -- Cet index est unique, sur une seule colonne (ID), et NON-ALIGNÉ.
    CREATE UNIQUE NONCLUSTERED INDEX [IX_FTS_Key]
    ON [test].[ImportedFiles] ([ID])
    -- Nous le plaçons sur [PRIMARY] car il n'est pas aligné (il ne contient pas ImportDate)
    ON [PRIMARY];
    GO
     
    -- ÉTAPE 3: Créer votre index Full-Text
    -- (En supposant que votre catalogue 'ftCatalog' existe)
    CREATE FULLTEXT INDEX ON [test].[ImportedFiles](ImportName)
        -- Dites à FTS d'utiliser VOTRE NOUVEL index comme clé
        KEY INDEX [IX_FTS_Key]
        ON (ftCatalog); -- Remplacez par le nom de votre catalogue FTS
    GO
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre émérite
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2004
    Messages : 460
    Par défaut
    Désolé, j'avais oublié de remercier pour la réponse.
    Merci pour l'aide, problème résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment activer full-text search ?
    Par momoh dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/04/2009, 17h27
  2. Full Text Search et Contains () - Y a-t-il des limitations ?
    Par SetaSensei dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/06/2008, 17h33
  3. Hibernate et le Full Text Search de MySQL
    Par ygrim dans le forum Hibernate
    Réponses: 4
    Dernier message: 28/02/2008, 12h10
  4. Full text search
    Par val2007 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 01/10/2007, 12h22
  5. Text mining et full text search
    Par icebe dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/07/2007, 14h35

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