BlaBla@SQL - SQL/NoSQL - Programmation
Marsh Posté le 05-02-2010 à 10:27:11
A voté
Marsh Posté le 05-02-2010 à 10:44:11
Quel est l'âne qui a choisi SELECT * qu'on le pende par les couilles?
Marsh Posté le 05-02-2010 à 10:46:15
ReplyMarsh Posté le 05-02-2010 à 10:46:25
Bon ben cross-post
Table d'article avec une date de début, une date de retrait et un booléen publié ou non.
Code :
|
Mes requêtes types ressembleront à ça :
Code :
|
Bref, choper tous les articles actifs en cours de publication, par ordre de mise en ligne
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.
Marsh Posté le 05-02-2010 à 10:48:12
Arrêtez de foutre des NULL partout
Mettez une date à zéro par exemple, c'est moins relou.
Pour tout ce qui est indexage, vérifie déjà avec un EXPLAIN
Marsh Posté le 05-02-2010 à 10:52:49
BenO a écrit : c'est pas bien de faire ça ? |
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
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
Code :
|
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 :
|
Ça me sort ça
Code :
|
Hors c'est super lent, je vais retenter un explain mais je sais pas lire le résultat
Mais au pif si je dois indexer il faut que je le fasse sur quel column et pourquoi?
Marsh Posté le 05-02-2010 à 10:54:28
FlorentG a écrit : Arrêtez de foutre des NULL partout |
0 pour une colonne DateTime, ça va pas mettre le boxon ?
Quelle sera la différence avec NULL ?
Marsh Posté le 05-02-2010 à 11:00:06
Shinuza a écrit : Cross post aussi
|
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.
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?
Marsh Posté le 05-02-2010 à 11:02:06
seabee 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.
Marsh Posté le 05-02-2010 à 11:09:21
seabee a écrit :
|
Nan mais c'est juste instantané quoi
Merci
Need : Bouquin pour comprendre toute cette merde
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
Marsh Posté le 05-02-2010 à 11:25:57
drasche a écrit : |
Ouais enfin sauf si ta table a des dimensions gargantuesques osef
Marsh Posté le 05-02-2010 à 11:27:43
masklinn a écrit : Ouais enfin sauf si ta table a des dimensions gargantuesques osef |
Ne pas prévoir, c'est déjà gémir.
Marsh Posté le 05-02-2010 à 11:30:35
SELECT count(*) FROM episodes |
SELECT count(*) FROM shows |
SELECT [...] AND episodes.airdate > '2010-02-05 11:18:16.243000' |
J'ajoute mes indexes
SELECT [...] AND episodes.airdate > '2010-02-05 11:18:16.243000' |
Wait what?
Marsh Posté le 05-02-2010 à 11:37:54
Shinuza a écrit :
|
et tant que t'y es, remplace donc ton
Code :
|
par
Code :
|
je ne le répeterais jamais assez : les jointures par WHERE, c'est le mal
Marsh Posté le 05-02-2010 à 11:42:07
Harkonnen a écrit : |
explique
Marsh Posté le 05-02-2010 à 11:49:17
Harkonnen a écrit :
|
C'est l'ORM qui génère son truc
Mais pendant que t'es là, on me suggère à la place de
Code :
|
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?
Marsh Posté le 05-02-2010 à 11:49:17
lorill a écrit : |
oh je me prends régulièrement la tronche ici avec plein de monde à ce sujet
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
Marsh Posté le 05-02-2010 à 11:53:41
- je reviendrai lire les questions quand j'aurai le temps.
Marsh Posté le 05-02-2010 à 11:56:05
Mouais, rien de bien convaincant, donc.
Marsh Posté le 05-02-2010 à 11:57:02
masklinn a écrit :
|
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 :
|
Marsh Posté le 05-02-2010 à 11:59:21
lorill a écrit : Mouais, rien de bien convainquant, donc. |
Non, il fait son intégriste.
Marsh Posté le 05-02-2010 à 11:59:58
Harkonnen a écrit :
|
Oui mais non, justement, apparemement je peux faire ça mieux avec http://www.postgresql.org/docs/8.4 [...] alues.html
edit: mmm d'après la page d'après ça pourrait donner:
Code :
|
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...
moi je dis ça, je dis rien hein, ça arrive bien plus souvent qu'on ne le croit
Marsh Posté le 05-02-2010 à 12:01:26
masklinn a écrit : |
tiens, l'array() de php en sql.
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.
Marsh Posté le 05-02-2010 à 12:02:54
Harkonnen a écrit :
|
Utiliser JOIN c'est juste une question de bonnes pratiques/lisibilité, tes réactions sont toujours excessives.
Marsh Posté le 05-02-2010 à 12:04:44
skeye a écrit : - je reviendrai lire les questions quand j'aurai le temps. |
pareil
Marsh Posté le 05-02-2010 à 12:07:12
skeye a écrit : |
Bah c'est pas mal pour créer une table temporaire OTF, et ça fait partie du standard en plus
Marsh Posté le 05-02-2010 à 12:07:50
masklinn a écrit :
|
Ça doit pouvoir s'arranger : SQLAlchemy. Ça devrait donner un truc du genre :
Code :
|
Edith :
Code :
|
[noob]
C'est quoi inner/outer join?
Marsh Posté le 05-02-2010 à 12:16:32
Shinuza a écrit : [noob] |
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 :
|
au lieu de
Code :
|
Marsh Posté le 05-02-2010 à 10:15:42
C'est parti
Message édité par FlorentG le 05-02-2010 à 10:17:20