Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
4773 connectés 

 


Débat n°1




Attention si vous cliquez sur "voir les résultats" vous ne pourrez plus voter

 Mot :   Pseudo :  
  Aller à la page :
 
 Page :   1  2  3  4  5  6  7  8  ..  21  22  23  24  25  26
Auteur Sujet :

BlaBla@SQL

n°2005382
koskoz
They see me trollin they hatin
Posté le 28-06-2010 à 17:41:19  profilanswer
 

Reprise du message précédent :

Harkonnen a écrit :


tu diras à l'étron qui a pondu ça que EXISTS c'est pas fait pour les chiens


 
http://dev.mysql.com/doc/refman/5. [...] eries.html [:petrus dei]


---------------
Twitter
mood
Publicité
Posté le 28-06-2010 à 17:41:19  profilanswer
 

n°2005539
Oliiii
Posté le 29-06-2010 à 08:14:10  profilanswer
 

Un Select count(*) est plus performant qu'un select 1 si la query retourne plus qu'un enregistrement.
Le select count(*) ne retourne qu'un chiffre, alors qu'un select 1 va retourner une ligne par enregistrement.
 
Faire un Select count(*) prends toute son importance dans un IF EXISTS:

Code :
  1. -- 1
  2. SELECT COUNT(*) FROM perfmon.CounterData_Archive
  3. WHERE CounterDateTime BETWEEN '2010-06-22 00:01:59.663' AND '2010-06-23 00:01:59.663'
  4.     AND CounterID = 2
  5.  
  6. -- 2
  7. SELECT 1 FROM perfmon.CounterData_Archive
  8. WHERE CounterDateTime BETWEEN '2010-06-22 00:01:59.663' AND '2010-06-23 00:01:59.663'
  9.     AND CounterID = 2
  10.  
  11. -- 3
  12. IF EXISTS(SELECT 1 FROM perfmon.CounterData_Archive
  13. WHERE CounterDateTime BETWEEN '2010-06-22 00:01:59.663' AND '2010-06-23 00:01:59.663'
  14.     AND CounterID = 2)
  15.     Print '1'
  16.  
  17. -- 4
  18. IF EXISTS(SELECT count(*) FROM perfmon.CounterData_Archive
  19. WHERE CounterDateTime BETWEEN '2010-06-22 00:01:59.663' AND '2010-06-23 00:01:59.663'
  20.     AND CounterID = 2)
  21.     Print '*'


-- 1: 44ms, 6 reads, cost 0.0065662
-- 2: 114ms, 6 reads, cost 0.0065652
-- 3: 55ms, 3 reads, cost 0.0065705
-- 4: 0ms, 0 reads, cost  0.0000012

n°2005554
FlorentG
Posté le 29-06-2010 à 09:06:41  profilanswer
 

Ouais ça on sait [:moule_bite] Mais là c'est pour l'existence d'un seul enregistrement [:petrus dei]

n°2005568
Oliiii
Posté le 29-06-2010 à 09:29:54  profilanswer
 

Tout depend de ce qu'on en fait, si c'est possible autant prendre la bonne habitude d'utiliser Count(*) et EXISTS, mais c'est pas un drame ni une programmation porcine si c'est pas utilisé.
 
C'est 1000x plus important d'avoir des bons indexes et un bon design que de s'arreter sur un détail comme ca.
Bien que dans ce cas ci c'est interessant de voir que Count(*) et Exists ne generent aucun read et est virtuellement instantané, toujours bon a savoir si on cherche a optimiser un maximum.

n°2005575
koskoz
They see me trollin they hatin
Posté le 29-06-2010 à 09:46:05  profilanswer
 

Et les exists c'est propre à oracle ?
Parce que sur mysql je ne le trouve qu'avec une sous requête.


Message édité par koskoz le 29-06-2010 à 09:46:09

---------------
Twitter
n°2005576
mareek
Et de 3 \o/
Posté le 29-06-2010 à 09:47:35  profilanswer
 

FlorentG a écrit :

Ouais ça on sait [:moule_bite] Mais là c'est pour l'existence d'un seul enregistrement [:petrus dei]


Tu peux m'expliquer dans quel cas ce genre de micro opti,isation pourrait faire une différence ?


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
n°2005577
FlorentG
Posté le 29-06-2010 à 09:47:49  profilanswer
 

La SELECT 1 est tout légèrement plus rapide que SELECT COUNT(*), mais genre 0.001% plus rapide, donc négligeable.
 
Choisir suivant le style de la maison

n°2005580
FlorentG
Posté le 29-06-2010 à 09:48:50  profilanswer
 

mareek a écrit :

Tu peux m'expliquer dans quel cas ce genre de micro opti,isation pourrait faire une différence ?


T'as mal compris mon post :o Je sais très bien que ça change rien, c'est lui qui sort un bench pas en rapport avec la question

n°2005594
Oliiii
Posté le 29-06-2010 à 10:13:45  profilanswer
 

La question c'etait de savoir si Count(*) est meilleur que Select 1, je reponds en fournissant des chiffres.
 
Si ca c'est pas en rapport avec la question ...

n°2005596
FlorentG
Posté le 29-06-2010 à 10:14:38  profilanswer
 

En fait c'était parce qu'il voulait juste pour un seul enregistrement :) Après pour plusieurs effectivement un COUNT est mieux, vérifié sur mysql aussi

mood
Publicité
Posté le 29-06-2010 à 10:14:38  profilanswer
 

n°2005617
mareek
Et de 3 \o/
Posté le 29-06-2010 à 11:43:17  profilanswer
 

FlorentG a écrit :

La SELECT 1 est tout légèrement plus rapide que SELECT COUNT(*), mais genre 0.001% plus rapide, donc négligeable.
 
Choisir suivant le style de la maison


Si le style de la maison c'est de faire du code peu lisible et chiant a maintenir, SELECT 1 est effectivement un bon choix [:romf]

FlorentG a écrit :

En fait c'était parce qu'il voulait juste pour un seul enregistrement :) Après pour plusieurs effectivement un COUNT est mieux, vérifié sur mysql aussi


Il n'a pas précisé qu'il n'y aurait qu'un seul élément :spamafote:
 
De toute façon la question ne se pose même pas: dans un cas on a un syntaxe qui reflète ce qu'on cherche a faire et dans  l'autre on a une micro optimisation qui fera peut-être gagner un quart de nano seconde dans un cas non critique. Le choix est vite fait.


---------------
"I wonder if the internal negative pressure in self pumping toothpaste tubes is adjusted for different market altitudes." John Carmack
n°2005628
FlorentG
Posté le 29-06-2010 à 11:55:36  profilanswer
 

mareek a écrit :

Il n'a pas précisé qu'il n'y aurait qu'un seul élément :spamafote:


C'est ce que j'avais cru comprendre pourtant : "Pour savoir si on a un enregistrement en base, rien d'uatre." (sic) [:petrus dei]

n°2005630
skeye
Posté le 29-06-2010 à 11:56:35  profilanswer
 

Arrêtez de sodomiser des drosophiles, c'est pas un soucis de perfs mais plutôt "d'élégance"...son collègue préfère probablement une requête qui retourne toujours un résultat.:o


Message édité par skeye le 29-06-2010 à 12:00:12

---------------
Can't buy what I want because it's free -
n°2005639
FlorentG
Posté le 29-06-2010 à 12:02:14  profilanswer
 

Dans tous les cas on peut faire des trucs rigolo, genre avec l'API délicieusement verbeuse mysqli :

Code :
  1. $query = $mysqli->prepare('SELECT 1 FROM mytable WHERE field=value LIMIT 1');
  2. $query->execute();
  3.  
  4. $result = 0;
  5. $query->bind_result($result);
  6. $query->fetch();
  7.  
  8. var_dump((bool)$result);


Et hop on a un joli bool qui atteste si l'enregistrement existe ou pas :D

n°2006521
koskoz
They see me trollin they hatin
Posté le 02-07-2010 à 09:56:42  profilanswer
 

J'ai des colonnes dans ma clause where qui ont exactement le même nom et qui prennent la même valeur, y a possibilité de les grouper plutôt que de faire WHERE tbl1.fk_language = 1 and tbl2.fk_language = 2 ?


---------------
Twitter
n°2006536
skeye
Posté le 02-07-2010 à 10:23:05  profilanswer
 

koskoz a écrit :

J'ai des colonnes dans ma clause where qui ont exactement le même nom et qui prennent la même valeur, y a possibilité de les grouper plutôt que de faire WHERE tbl1.fk_language = 1 and tbl2.fk_language = 2 ?


si elles prennent la même valeur, pourquoi c'est une fois 1 et une fois 2? :D
Vu le nom que tu donnes, on dirait des clés étrangères, elles ne devraient pas être dans la jointure plutôt que dans le where, par hasard, tes colonnes?
C'es tquoi la requête complète?:o


---------------
Can't buy what I want because it's free -
n°2006541
koskoz
They see me trollin they hatin
Posté le 02-07-2010 à 10:53:22  profilanswer
 

skeye a écrit :


si elles prennent la même valeur, pourquoi c'est une fois 1 et une fois 2? :D
Vu le nom que tu donnes, on dirait des clés étrangères, elles ne devraient pas être dans la jointure plutôt que dans le where, par hasard, tes colonnes?
C'es tquoi la requête complète?:o

 

C'est bien toutes les deux avec une valeur 1, et oui, ce sont des clés étrangères, comment tu as deviné ? :o

 
Code :
  1. SELECT email, first_name, last_name, name AS level
  2. FROM account_has_advertisers AS tbl
  3.     LEFT JOIN account ON fk_account = pk_account
  4.     LEFT JOIN group_rights ON fk_group_rights = pk_group_rights
  5.     LEFT JOIN actor_status ON fk_status = pk_actor_status
  6. WHERE tbl.fk_advertiser = ?
  7.     AND actor_status.fk_language = ?
  8.     AND group_rights.fk_language = ?
  9.     AND pk_account != ?
 

Edit : on récupère la langue de l'user une seule fois et ensuite on le trimballe en session (en gros), c'est pour ça que c'est dans le where.

Message cité 2 fois
Message édité par koskoz le 02-07-2010 à 10:54:40

---------------
Twitter
n°2006542
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 02-07-2010 à 10:54:50  profilanswer
 

koskoz a écrit :


 
C'est bien toutes les deux avec une valeur 1, et oui, ce sont des clés étrangères, comment tu as deviné ? :o
 

Code :
  1. SELECT email, first_name, last_name, name AS level
  2. FROM account_has_advertisers AS tbl
  3.     LEFT JOIN account ON fk_account = pk_account
  4.     LEFT JOIN group_rights ON fk_group_rights = pk_group_rights
  5.     LEFT JOIN actor_status ON fk_status = pk_actor_status
  6. WHERE tbl.fk_advertiser = ?
  7.     AND actor_status.fk_language = ?
  8.     AND group_rights.fk_language = ?
  9.     AND pk_account != ?



avec le "fk"


---------------
J'ai un string dans l'array (Paris Hilton)
n°2006543
skeye
Posté le 02-07-2010 à 10:57:04  profilanswer
 

koskoz a écrit :


 
C'est bien toutes les deux avec une valeur 1, et oui, ce sont des clés étrangères, comment tu as deviné ? :o
 

Code :
  1. SELECT email, first_name, last_name, name AS level
  2. FROM account_has_advertisers AS tbl
  3.     LEFT JOIN account ON fk_account = pk_account
  4.     LEFT JOIN group_rights ON fk_group_rights = pk_group_rights
  5.     LEFT JOIN actor_status ON fk_status = pk_actor_status
  6. WHERE tbl.fk_advertiser = ?
  7.     AND actor_status.fk_language = ?
  8.     AND group_rights.fk_language = ?
  9.     AND pk_account != ?



 
ok, donc ce qui te fait chier c'est de passer 3 fois le même paramètre dans le langage appelant? Si oui, pourquoi tu ne nommes pas tes variables?
 

Code :
  1. SELECT email, first_name, last_name, name AS level
  2. FROM account_has_advertisers AS tbl
  3.     LEFT JOIN account ON fk_account = pk_account
  4.     LEFT JOIN group_rights ON fk_group_rights = pk_group_rights
  5.     LEFT JOIN actor_status ON fk_status = pk_actor_status
  6. WHERE tbl.fk_advertiser = :lang
  7.     AND actor_status.fk_language = :lang
  8.     AND group_rights.fk_language = :lang
  9.     AND pk_account != :account


---------------
Can't buy what I want because it's free -
n°2006544
lorill
Posté le 02-07-2010 à 10:57:32  profilanswer
 


[:prozac]

n°2006545
skeye
Posté le 02-07-2010 à 10:57:38  profilanswer
 


Je doute que sa question ait été sérieuse.[:dawak]


---------------
Can't buy what I want because it's free -
n°2006546
skeye
Posté le 02-07-2010 à 10:59:04  profilanswer
 

(sinon tu peux très bien faire passer des égalités sur fk_language dans les jointures, et n'en laisser qu'un dans le where.:o )

Message cité 1 fois
Message édité par skeye le 02-07-2010 à 10:59:14

---------------
Can't buy what I want because it's free -
n°2006547
koskoz
They see me trollin they hatin
Posté le 02-07-2010 à 10:59:10  profilanswer
 

skeye a écrit :

 

ok, donc ce qui te fait chier c'est de passer 3 fois le même paramètre dans le langage appelant? Si oui, pourquoi tu ne nommes pas tes variables?

 
Code :
  1. SELECT email, first_name, last_name, name AS level
  2. FROM account_has_advertisers AS tbl
  3.     LEFT JOIN account ON fk_account = pk_account
  4.     LEFT JOIN group_rights ON fk_group_rights = pk_group_rights
  5.     LEFT JOIN actor_status ON fk_status = pk_actor_status
  6. WHERE tbl.fk_advertiser = :lang
  7.     AND actor_status.fk_language = :lang
  8.     AND group_rights.fk_language = :lang
  9.     AND pk_account != :account


 

Ca résout à moitié le soucis.


Message édité par koskoz le 02-07-2010 à 11:00:13

---------------
Twitter
n°2006548
koskoz
They see me trollin they hatin
Posté le 02-07-2010 à 11:00:06  profilanswer
 

skeye a écrit :

(sinon tu peux très bien faire passer des égalités sur fk_language dans les jointures, et n'en laisser qu'un dans le where.:o )


 
Tu peux développer stp ?


---------------
Twitter
n°2006549
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 02-07-2010 à 11:03:39  profilanswer
 

skeye a écrit :


Je doute que sa question ait été sérieuse.[:dawak]


ma réponse ne l'était pas non plus, j'avais bien saisi son ironie

Message cité 1 fois
Message édité par Harkonnen le 02-07-2010 à 11:04:18

---------------
J'ai un string dans l'array (Paris Hilton)
n°2006551
koskoz
They see me trollin they hatin
Posté le 02-07-2010 à 11:04:50  profilanswer
 

Harkonnen a écrit :


ma réponse ne l'était pas non plus, j'avais bien saisi son ironie


 
Par contre on avait pas saisi ton humour [:dawa]


---------------
Twitter
n°2006552
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 02-07-2010 à 11:05:45  profilanswer
 

koskoz a écrit :


 
Par contre on avait pas saisi ton humour [:dawa]


je sais, c'est le drame de ma vie


---------------
J'ai un string dans l'array (Paris Hilton)
n°2006556
skeye
Posté le 02-07-2010 à 11:11:34  profilanswer
 

koskoz a écrit :

 

Tu peux développer stp ?

 


Code :
  1. SELECT email, first_name, last_name, name AS level
  2. FROM account_has_advertisers AS tbl
  3.     LEFT JOIN account ON fk_account = pk_account
  4.     LEFT JOIN group_rights ON fk_group_rights = pk_group_rights
  5.     LEFT JOIN actor_status ON fk_status = pk_actor_status AND group_rights.fk_language = actor_status.fk_language
  6. WHERE tbl.fk_advertiser = :advertiser
  7.     AND group_rights.fk_language = :lang
  8.     AND pk_account != :account

Message cité 1 fois
Message édité par skeye le 02-07-2010 à 11:12:00

---------------
Can't buy what I want because it's free -
n°2006564
koskoz
They see me trollin they hatin
Posté le 02-07-2010 à 11:22:01  profilanswer
 

skeye a écrit :


 
 

Code :
  1. SELECT email, first_name, last_name, name AS level
  2. FROM account_has_advertisers AS tbl
  3.     LEFT JOIN account ON fk_account = pk_account
  4.     LEFT JOIN group_rights ON fk_group_rights = pk_group_rights
  5.     LEFT JOIN actor_status ON fk_status = pk_actor_status AND group_rights.fk_language = actor_status.fk_language
  6. WHERE tbl.fk_advertiser = :advertiser
  7.     AND group_rights.fk_language = :lang
  8.     AND pk_account != :account



ofc, le and dans le on [:prozac]
Merci.


---------------
Twitter
n°2012535
mic_12
Posté le 28-07-2010 à 16:01:09  profilanswer
 

Bonjour,
 
Voici le contenu d'un script que j'exécute :
 

Citation :

set head off
set linesize 300
set newp none
set verify off
set feed off
set echo off
 
SELECT COUNT(*) FROM &1;
 
exit


Le problème c'est qu'il m'affiche en retour qu'il se connecte à la base de données avant de me donner le résultat. J'aimerais qu'il me retourne que le résultat. Je pensais que le set head off allait résoudre mon problème mais ce n'est pas le cas. Quelqu'un a une idée ? :)


---------------
Site photo
n°2012541
skeye
Posté le 28-07-2010 à 16:07:27  profilanswer
 

C'est de la syntaxe sqlplus, ça, pas vraiment du SQL.:D
J'ai ceux-là aussi dans un de nos scripts, doit bien y en avoir un qui fait l'affaire :D

 
Citation :


set heading off
set termout off
set pause off
set feedback off

 


Message édité par skeye le 28-07-2010 à 16:07:36

---------------
Can't buy what I want because it's free -
n°2012546
mic_12
Posté le 28-07-2010 à 16:16:41  profilanswer
 

en effet, c'est du sqlplus, désolé :jap:
j'ai déjà le heading et le feedback et le termout supprime le résultat ce qui fait que je n'ai plus que l'annonce de la connexion qui ressort :D
il me faut pile poile l'inverse :D


Message édité par mic_12 le 28-07-2010 à 16:17:01

---------------
Site photo
n°2012554
skeye
Posté le 28-07-2010 à 16:23:39  profilanswer
 

Tu exécutes ça comment?


---------------
Can't buy what I want because it's free -
n°2012557
mic_12
Posté le 28-07-2010 à 16:26:03  profilanswer
 

depuis un script shell sous linux :)


---------------
Site photo
n°2012559
skeye
Posté le 28-07-2010 à 16:28:22  profilanswer
 

mic_12 a écrit :

depuis un script shell sous linux :)


Alors c'est le shell qui te dit qu'il se connecte, pas ton script.
sqlplus -silent?


Message édité par skeye le 28-07-2010 à 16:28:43

---------------
Can't buy what I want because it's free -
n°2012569
mic_12
Posté le 28-07-2010 à 16:38:31  profilanswer
 

ca marche impec. :)
merci bien pour ton aide, je n'aurais jamais trouvé les options que l'on peut passer à sqlplus :jap:


---------------
Site photo
n°2014049
Rio Grande
bande de nains
Posté le 03-08-2010 à 22:57:59  profilanswer
 

Hello les SQLeux  :whistle:  
 
J'ai une question initialement posée ici.
 
"
Je me demandais juste quel serait la meilleure approche modéliser une base de donnée relationnelle sur des objets (avec conception d'héritage). Ce serait pour une base de téléchargement dans là quel il y a différent type de fichier (programme, vidéos, mods). C'est mieux de faire des tables séparées (quitte à avoir plusieurs fois les même champs dans chaque table [taille, date d'ajout, évaluation,...]) ou une unique table (ça me semble une mauvaise approche ) ou encore une table avec la champ commun. Bon c'est un peu une question de noob, mais je n'ai pas vraiment trouvé de réponse avec google (probablement les mauvais mots clé ?).  
"
 
Merci pour votre aide éventuelle (bon j'ai pas dis mais c'est dans un environnement php/mysql)


---------------
Topics : NFSU2 - NFS : Most Wanted - Volant PC Site :  NFS-Mania.com
n°2014071
Oliiii
Posté le 04-08-2010 à 07:30:56  profilanswer
 

Si il y a des champs qui ne sont pas commun a tout les types de fichiers le mieux c'est de faire une table par type.
Avoir une table commune c'est pratique si on veut pouvoir melanger tout les types (pour des recherches ou de l'affichage)

n°2014347
Rio Grande
bande de nains
Posté le 05-08-2010 à 08:15:57  profilanswer
 

Pas d'autre avis donc :p  
Merci pour la réponse :jap:


---------------
Topics : NFSU2 - NFS : Most Wanted - Volant PC Site :  NFS-Mania.com
n°2014640
exhortae
Membre du Cartel des Médecins
Posté le 05-08-2010 à 22:12:17  profilanswer
 

Rio Grande a écrit :

Pas d'autre avis donc :p  
Merci pour la réponse :jap:


 
 
Tu peux aussi t'inspirer d'hibernate pour choisir une solution
 
http://vinaytechs.blogspot.com/201 [...] rnate.html

n°2015799
koskoz
They see me trollin they hatin
Posté le 10-08-2010 à 16:17:04  profilanswer
 

J'ai la requête SQL suivante, qui me renvoie une liste de chiffres.
Je voudrai récupérer la valeur la plus petite, mais pas moyen [:pingouino]

 
Code :
  1. SELECT count(*)
  2. FROM account
  3.     INNER JOIN account_has_advertisers ON pk_account = fk_account
  4. WHERE account.fk_group_rights = 6
  5. GROUP BY fk_advertiser


Message édité par koskoz le 10-08-2010 à 16:19:15

---------------
Twitter
mood
Publicité
Posté le   profilanswer
 

 Page :   1  2  3  4  5  6  7  8  ..  21  22  23  24  25  26

Aller à :
Ajouter une réponse
 

Sujets relatifs
Requete SQL de selection complexe[SQL SERVER] Ajout d'une colonne en PS...mais inutilisable
[ODBC] DSN pour se connecter à une base SQL[PDO/SQL] Aide selection et classement (JOIN ??)
Problème conditions requete SQLSQL/PHP BDD de réservation de chambres
Jointure 'LIKE' SQL => BOtable SQL Ajouter une colonne au lieu de creer une nouvelle table
Requête SQL complexe 
Plus de sujets relatifs à : BlaBla@SQL


Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)