90 votes

Les différences de rendement entre le signe égal (=) et avec une valeur

Comment SQL moteurs diffèrent lorsque nous utilisons le signe égal et EN exploitant ont la même valeur? N'temps d'exécution des changements?

1er à l'aide de l'égalité vérifier l'opérateur

WHERE column_value = 'All'

2ème utilisation OU de l'opérateur et la valeur unique

WHERE column_value IN ('All')

SQL moteur de change IN de = si une seule valeur est-il?

Quelle est la différence pour les mêmes dans MySQL et PostgreSQL?

101voto

sagi Points 32665

Il n'y a pas de différence entre ces deux états, et l'optimiseur va transformer l' IN de la = lorsque IN ont juste un élément en elle.

Mais quand vous avez une question comme ça, il suffit d'exécuter les deux déclarations, exécuter leur plan d'exécution et de voir les différences. Ici vous ne trouverez pas.

Après une grosse recherche en ligne, j'ai trouvé un document sur SQL à l'appui de cette(je suppose qu'il s'applique à tous les SGBD):

Si il n'y a qu'une seule valeur à l'intérieur de la parenthèse, ce félicitons est équivalent à

OÙ "column_name" = 'valeur1

Voici le lien vers le document.

Voici le plan d'exécution de deux requêtes à l'Oracle (la Plupart des SGBD va traiter ce le même) :

EXPLAIN PLAN FOR
select * from dim_employees t
where t.identity_number = '123456789'

Plan hash value: 2312174735
-----------------------------------------------------
| Id  | Operation                   | Name          |
-----------------------------------------------------
|   0 | SELECT STATEMENT            |               |
|   1 |  TABLE ACCESS BY INDEX ROWID| DIM_EMPLOYEES |
|   2 |   INDEX UNIQUE SCAN         | SYS_C0029838  |
-----------------------------------------------------

Et pour IN() :

EXPLAIN PLAN FOR
select * from dim_employees t
where t.identity_number in('123456789');

Plan hash value: 2312174735
-----------------------------------------------------
| Id  | Operation                   | Name          |
-----------------------------------------------------
|   0 | SELECT STATEMENT            |               |
|   1 |  TABLE ACCESS BY INDEX ROWID| DIM_EMPLOYEES |
|   2 |   INDEX UNIQUE SCAN         | SYS_C0029838  |
-----------------------------------------------------

Comme vous pouvez le voir, les deux sont identiques. C'est sur une colonne indexée. En va de même pour une colonne indexée (juste full table scan) .

11voto

John Points 59

Il n'y a pas de grandes différences vraiment, mais si votre column_value est indexé, IN opérateur ne peut pas le lire comme un indice.

Rencontré ce problème une fois, donc soyez prudent.

8voto

Rahul Tripathi Points 1

Il n'y a pas de différence lorsque vous l'utilisez avec une seule valeur. Si vous consultez le tableau d'analyse, analyse d'index ou index de recherche pour les deux requêtes, vous trouverez qu'il n'y a pas de différence entre les deux requêtes.

Quelle est la différence pour les mêmes dans Mysql et PostgresSQL?

Non, il n'aurait pas de différence sur les deux moteurs(Enfait il en serait de même pour la plupart des bases de données telles que SQL Server, Oracle, etc). Les deux moteurs de convertir IN de =

5voto

alexis Points 10856

Apprendre à un homme à pêcher, etc. Voici comment faire pour voir par vous-même ce que les variations sur vos interrogations se faire:

mysql> EXPLAIN SELECT * FROM sentence WHERE sentence_lang_id = "AMH"\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: sentence
         type: ref
possible_keys: sentence_lang_id
          key: sentence_lang_id
      key_len: 153
          ref: const
         rows: 442
        Extra: Using where

Et nous allons essayer dans l'autre sens:

mysql> EXPLAIN SELECT * FROM sentence WHERE sentence_lang_id in ("AMH")\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: sentence
         type: ref
possible_keys: sentence_lang_id
          key: sentence_lang_id
      key_len: 153
          ref: const
         rows: 442
        Extra: Using where

Vous pouvez lire ici sur la façon d'interpréter les résultats d'une base de données mysql EXPLAIN la demande. Pour l'instant, notez que nous avons obtenu à l'identique de sortie pour les deux requêtes: exactement le même "plan d'exécution" est généré. L' type ligne nous dit que la requête utilise un index non unique (une clé étrangère, dans ce cas), et l' ref ligne nous indique que la requête est exécutée par la comparaison d'une valeur constante à l'encontre de cet indice.

3voto

TheGameiswar Points 21

Unique DANS la Clause,il n'y a pas de différence..ci-dessous est une démo à l'aide d'un EMPS table, j'ai..

select * from emps where empid in (1)
select * from emps where empid=1

Prédicat de la Première Requête en exécution du plan:

[PerformanceV3].[dbo].[Emps].[empID]=CONVERT_IMPLICIT(int,[@1],0)

Prédicat pour la deuxième requête dans le plan d'exécution:

[PerformanceV3].[dbo].[Emps].[empID]=CONVERT_IMPLICIT(int,[@1],0)

Si vous avez plusieurs valeurs dans la Clause,de son mieux pour les convertir à joint

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X