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 :

Mi calcul, mi table = mi-nable ?


Sujet :

MS SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut Mi calcul, mi table = mi-nable ?
    Bonjour.

    J'aimerais faire une VIEW pour y lister tous les entiers possible (de -2,147,483,648 à 2,147,483,647).
    Dans la plupart des cas, les valeurs utilisées seraient les entiers strictement positifs juq'uà une certaine valeur (1000 ? 10000 ?).
    Afin de tirer parti d'un index, je pensais donc faire une table indexée allant de 1 à 4096.

    Donc la view est l'union des valeurs
    -2,147,483,648 à 0 (valeurs calculés)
    1 à 4096 (table indexée)
    4097 à 2,147,483,647 (valeurs calculés)

    Malheureusement si je fais par exemple sur une telle view un COUNT pour tout entier entre 10 et 20, la requête est très très longue.
    Alors qu'elle pourrait se contenter d'utiliser l'index de la table, la requête fait un tas d'opération inutiles (d'un regard humain).

    J'ai pourtant bien essayer d'aider SQL Server à bien comprendre l'origine des différentes plages de valeurs à grand renfort de BETWEEN avec quelques essaient même de CASE, de subqueries et j'en passe.

    Malheureusement, il n'existe pas à ma connaissance de possibilité d'indiqué que le résultat d'une colonne est par exempe un entier entre 4097 à 2,147,483,647.
    Je dis ça, parce que si ma view renvoie par exemple :

    pour n de -2,147,483,648 à 0, 0 pour la colonne 'table'
    pour n de 1 à 4096, 1 pour la colonne 'table'
    pour n de 4097 à 2,147,483,647, 0 pour la colonne 'table'

    Et que je fais un query pour retrouver n entre 10 et 20 et 'table' = 1, SQL server se rend bien compte que la valeur 1 n'est présente que dans le résultat en provenance de la table.

    Savez vous que faire pour:
    1) soit donner un "hint" à sql server sur le range d'une valeur de colonne
    2) soit créer un type entier dans un range
    3) soit faire comprendre autrement à SQL Server où chercher les lignes
    ?

    Merci.

  2. #2
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Avez vous un check sur la table indexée stipulant que les valeurs sont comprises entres 1 et 4096?
    Peut-on voir le code de la vue?
    Donc la view est l'union des valeurs
    -2,147,483,648 à 0 (valeurs calculés)
    1 à 4096 (table indexée)
    4097 à 2,147,483,647 (valeurs calculés)
    Passez peut être par trois tables/vues(mais beaucoup de lignes...) avec des CHECK pour les plages avant de faire l'union cela devrait suffire?

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    Citation Envoyé par iberserk Voir le message
    Peut-on voir le code de la vue?

    Passez peut être par trois tables/vues avec des CHECK pour les plages avant de faire l'union cela devrait suffire?
    Je n'ai jamais vu de CHECK sur des vues.
    Quant à tout avoir en table, 4 milliards d'entiers dans une table c'est au moins 20Giga en SQL Server (Logs exclu).

  4. #4
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Citation Envoyé par Sergejack Voir le message
    Je n'ai jamais vu de CHECK sur des vues.
    Quant à tout avoir en table, 4 milliards d'entiers dans une table c'est au moins 20Giga en SQL Server (Logs exclu).
    Oui j'avais édité mon message entre-temps

  5. #5
    Membre Expert Avatar de iberserk
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Novembre 2004
    Messages
    1 795
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Gironde (Aquitaine)

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

    Informations forums :
    Inscription : Novembre 2004
    Messages : 1 795
    Par défaut
    Je n'ai jamais vu de CHECK sur des vues.
    je parles bien de passer un CHECK sur la table indexée...

    Après on va clairement vous demander l’intérêt d'une telle 'VUE'.

    Avez vous essayé de préciser le BETWEEN dans la définition de la vue en ajoutant un prédicat sur la table indexée?

  6. #6
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Par défaut
    J'ai essayé plein de choses dont celle là.
    Mais rien n'y a fait.

    Par contre depuis j'ai réussit à mieux cerné le cas qui pose le problème.
    L problème apparaît avec les nombres négatifs, si je retire tout ce qui est soustraction, SQL Server parvient à agir intelligemment.

    Le problème est que je souhaite pouvoir parcourir ces nombres négatifs.

    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
     
    IF  EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vTally]'))
    DROP VIEW [dbo].[vTally]
    GO
     
    CREATE VIEW dbo.vTally
    AS
    WITH
    L1 AS (SELECT 1 AS n UNION ALL SELECT 1) -- 2^1
    , L2 AS (SELECT X.n FROM L1, L1 AS X) -- (2^1)^2 = 2^2
    , L3 AS (SELECT X.n FROM L2, L2 AS X) -- (((2^1)^2)^2 = 2^4
    , L4 AS (SELECT X.n FROM L3, L3 AS X) -- ((((2^1)^2)^2)^2 = 2^8
    , L5 AS (SELECT X.n FROM L4, L4 AS X) -- (((((2^1)^2)^2)^2)^2 = 2^16
    , L6 AS (SELECT X.n FROM L5, L5 AS X) -- ((((((2^1)^2)^2)^2)^2)^2 = 2^32
    , L7 AS (SELECT ROW_NUMBER() OVER (ORDER BY n) - 2147483647 AS n FROM L6)
    SELECT
    	T.n
    FROM Utils.dbo.tTally AS T
    WHERE T.n BETWEEN 1 AND 65536
     
    UNION ALL
     
    SELECT
    	L.n
    FROM L7 AS L
    WHERE L.n BETWEEN - 2147483647 AND 0
     
    UNION ALL
     
    SELECT
    	L.n
    FROM L7 AS L
    WHERE L.n BETWEEN 65537 AND 2147483647

Discussions similaires

  1. Somme à partir d’un calcul d’une table
    Par GCAccess dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/11/2011, 00h09
  2. Mesure calculée Pivot Table OLAP
    Par adirat dans le forum Excel
    Réponses: 1
    Dernier message: 14/11/2008, 17h18
  3. Mise à jour champs par calcul sur table jointe
    Par SylvainM dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/03/2008, 17h38
  4. Calcul sur Table
    Par benjaminalvarez dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/02/2008, 03h52
  5. somme sur champ calculé et table liée
    Par pierrot67 dans le forum Bases de données
    Réponses: 6
    Dernier message: 06/11/2006, 18h02

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