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 :

Accés rapide aux données


Sujet :

Développement SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2013
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2013
    Messages : 54
    Points : 47
    Points
    47
    Par défaut Accés rapide aux données
    Bonjour ,

    J'ai actuellement une base de données contenant une tabe qui a des millions de données.

    Je dois lire toutes les entrées de la table pour rechercher un champs particulier et le champs sur lequel la recherche doit se faire c'est un binaire (donc celà se faire mieux a partir du langage que par la BD).

    La structure de ma base données
    ID : bigint
    Image : varbinary(max)

    Je possède une fonction c# qui permet de faire la correspondance entre une image et N ( < 100 000) images (birnaire de la BD).

    Donc je dois lire les millions d'image dans ma base de données et passer a ma fonction pour la recherche.

    A ce stade j'ai crée une fonction Table donc a structure est la suivante :

    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
     
    CREATEFUNCTION FN_PAGINATION
    (	
    	-- Add the parameters for the function here
    	@Page int , 
        @Nombre int 
    )
    RETURNS TABLE 
    AS
    RETURN 
    (
    	WITH T AS (SELECT ID,
                              CAST(Image as varbinary(2048)) AS Image ,
     
                              ROW_NUMBER() OVER (ORDER BY IDDESC) AS sortOrder
                              FROM dbo.TP_Images)
            SELECT ID,Image
            FROM   T
            WHERE  sortOrder BETWEEN ((@page - 1) * @Nombre) + 1 
                             AND @page * @Nombre
     
    )
    GO
    Donc le logiciel PC chez l'utilisateur se connecte a la BD et boucle en lisant les données page par page jusqu'a epuissement de la lecture des données ou l'algorithme trouve l'image correspondant.

    Déjà je ne sais pas si l'architecture est bonne (client qui se connecte au serveur et récupéré les données pour faire le traitement ).
    NB : plusieurs utilisateur sont connecte au même moment.

    J'avoue que le temps de réponse est encore tres eleve mon objectif c'est de le reduire.

    Avez vous des astuces ?

  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 782
    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 782
    Points : 52 783
    Points
    52 783
    Billets dans le blog
    5
    Par défaut
    C'est effectivement une manière peu efficace à tous les niveaux.

    D'abord il faut s'assurer que la correspondance puisse bien être faite entre les deux binaire (images stockées et image recherchée). En effet, même si l'image est identique, le binaire peut être différent à cause des métadonnées. En effet, la plupart des formats (jpeg, gif, png....) incorpore au binaire de l'image des informations complémentaire qui peuvent varier dès qu'il y a manipulation de l'image, y compris même dans le cas d'une simple copie de l'image du répertoire à l'autre !

    Table :
    CREATE TABLE T_IMAGE_IMG
    (IMG_ID INT IDENTITY PRIMARY KEY,
    IMG_BINAIRE_IMAGE VARBINARY(max));
    GO


    Ensuite la technique la plus simple consiste à rajouter une colonne calculée contenant un hash du binaire (utiliser la fonction CHECKSUM) et l'indexer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ALTER TABLE T_IMAGE_IMG ADD IMG_H AS CHECKSUM(IMG_BINAIRE_IMAGE);
    CREATE INDEX X_IMG_BIN ON T_IMAGE_IMG (IMG_H);

    pour la recherche effectuer cette rechercher via une procédure qui va, dans un prePier temps retrouver le hash et en cas de collision, comparer les binaires.

    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
    CREATE PROCEDURE P_SEEK_IMAGE @IMG_BINAIRE_IMAGE VARBINARY(max)
    AS
    SET NOCOUNT ON;
    SELECT *
    INTO   #T
    WHERE  IMG_H = CHECKSUM(@IMG_BINAIRE_IMAGE);
    IF @@ROWCOUNT <= 1
    BEGIN
       SELECT * 
       FROM   #T
       RETURN;
    END;
     
    SELECT *
    FROM   #T
    WHERE  IMG_BINAIRE_IMAGE = @IMG_BINAIRE_IMAGE;
     
    GO

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

Discussions similaires

  1. [Android] Velocity : accès rapide aux données des stations LE vélo STAR
    Par mickaellf dans le forum Mon application mobile
    Réponses: 0
    Dernier message: 25/08/2011, 15h07
  2. Acces rapide aux données
    Par new.proger dans le forum JDBC
    Réponses: 4
    Dernier message: 18/07/2007, 15h19
  3. jsp mysql accès concurrents aux données
    Par elpeygey dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 26/04/2007, 14h03
  4. Réponses: 15
    Dernier message: 05/09/2006, 16h10
  5. Accés rapide aux propriétés d'un Objet
    Par Alacazam dans le forum C++Builder
    Réponses: 4
    Dernier message: 28/11/2002, 21h56

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