BlaBla@SQL

BlaBla@SQL - SQL/NoSQL - Programmation

Marsh Posté le 05-02-2010 à 10:15:42    

C'est parti :o


Message édité par FlorentG le 05-02-2010 à 10:17:20
Reply

Marsh Posté le 05-02-2010 à 10:15:42   

Reply

Marsh Posté le 05-02-2010 à 10:17:30    

J'ai mis un sondage :o

Reply

Marsh Posté le 05-02-2010 à 10:17:48    

premier vote \o/


---------------
Python Python Python
Reply

Marsh Posté le 05-02-2010 à 10:18:09    

Merde j'avais pas voté.

Reply

Marsh Posté le 05-02-2010 à 10:18:24    

1 partout, balle au centre.

Reply

Marsh Posté le 05-02-2010 à 10:19:14    

[:drapo]
 
ça peut etre intéressant :D
 
et col1, col2, col3 bien sur :o


Message édité par Jubijub le 05-02-2010 à 10:19:50

---------------
Jubi Photos : Flickr - 500px
Reply

Marsh Posté le 05-02-2010 à 10:27:11    

A voté :o


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 05-02-2010 à 10:44:11    

Quel est l'âne qui a choisi SELECT * qu'on le pende par les couilles? :o


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 05-02-2010 à 10:45:08    

C'est BenO, le premier qui a voté :o

Reply

Marsh Posté le 05-02-2010 à 10:46:15    

c'est pas bien de faire ça ? [:cerveau cupra]


---------------
Python Python Python
Reply

Marsh Posté le 05-02-2010 à 10:46:15   

Reply

Marsh Posté le 05-02-2010 à 10:46:25    

Bon ben cross-post :o

 

Table d'article avec une date de début, une date de retrait et un booléen publié ou non.

Code :
  1. t.boolean  :active        # publié ou non
  2. t.datetime :starts_at     # date de publication
  3. t.datetime :ends_at       # date de retrait


Mes requêtes types ressembleront à ça :

 
Code :
  1. SELECT col1, col2 FROM articles
  2. WHERE (starts_at IS NULL OR .starts_at < DATE.now) AND (ends_at IS NULL OR ends_at > DATE.now) AND active = true
  3. ORDER BY starts_at DESC
 

Bref, choper tous les articles actifs en cours de publication, par ordre de mise en ligne :o

 

starts_at aura TOUJOURS une valeur;
ends_at quasiment jamais de valeur;
active quasiment toujours à true;

 

J'indexe quoi et dans quel ordre ?

 

Pour l'instant je pensais à juste starts_at. Et je ne sais pas comment MySQL réagi au OR dans les conditions..
Enfin bref, si qqun a une idée. :o


Message édité par seabee le 05-02-2010 à 10:47:34
Reply

Marsh Posté le 05-02-2010 à 10:48:12    

Arrêtez de foutre des NULL partout :o
 
Mettez une date à zéro par exemple, c'est moins relou.
 
Pour tout ce qui est indexage, vérifie déjà avec un EXPLAIN

Reply

Marsh Posté le 05-02-2010 à 10:52:49    

BenO a écrit :

c'est pas bien de faire ça ? [:cerveau cupra]


C'est mieux dans le sens où le serveur doit pas deviner quels champs tu veux, tu fais potentiellement transiter moins de données sur le réseau si tu rajoutes des champs dont t'as pas forcément besoin :o
 
Bon sinon dans un registre différent, j'ai une chouette requête dont on voit qu'elle a été écrite puis maintenue par deux personnes différentes :o
 

Code :
  1. SELECT * FROM Table1, Table2, Table3
  2. WHERE Table1.id = Table2.table1id
  3. AND Table2.id = Table3.table2id
  4.  
  5. UNION
  6.  
  7. SELECT * FROM Table1
  8. INNER JOIN Table2 ON Table1.id = Table2.table1id
  9. INNER JOIN Table3 ON Table2.id = Table3.table2id


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 05-02-2010 à 10:53:31    

Cross post aussi
 
Deux tables :
 
Shows qui a une relation one to many sur Episodes , je veux récuperer tous les épisodes liés à un show dont l'airdate est superieur à date.now
 

Code :
  1. pending = session\
  2.                .query(Show.id, Show.showname, Episode.id,  Episode.season, Episode.num, Episode.title, Episode.airdate)\
  3.                .filter(Episode.show_id.in_(watched_shows))\
  4.                .filter(Show.id == Episode.show_id)\
  5.                .filter(Episode.airdate > datetime.now())


Ça me sort ça

Code :
  1. SELECT
  2.    shows.id AS shows_id,
  3.    shows.showname AS shows_showname,
  4.    episodes.id AS episodes_id,
  5.    episodes.season AS episodes_season,
  6.    episodes.num AS episodes_num,
  7.    episodes.title AS episodes_title,
  8.    episodes.airdate AS episodes_airdate
  9. FROM
  10.    shows, episodes
  11. WHERE
  12.    episodes.show_id IN (?, ?, ?, ?)
  13. AND shows.id = episodes.show_id
  14. AND episodes.airdate > ?


 
Hors c'est super lent, je vais retenter un explain mais je sais pas lire le résultat :o
Mais au pif si je dois indexer il faut que je le fasse sur quel column et pourquoi?
 
:jap:


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 05-02-2010 à 10:54:28    

FlorentG a écrit :

Arrêtez de foutre des NULL partout :o
 
Mettez une date à zéro par exemple, c'est moins relou.
 
Pour tout ce qui est indexage, vérifie déjà avec un EXPLAIN


0 pour une colonne DateTime, ça va pas mettre le boxon ?
Quelle sera la différence avec NULL ?

Reply

Marsh Posté le 05-02-2010 à 11:00:06    

Shinuza a écrit :

Cross post aussi
 
Deux tables :
 
Shows qui a une relation one to many sur Episodes , je veux récuperer tous les épisodes liés à un show dont l'airdate est superieur à date.now
 

Code :
  1. pending = session\
  2.                .query(Show.id, Show.showname, Episode.id,  Episode.season, Episode.num, Episode.title, Episode.airdate)\
  3.                .filter(Episode.show_id.in_(watched_shows))\
  4.                .filter(Show.id == Episode.show_id)\
  5.                .filter(Episode.airdate > datetime.now())


Ça me sort ça

Code :
  1. SELECT
  2.    shows.id AS shows_id,
  3.    shows.showname AS shows_showname,
  4.    episodes.id AS episodes_id,
  5.    episodes.season AS episodes_season,
  6.    episodes.num AS episodes_num,
  7.    episodes.title AS episodes_title,
  8.    episodes.airdate AS episodes_airdate
  9. FROM
  10.    shows, episodes
  11. WHERE
  12.    episodes.show_id IN (?, ?, ?, ?)
  13. AND shows.id = episodes.show_id
  14. AND episodes.airdate > ?


 
Hors c'est super lent, je vais retenter un explain mais je sais pas lire le résultat :o
Mais au pif si je dois indexer il faut que je le fasse sur quel column et pourquoi?
 
:jap:


Fais un index multi colonne (show_id, airdate) qui te servira pour ta requête et toutes les jointures sur les show (left-most machin)
Et un autre sur airdate pour les cas ou tu auras à trier par airdate sans jointure.
ça devrait poutrer sa mère.

Reply

Marsh Posté le 05-02-2010 à 11:02:04    

Quelqu'un sait quelle est la taille limite de set quand on fait un WHERE foo IN set? Pour postgres?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-02-2010 à 11:02:06    

seabee a écrit :


0 pour une colonne DateTime, ça va pas mettre le boxon ?
Quelle sera la différence avec NULL ?


Enfin un 0000-00-00 00:00:00, du coup pas besoin de tests pour voir si c'est NULL (requête simplifiée). Et une colonne nullable prend plus de place.

Reply

Marsh Posté le 05-02-2010 à 11:09:21    

seabee a écrit :


Fais un index multi colonne (show_id, airdate) qui te servira pour ta requête et toutes les jointures sur les show (left-most machin)
Et un autre sur airdate pour les cas ou tu auras à trier par airdate sans jointure.
ça devrait poutrer sa mère.


Nan mais c'est juste instantané quoi [:pingouino]

 

Merci [:prosterne]

 

Need : Bouquin pour comprendre toute cette merde


Message édité par Shinuza le 05-02-2010 à 11:10:03

---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 05-02-2010 à 11:17:20    

FlorentG a écrit :

Enfin un 0000-00-00 00:00:00, du coup pas besoin de tests pour voir si c'est NULL (requête simplifiée). Et une colonne nullable prend plus de place.


Et si tu indexes ce champ, ça bouffe de la place inutilement dans l'index [:bien]


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 05-02-2010 à 11:25:57    

drasche a écrit :


Et si tu indexes ce champ, ça bouffe de la place inutilement dans l'index [:bien]


Ouais enfin sauf si ta table a des dimensions gargantuesques osef :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-02-2010 à 11:27:43    

masklinn a écrit :

Ouais enfin sauf si ta table a des dimensions gargantuesques osef :o


Ne pas prévoir, c'est déjà gémir.


---------------
Whichever format the fan may want to listen is fine with us – vinyl, wax cylinders, shellac, 8-track, iPod, cloud storage, cranial implants – just as long as it’s loud and rockin' (Billy Gibbons, ZZ Top)
Reply

Marsh Posté le 05-02-2010 à 11:30:35    

SELECT count(*) FROM episodes
// 866552


 

SELECT count(*) FROM shows
// 17881


 

SELECT [...] AND episodes.airdate > '2010-02-05 11:18:16.243000'
// Query executed within 3171ms


 
J'ajoute mes indexes
 

SELECT [...] AND episodes.airdate > '2010-02-05 11:18:16.243000'
// Query executed within 78ms


 
Wait what? [:cerveau lent]


---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 05-02-2010 à 11:37:54    

Shinuza a écrit :

SELECT count(*) FROM episodes
// 866552


 

SELECT count(*) FROM shows
// 17881


 

SELECT [...] AND episodes.airdate > '2010-02-05 11:18:16.243000'
// Query executed within 3171ms


 
J'ajoute mes indexes
 

SELECT [...] AND episodes.airdate > '2010-02-05 11:18:16.243000'
// Query executed within 78ms


 
Wait what? [:cerveau lent]


et tant que t'y es, remplace donc ton  

Code :
  1. FROM
  2.    shows, episodes
  3. WHERE
  4.    episodes.show_id IN (?, ?, ?, ?)
  5. AND shows.id = episodes.show_id
  6. AND episodes.airdate > ?


par

Code :
  1. FROM
  2.    shows INNER JOIN episodes ON shows.id = episodes.show_id
  3. WHERE
  4.    episodes.show_id IN (?, ?, ?, ?)
  5. AND episodes.airdate > ?


je ne le répeterais jamais assez : les jointures par WHERE, c'est le mal


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-02-2010 à 11:42:07    

Harkonnen a écrit :


je ne le répeterais jamais assez : les jointures par WHERE, c'est le mal


explique

Reply

Marsh Posté le 05-02-2010 à 11:49:17    

Harkonnen a écrit :


et tant que t'y es, remplace donc ton  

Code :
  1. FROM
  2.    shows, episodes
  3. WHERE
  4.    episodes.show_id IN (?, ?, ?, ?)
  5. AND shows.id = episodes.show_id
  6. AND episodes.airdate > ?


par

Code :
  1. FROM
  2.    shows INNER JOIN episodes ON shows.id = episodes.show_id
  3. WHERE
  4.    episodes.show_id IN (?, ?, ?, ?)
  5. AND episodes.airdate > ?


je ne le répeterais jamais assez : les jointures par WHERE, c'est le mal


C'est l'ORM qui génère son truc :o
 
Mais pendant que t'es là, on me suggère à la place de  

Code :
  1. SELECT foo FROM mytable WHERE bar IN (1, 2, 3, 4, 5, ..., 999, 1000)


de faire un "join sur un values pattern".
 
J'ai trouvé VALUES dans la doc de postgres, mais je vois pas quel join faire, halp?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-02-2010 à 11:49:17    


oh je me prends régulièrement la tronche ici avec plein de monde à ce sujet :D
le post le plus récent à ce sujet étant celui ci : http://forum.hardware.fr/hfr/Progr [...] 6363_1.htm
 
mais bon, si tu cherches, y'en a plein d'autres, y compris en MP [:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-02-2010 à 11:53:41    

[:drapo] - je reviendrai lire les questions quand j'aurai le temps.[:petrus75]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 05-02-2010 à 11:56:05    

Mouais, rien de bien convaincant, donc.

Message cité 2 fois
Message édité par lorill le 05-02-2010 à 12:01:12
Reply

Marsh Posté le 05-02-2010 à 11:57:02    

masklinn a écrit :


C'est l'ORM qui génère son truc :o
 
Mais pendant que t'es là, on me suggère à la place de  

Code :
  1. SELECT foo FROM mytable WHERE bar IN (1, 2, 3, 4, 5, ..., 999, 1000)


de faire un "join sur un values pattern".
 
J'ai trouvé VALUES dans la doc de postgres, mais je vois pas quel join faire, halp?


ben tu génères une table temporaire avec tes 1000 valeurs, que tu appellera Tmp par exemple et un champ "bar"
puis ensuite tu fais ta jointure :
 

Code :
  1. SELECT foo FROM mytable INNER JOIN Tmp ON mytable.foo = Tmp.bar



---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-02-2010 à 11:59:21    

lorill a écrit :

Mouais, rien de bien convainquant, donc.


Non, il fait son intégriste.:o


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 05-02-2010 à 11:59:58    

Harkonnen a écrit :


ben tu génères une table temporaire avec tes 1000 valeurs


Oui mais non, justement, apparemement je peux faire ça mieux avec http://www.postgresql.org/docs/8.4 [...] alues.html :o

 

edit: mmm d'après la page d'après ça pourrait donner:

Code :
  1. SELECT foo FROM mytable INNER JOIN (VALUES mes_valeurs) AS tmp (bar) ON mytable.foo = tmp.bar

Message cité 2 fois
Message édité par masklinn le 05-02-2010 à 12:02:24

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-02-2010 à 12:01:02    

lorill a écrit :

Mouais, rien de bien convainquant, donc.


du tout... sauf à mélanger critères de jointure et critère de filtre dans la même requête, multipliant ainsi les risques de CROSS JOIN (et donc de mise en croix du serveur aussi) en cas de suppression par mégarde d'un ou plusieurs critères de jointure là où on voulait supprimer un filtre... :sarcastic:
moi je dis ça, je dis rien hein, ça arrive bien plus souvent qu'on ne le croit [:cosmoschtroumpf]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 05-02-2010 à 12:01:26    

masklinn a écrit :


Oui mais non, justement, apparemement je peux faire ça mieux avec http://www.postgresql.org/docs/8.4 [...] alues.html :o


tiens, l'array() de php en sql.[:doc petrus]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 05-02-2010 à 12:02:13    

Harkonnen a écrit :

en cas de suppression par mégarde d'un ou plusieurs critères de jointure là où on voulait supprimer un filtre...  


 
ouais. Et dans ton code, si on vire des lignes sans réfléchir, ca peut aussi casser des choses.
oh la la.

Reply

Marsh Posté le 05-02-2010 à 12:02:54    

Harkonnen a écrit :


du tout... sauf à mélanger critères de jointure et critère de filtre dans la même requête, multipliant ainsi les risques de CROSS JOIN (et donc de mise en croix du serveur aussi) en cas de suppression par mégarde d'un ou plusieurs critères de jointure là où on voulait supprimer un filtre... :sarcastic:
moi je dis ça, je dis rien hein, ça arrive bien plus souvent qu'on ne le croit [:cosmoschtroumpf]

 

Utiliser JOIN c'est juste une question de bonnes pratiques/lisibilité, tes réactions sont toujours excessives.:o

Message cité 1 fois
Message édité par skeye le 05-02-2010 à 12:03:10

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 05-02-2010 à 12:04:44    

skeye a écrit :

[:drapo] - je reviendrai lire les questions quand j'aurai le temps.[:petrus75]


pareil


---------------
Nos estans firs di nosse pitite patreye...
Reply

Marsh Posté le 05-02-2010 à 12:07:12    

skeye a écrit :


tiens, l'array() de php en sql.[:doc petrus]


Bah c'est pas mal pour créer une table temporaire OTF, et ça fait partie du standard en plus :o


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 05-02-2010 à 12:07:50    

masklinn a écrit :


C'est l'ORM qui génère son truc :o

Ça doit pouvoir s'arranger : SQLAlchemy. Ça devrait donner un truc du genre :

 
Code :
  1. pending = session\
  2.          .query(Show.id, Show.showname, Episode.id,  Episode.season, Episode.num, Episode.title, Episode.airdate)\
  3.          .select_from(join(Show, Episode, Show.id==Episode.show_id))\
  4.          .filter(Episode.show_id.in_(watched_shows))\
  5.          .filter(Episode.airdate > datetime.now())
 

Edith :

 
Code :
  1. SELECT
  2.    shows.id AS shows_id,
  3.    shows.showname AS shows_showname,
  4.    episodes.id AS episodes_id,
  5.    episodes.season AS episodes_season,
  6.    episodes.num AS episodes_num,
  7.    episodes.title AS episodes_title,
  8.    episodes.airdate AS episodes_airdate
  9. FROM
  10.    shows JOIN episodes ON shows.id = episodes.show_id
  11. WHERE
  12.    episodes.show_id IN (?, ?, ?, ?)
  13. AND
  14.    episodes.airdate > ?
 

[noob]

 

C'est quoi inner/outer join?

Message cité 2 fois
Message édité par Shinuza le 05-02-2010 à 12:10:56

---------------
Mains power can kill, and it will hurt the entire time you’re dying from it.
Reply

Marsh Posté le 05-02-2010 à 12:16:32    

Shinuza a écrit :

[noob]
 
C'est quoi inner/outer join?


 
Outer retourne les enregistrements d'un table même s'ils n'ont pas de correspondance dans l'autre.
 
ça permet de faire des jointures externes pour remplacer des sous-requêtes couteuses, en ajoutant des clauses where qui ont l'air stupides :
 

Code :
  1. SELECT count(i.cod_ind)
  2. FROM individu i JOIN ins_adm_etp iae ON (iae.cod_ind = i.cod_ind)
  3.     LEFT OUTER JOIN ins_adm_etp iae2 ON
  4.        (iae2.cod_ind = i.cod_ind
  5.            AND iae2.cod_anu = 2008
  6.            AND iae2.eta_iae = 'E'
  7.            AND iae2.cod_cmp IN (600, 700, 420, 400)
  8.        )
  9. WHERE iae.eta_iae = 'E'
  10. AND iae.cod_cmp IN (600, 700, 420, 400)
  11. AND iae.cod_anu IN (2007, 2006, 2005)
  12. AND iae2.cod_ind IS NULL;


 
au lieu de  
 

Code :
  1. SELECT count(i.cod_ind)
  2. FROM individu i JOIN ins_adm_etp iae ON (iae.cod_ind = i.cod_ind)
  3. WHERE iae.eta_iae = 'E'
  4. AND iae.cod_cmp IN (600, 700, 420, 400)
  5. AND iae.cod_anu IN (2007, 2006, 2005)
  6. AND NOT EXISTS (
  7.    SELECT 1
  8.    FROM individu i2 JOIN ins_adm_etp iae2 ON (iae2.cod_ind = i2.cod_ind)
  9.    WHERE iae2.cod_anu = 2008
  10.    AND iae2.eta_iae = 'E'
  11.    AND iae2.cod_cmp IN (600, 700, 420, 400)
  12.    AND i.cod_ind = i2.cod_ind
  13.    );

Message cité 1 fois
Message édité par skeye le 05-02-2010 à 12:22:47

---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed