2011-05-11 3 views
0

Je voudrais optimiser cette requête en utilisant SQLite 3.Optimisation d'une requête SQLite simple, si possible!

SELECT id FROM Table WHERE value = (SELECT max(value) FROM Table WHERE value < myvalue) 
    UNION 
SELECT id FROM Table WHERE value = (SELECT min(value) FROM Table WHERE value > myvalue); 

Je veux que le 2 plus proche id d'une valeur donnée. Exemple: id 20, valeur 50. L'identifiant le plus proche pourrait être 3 avec la valeur 48 (valeur max inférieure) et dessus id 4 avec valeur 55 (valeur min supérieure).

SQLite 3 n'a pas toutes les caractéristiques d'une base de données réelle, si vous avez quelque chose de mieux que je peux utiliser, merci!

Répondre

0
SELECT 
(SELECT id FROM test WHERE value < myvalue ORDER BY value DESC LIMIT 1) as below, 
(SELECT id FROM test WHERE value > myvalue ORDER BY value ASC LIMIT 1) as above; 

cela devrait parler En théorie être plus rapide becase il utilise deux scans de table intead de quatre. En tout cas, je voudrais créer une table avec quelques enregistrements millon et tester différentes requêtes avec le temporisateur. (.timer ON dans la console sqlite).

Assurez-vous également de tester avec et sans index sur la valeur. Parfois, en particulier lorsque la taille de l'index est plus grande que votre mémoire, les index sont inutiles.

Si la vitesse est le vrai problème, envisager un stockage de lumière alternative, comme le Cabinet Kyoto .

+0

Il semble courir un peu plus vite mais je n'ai pas encore assez de lignes pour vraiment voir la différence. Merci ! – Kikohs

0

Voici une autre façon de le faire. Je ne sais pas si c'est plus rapide en sqlite. Vous pouvez toujours essayer.

select id 
from table 
where value - myvalue > 0 
order by abs(value - myvalue) asc 
limit 1 
union all 
select id 
from table 
where value - myvalue < 0 
order by abs(value - myvalue) desc 
limit 1 
+0

Chaque requête individuelle fonctionne, mais tous ensemble échoue: [1er ORDER BY terme ne correspond pas à une colonne dans le jeu de résultats] Exception Nom: NS_ERROR_FAILURE – Kikohs

+0

peut-être ma requête manque-t-elle de parenthèses pour délimiter les deux sous-requêtes unies. – Joel

+0

Je pense que l'erreur est plus sur l'ordre 2 par. SQLite ne semble pas les aimer. – Kikohs

0
SELECT id FROM Table WHERE value > myvalue ORDER BY value LIMIT 1 
SELECT id FROM Table WHERE value < myvalue ORDER BY value DESC LIMIT 1 

cette solution n'a pas de sous-sélection, d'analyse de table et pas de fonction de groupe ou mathématique étrangère. mais a besoin de deux requêtes

vous devriez index Table.value