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

InterBase Discussion :

[Volume des tables et performance]


Sujet :

InterBase

  1. #1
    Membre éclairé
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Par défaut [Volume des tables et performance]
    Bonjour, decidement, aujourd'hui je suis tres integrogatif.
    Aux risques de me faire huer, je me demande quels sont les performances d'IB6 sur des requetes style SELECT avec des tables de 5000 enreg ou 15000 enreg. (Je ne peux pas faire ce test puisque mon archi n'est pas fini.)
    Dans une table d'article, j'ai 3 champs qui peuvent en etre la cle, CODEART, CODEBARRE,NUMSERIE. La cle reelle pour IB est CODEART.
    Je pensais faire mes requetes de cette maniere :
    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
     
    /* Je veux savoir si l'entre NEW.CODE est un article : */
    SELECT COUNT(*) FROM ARTICLE A
    WHERE A.CODEART = NEW.CODE
    INTO entier
    IF (entier = 0) THEN
       BEGIN
          /* Ca peut aussi etre un article mais represente par son code barre */
          SELECT CODEART,COUNT(*) FROM ARTICLE A
          WHERE A.CODEBARRE = NEW.CODE
          INTO code,entier
          IF (entier = 1) THEN NEW.CODE = code;
          ELSE
             BEGIN
                /* Ou bien par son numero de serie */
                SELECT CODEART,COUNT(*) FROM ARTICLE A
                WHERE A.NUMSERIE = NEW.CODE
                INTO code,entier
                IF (entier = 1) THEN NEW.CODE = code;
                ELSE EXCEPTION ArticleInexistant;
             END
       END
    Ouf, j'espere que c'est clair.
    Donc je me demande si c'est viable ou bien si je ne ferais pas mieux de n'avoir qu'une seule colonne cle et de faire une petite table annexe pour lier les cle entre elles. Mais ca multiplierait le nombre d'enregistrements par 3.

    Je m'excuse d'avoir ete si long, mais c'est pour exposer mon probleme du mieux que possible.
    Merci d'avance.

  2. #2
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Si vous utilisez NEW c'est que le code provient d'un trigger.

    Or je ne comprend pas vraiment (enfin si je comprend) ce que vous cherchez à faire...

    Code est une colonne de votre table article. Il est impensable qu'elle corresponde à une autre colonne (Numéro de série ou code barre).

    Tout d'abord celà ne marchera que si ces trois colonnes sont de même type. Ce qui dans l'absolue n'est pas vrai, un code à barre c'est plutot que du numérique, un identifiant un entier mais ca peut etre aussi du caractère et pour le numéro de série il n'est pas rare d'y voir du caractère...
    Donc pour moi ca voudrait dire mélanger des choux et des carottes.

    J'ai l'impression que vous confondez l'architecture de votre base avec une fonctionnalitée que vous voulez apporter à vos utilisateurs qui est de laissez la possibilité de saisir aussi bien un identifiant, un code à barre et un numéro de série.

    Or conceptuellement il n'est pas dans le domaine de l'impossible que vous inseriez un jour un identifiant qui correspond à un numéro de code à barre. Et lorsque vous allez inserer l'article qui porte ce code à barre il va vous rejetter vous disans qu'il existe déjà...

    Bref que des problemes...

    Vous avez 3 colonnes , il faut les différenciers sinon vous allez au devant de graves problemes.

    Pour vos utilisateurs soit vous leurs demandez par quoi ils veulent rechercher (Identifiant, num serie ou code à barre) puis sachant ca vous faite la requete de recherche sur la bonne colonne (ce qui est plus efficace d'un point de vue performance) soit si vraiment ca vous embete de demander à l'utilisateur... vous faite une requete de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select Code, Code_barre, Num_serie, nom_article ... from article where Code= :Id_Recherche or Code_barre=:Id_Recherche or  Num_serie =:Id_Recherche;

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Par défaut
    Encore merci pour votre aide.

    Vous avez tout a fais compris le probleme. ces trois champs sont sous forme de code a barre et sont lu indifferement par lecteur optique. Et effectivement, je passe par un trigger, celui de ma table commande pour verifier que j'insere bien une ligne avec un article existant.
    Comme je dois permettre cette fonctionnalite qui est de selectionner l'article par un de ces trois champs ...

    Avec ce que vous m'avez dit tout a l'heure ( merci), est ce que d'apres vous cette requete est apropriee :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    IF EXIST (
       SELECT CODEART, CODEBARRE, NUMSERIE FROM ARTICLE A
       WHERE A.CODEART = NEW.CODE OR 
                    A.CODEBARRE = NEW.CODE OR
                    A.NUMSERIE = NEW.CODE
       )

  4. #4
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Il me semble que Exist n'accepte que les select * from.
    C'est dans quel trigger que vous voulez faire ca ?

  5. #5
    Membre éclairé
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Par défaut
    dans le trigger before insert de ma table commande.

    Cela dit, ca conviendrai aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    IF EXIST ( 
       SELECT * FROM ARTICLE A 
       WHERE A.CODEART = NEW.CODE OR 
                    A.CODEBARRE = NEW.CODE OR 
                    A.NUMSERIE = NEW.CODE 
       )

    Cela me pousse vers une autre integrogation : Comment contraindre l'unicite d'une valeur dans 3 champs differents. Est t-il possible de definir ma table article comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE TABLE Article (
    CodeArt VARCHAR(10) NOT NULL UNIQUE,
    CodeBarre VARCHAR(25) UNIQUE,
    NumSerie VARCHAR(25) UNIQUE,
    Libelle Varchar(40),
    (...)
    CONSTRAINT CP_Article PRIMARY KEY(CodeArt),
    CONSTRAINT U_CodeArt CHECK CodeArt NOT IN (SELECT CodeBarre FROM Article) OR CodeArt NOT IN (SELECT NumSerie FROM Article),
    CONSTRAINT U_CodeBarre CHECK CodeBarre NOT IN (SELECT CodeArt FROM Article) OR CodeBarre NOT IN (SELECT NumSerie FROM Article),
    CONSTRAINT U_NumSerie CHECK NumSerie NOT IN (SELECT CodeArt FROM Article) OR NumSerie NOT IN (SELECT CodeBarre FROM Article)
    )
    Reste plus qu'a verifier dans un trigger before insert que NEW.CodeArt <> NEW.CodeBarre <> NEW.NumSerie

  6. #6
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    Je ne comprend pas ce que ca vient faire dans le before insert.

    Ces 3 colonnes n'étant pas de même nature, je ne comprend pas ce que vous voulez faire à part mélanger des choux et des carottes.

    Lorsque vous allez créer un article, vous allez demander la saisie :
    du code,
    du numero de serie,
    du code à barre,
    libellé etc..
    non ?

    Une fois cette saisie effectuée vous allez faire un insert dans la table article.

    Votre préocupation à ce niveau c'est d'éviter qu'il y ait des doublons.
    Et donc une Le code étant votre clé primaire, il n'y aura pas de doublons, il ne reste plus qu'à créer un index unique sur Numero de serie et un autre index unique sur code à barre. Et c'est fini.

  7. #7
    Membre éclairé
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Par défaut
    C'est vrai, je m'excuse, c'est pas tres clair.
    OK Deja il faut que mes trois champs soit de meme taille : VARCHAR(25)
    En admettant que ma table de donnee soit renseignee comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    CodeArt	CodeBarre		NumSerie		Libelle	(...)
    00001	#null# 		#null#		azertyu
    00002	1234567		456789		bvcx
    00003	00001  		00002		#null#
    00004	456789 		az2511		frfsdf
    Je veux eviter les doublons entre colonnes comme 00001 dans CodeArt & CodeBarre ou 456789 ou 00002.

    J'ai peut etre trouve autre chose, une contrainte dans la definition de la table :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CONSTRAINT ArtUnique UNIQUE (CodeArt,CodeBarre,NumSerie)
    Est ce la solution et est ce que cela tolere les valeurs nulles des colonnes CodeBarre et NumSerie???

  8. #8
    Membre éclairé
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Par défaut
    Je viens de me rendre compte de ce qui n'etait pas clair. Rien ne vaut que de poser les choses dans leur contexte en bonne et du forme :

    J'ai 2 tables principales :
    COMMANDES (NumCommande, Date, NumLigne, Article, Quantite, PrixU, ... )
    et
    ARTICLES (CodeArt, CodeBarre, NumSerie, Libelle , Fournisseur, PrixAchat, ...)

    L'interface utilisateur permet de saisir soit une nouvelle commande, soit d'editer une commande existante pour ajouter des article dessus. NumCommande, Date et NumLigne se generes et sont renseignes automatiquement. L'utilisateur n'a plus qu'a saisir (avec lecteur code barre) l'article qu'il veut ajouter a la commande. Pour plus de souplesse, j'ai la contrainte de permettre a l'utilisateur de saisir l'article soit par le code interne de l'article, soit par son code article du fournisseur, soit encore par le numero de serie de l'article.
    Pour m'assurer que dans une commande, j'insere un article existant, mon champ Article de la table Commandes doit interagir avec les trois champs de la table Articles qui sont CodeArt, CodeBarre et NumSerie.

  9. #9
    Membre Expert
    Avatar de Barbibulle
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    2 052
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 2 052
    Par défaut
    AHHHHH d'accord c'est un peu plus clair merci.
    Donc c'est le trigger before insert de la table commande.
    Vous voulez vérifier que l'article ajouté à la commande se trouve bien dans la table des articles.

    Moi je ferais pas comme ça car celà vous complique inutilement vos traitements.

    Dans commande la colonne Article doit toujours correspondre à la clé primaire de la table article (donc à CodeArt).
    Je crée une clé étrangère (foreign Key) pour m'assurer que l'article ajouté à la commande existe bien dans la table Article.
    Ensuite si vous ne voulez pas avoir deux fois le même article dans une même commande (ça pourrait arriver pourtant il me semble) je créerai un index unique sur (Numcommande,Article)

    Ensuite le problème que vous avez est de trouver cet article à inserer dans cette commande. Car en entrée vous pouvez avoir soit un codeart soit un num série soit un code a barre.

    Je développerai une procédure stoquée qui va chercher le CodeArt en fonction de la saisie.
    Et le résultat de cette recherche me servirait à faire l'insertion ou à alerter l'application que l'article n'a pas été trouvé.
    Si l'article est trouvé alors j'utilise le CodeArt retourné par la procédure stoquée pour inserer la commande dans la table commande.

  10. #10
    Membre éclairé
    Inscrit en
    Juin 2002
    Messages
    409
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 409
    Par défaut
    Hummm ! effectivement, ce serait surement plus simple en passant par une procedure stockee car cela me permet laisser IB gerer l'integrite de la zone Article de la table commande.

    Je vous remercie 1000 fois pour tous ces conseils.

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

Discussions similaires

  1. [11GR3] Performances très longues sur des tables sys
    Par ApprentiOracle dans le forum Administration
    Réponses: 3
    Dernier message: 18/04/2013, 14h47
  2. Travailler sur des vues ou sur des tables, vs performance ?
    Par carjo dans le forum Administration
    Réponses: 3
    Dernier message: 06/02/2009, 14h46
  3. Performance, taille des tables=> nbr de champs
    Par shadeoner dans le forum Requêtes
    Réponses: 5
    Dernier message: 05/12/2007, 14h26
  4. Liste des tables d'une bases de données spécifique
    Par faridos23 dans le forum Requêtes
    Réponses: 3
    Dernier message: 26/08/2003, 23h20
  5. noms des tables d'une base
    Par molto dans le forum SQL
    Réponses: 2
    Dernier message: 17/03/2003, 23h14

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