Android SQLite Leistung in komplexen Abfragen

Angenommen, ich habe diese Art von Abfrage

String sql = "SELECT s.team_id, s.team_name, s.gp, sw, st, sl, s.go, s.ga, s.score, sp FROM " + "(SELECT team_id, team_name, SUM (gp) gp, SUM (w) w, SUM (t) t, SUM (l) l, SUM (GO) go, SUM (GA) ga, SUM (GO)- SUM (GA) score, SUM (2*w+t) p FROM " + "(SELECT t._id team_id, t.name team_name, COUNT(CASE WHEN score_home IS NOT NULL THEN 1 END) gp, COUNT (CASE WHEN score_home > score_away THEN 1 END) w," + " COUNT (CASE WHEN score_home = score_away THEN 1 END) t, COUNT (CASE WHEN score_home < score_away THEN 1 END) l," + " SUM (score_home) go, SUM (score_away) ga" + " FROM team_table t LEFT OUTER JOIN match_table m ON m.team_home = t._id" + " WHERE t.tournament_id = ? GROUP BY t._id, t.name" + " UNION ALL" + " SELECT t._id team_id, t.name team_name, COUNT(CASE WHEN score_away IS NOT NULL THEN 1 END) gp, COUNT (CASE WHEN score_home < score_away THEN 1 END) w," + " COUNT (CASE WHEN score_home = score_away THEN 1 END) t, COUNT (CASE WHEN score_home > score_away THEN 1 END) l," + " SUM (score_away) go, SUM (score_home) ga" + " FROM team_table t LEFT OUTER JOIN match_table m ON m.team_away = t._id" + " WHERE t.tournament_id = ? GROUP BY t._id, t.name)" + " GROUP BY team_id, team_name) s" + " ORDER BY sp DESC, s.score DESC, s.go ASC"; 

Die dann so verwendet wird

 Cursor cursor = database.rawQuery(sql, args); cursor.moveToFirst(); while (!cursor.isAfterLast()) { TeamStats stat = new TeamStats(); stat.setTeamId(cursor.getLong(0)); stat.setTeamName(cursor.getString(1)); stat.setGamesPlayed(cursor.getInt(2)); stat.setWins(cursor.getInt(3)); stat.setTies(cursor.getInt(4)); stat.setLoses(cursor.getInt(5)); stat.setGoalsOwn(cursor.getInt(6)); stat.setGoalsAgaist(cursor.getInt(7)); stat.setScore(cursor.getInt(8)); stat.setPoints(cursor.getInt(9)); stats.add(stat); cursor.moveToNext(); } cursor.close(); 

So wählt es Werte aus vielen Tischen, macht einige Operationen etc. Wie Sie sehen können, ist die Abfrage schrecklich komplex (sehr schwer zu debuggen) und die Performance scheint nicht so gut zu sein, wie ich es erwarten würde. Meine Fragen sind:

  1. Kann ich den performace mit einer vorbereiteten Aussage verbessern?
  2. Wäre es schneller, einfachere Abfragen durchzuführen und sie manuell mit einem benutzerdefinierten Code zu verarbeiten?

  • SQLite Fremdschlüssel
  • Sollte ich .close () auf SQLiteDatabase und SQLiteOpenHelper anrufen
  • Android SimpleCursorAdapter mit Abfragen mit DISTINCT
  • SQLite-Tabelle mit Integer-Spalte speichert Zeichenfolge
  • "SELECT last_insert_rowid ()" gibt immer "0" zurück
  • Laden Sie die SQLite-Datenbank aus dem Internet herunter und laden Sie sie in die Android-Anwendung
  • So verwenden Sie rawQuery, um einen Datensatz einzufügen
  • GreenDao tiefe Abfragen mit n: m Beziehungen
  • 5 Solutions collect form web for “Android SQLite Leistung in komplexen Abfragen”

    Wenn ich Sie wäre, würde ich Ihre sqlite-Datenbank zum Host kopieren und dann versuchen, sie manuell in einer SQLite-GUI auszuführen, während sie gebundene Variablen ( ? ) Mit tatsächlichen Variablenwerten ersetzen. Für GUI auf Windows, ich wirklich wie SQLite Expert Personal , und auf Linux sqliteman ist ziemlich gut.

    Beim Debuggen deines SQL (in Kommandozeile oder GUI), achten Sie darauf, Ihre SQL-Anweisungen zu analysieren, indem Sie sie unter EXPLAIN und / oder EXPLAIN QUERY PLAN . Achten Sie auf Tisch-Scans. Sie sollten versuchen, teure Scans zu eliminieren, indem Sie Indizes hinzufügen. Aber nicht alles eintragen – das kann es noch schlimmer machen. Oft können Sie große Performance-Gewinne durch die Verwendung von Compound (Multi-Spalte) Indizes. Beachten Sie, dass auf einer bestimmten Tabelle SQLite nicht mehr als nur einen Index verwenden kann (während die Ausführung der SQL-Anweisung) – also, wählen Sie Ihre Indizes mit Bedacht aus. (Siehe auch die grundlegende Erläuterung in der Abfrageplanung .)

    Und um Ihre Bedenken über die Datenverarbeitung in Java vs. SQLite – ich denke, dass voll optimiert (mit richtigen Indizes, etc.) SQLite Abfrage gegen relationale Daten wird (fast) immer schneller als manuelle Verarbeitung dieser Daten in Java. Das muss in Ihrem Fall besonders wahr sein – alle Ihre Daten sind grundsätzlich relational.

    Eine kleine Anmerkung aber: Ihr Android APK, das Java verwendet, hat möglicherweise Zugriff auf mehr Speicher als SQLite standardmäßig – Sie können die SQLite-Cachegröße für Ihre Datenbank mit setMaxSqlCacheSize() (Äquivalent von PRAGMA cache_size ) PRAGMA cache_size . Android-Standard ist 10 (max 100), versuchen Sie es zu erhöhen und sehen, ob macht einen Unterschied für Ihre Abfrage. Beachten Sie, dass Desktop-SQLite-Standard für diese Einstellung viel höher ist – 2000.

    Zuerst weiß ich nicht viel über SQLite, aber ich nehme an, dass es sich mehr oder weniger wie MS SQL-Server verhalten wird.

    Am häufigsten wird ein Performance-Problem für eine einfache Abfrage wie folgt in der Regel auf den Fall eines fehlenden Index, was zu einer vollständigen Tabelle Scan anstelle einer partiellen Tabelle Scan oder eine Tabelle suchen. Wenn du keinen Index auf team_table.tournament_id hast, dann muss SQLite die ganze Tabelle scannen, um die "t.tournament_id =?" Auszuführen. Betrieb. Das gleiche wird passieren mit match_table.team_home und match_table.team_away: ein fehlender Index wird aus einer vollständigen Tabelle Scan für die Join-Operationen auf m.team_home und m.team_away zu tun.

    Für den Rest können Sie Ihre Abfrage auf zwei Arten vereinfachen. Der erste wird sein, um die äußere Unterabfrage zu löschen und Ausdrücke oder Spalten zu verwenden, die in deinem Auftrag bestellen; Dh Sie können die "ORDER BY sp DESC, s.score DESC, s.go ASC" mit "ORDER BY SUM (2 * w + t) DESC, SUM (GO) – SUM (GA) DESC, SUM ( GO) ASC "und loszuwerden, die Unterabfrage s.

    Der zweite Weg wäre, die UNION durch eine einzige Abfrage zu ersetzen, indem sie die linke Verknüpfungsoperation sowohl auf m.team_home als auch m.team_away gleichzeitig ausführt:

    … FROM team_table t LINK OUTER JOIN match_table m ON (m.team_home = t._id oder m.team_away = t._id) …

    Danach ist es sehr einfach, deine Case-Anweisungen zu ändern, um die verschiedenen Scores auf weither zu berechnen. T._id ist gleich m.team_home oder m.team_away. Auf diese Weise können Sie nicht nur die UNION fallen lassen, sondern auch die zweite Unterabfrage.

    Schließlich musst du einen Blick auf die Verwendung des linken Verbandes werfen; Da bin ich mir nicht sicher, ob es wirklich über die Verwendung eines regelmäßigen Inner Join erforderlich ist.

    Danach musst du am Ende mit einer einfachen Verknüpfung Query mit einem Group By und einem Order By und ohne Unterabfrage oder Vereinigung und eventuell ohne jeglichen Linken. Doch an diesem Punkt könnten die Ausdrücke in der Ordnung durch ein wenig kompliziert geworden sein, so dass Sie die Entscheidung treffen müssen, sie entweder so zu halten, indem sie eine Unterabfrage zurückgeben oder Spalten bestellen (meine letzte Lieblingswahl).

    Ohne die Union sollte die Abfrage mindestens zweimal so schnell, aber letztlich, um eine gute Leistung zu haben, wird die ultimative Anforderung sein, alle richtigen Indizes zu haben; Andernfalls wird die Leistung niemals gut sein, wenn der sql-Server mehrere vollständige Tabellen-Scannings durchführen muss.

    Persönlich würde ich empfehlen, dass Sie Ihre Fragen und Datenbank-Struktur so einfach wie möglich auf Android zu halten, und tun Sie große Verarbeitung durch Code.

    Ein Grund, denn eine komplizierte Datenbankstruktur, die mit der Notwendigkeit verarbeitet wird, Upgrades und Downgrades der verschiedenen Versionen der App zu verarbeiten, ohne Daten zu verlieren, kann schnell aus der Hand kommen. Ich neige jetzt dazu, die Daten in einer Art NoSQL-Weise einzurichten und zu behandeln.

    Ein weiterer Grund ist, weil SQLite fehlt eine Menge Funktionalität, die in realen Aufgaben erforderlich wäre und Sie werden am Ende Verarbeitung von Daten über Code sowieso. Zum Beispiel gibt es keine Trig-Funktionen, so dass die nächsten Artikel, kann kompliziert werden;)

     private String getRelitiveDistanceQuery( double lng, double lat, int max){ return "SELECT *, " + // NOTE: this long query was done because there are no trig functions in SQLite so this is an series expansion of some of the functions "((3.14159265358979/2-( ((("+Double.toString(lat)+"*0.0174532925199433)-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/6+("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/120-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/5040)*((`lat`*0.0174532925199433)-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/6+(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/120-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/5040)+(1-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/2+("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/24-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/720)*(1-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/2+(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/24-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/720)*(1-(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)/2+(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)/24-(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)/720))+1/6*((("+Double.toString(lat)+"*0.0174532925199433)-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/6+("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/120-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/5040)*((`lat`*0.0174532925199433)-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/6+(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/120-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/5040)+(1-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/2+("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/24-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/720)*(1-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/2+(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/24-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/720)*(1-(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)/2+(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)/24-(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)/720))*((("+Double.toString(lat)+"*0.0174532925199433)-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/6+("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/120-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/5040)*((`lat`*0.0174532925199433)-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/6+(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/120-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/5040)+(1-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/2+("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/24-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/720)*(1-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/2+(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/24-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/720)*(1-(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)/2+(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)/24-(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)/720))*((("+Double.toString(lat)+"*0.0174532925199433)-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/6+("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/120-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/5040)*((`lat`*0.0174532925199433)-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/6+(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/120-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/5040)+(1-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/2+("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/24-("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)*("+Double.toString(lat)+"*0.0174532925199433)/720)*(1-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/2+(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/24-(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)*(`lat`*0.0174532925199433)/720)*(1-(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)/2+(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)/24-(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)*(("+Double.toString(lng)+" -`lng`)*0.0174532925199433)/720)) ))) AS relDistance " + "FROM `"+TABLE_ITEMS+"` ORDER BY relDistance ASC LIMIT "+Integer.toString(max); } 

    Ich schrieb ein Perl-Skript, um diesen Code zu generieren, es erweitert die Trig-Funktionen, und es funktioniert eigentlich ziemlich gut, aber es ist unüberschaubar und ich würde es nicht empfehlen.

    Nicht genau eine Antwort auf schnelle Abfragen, aber: Sie können versuchen, zusätzliche Hilfstabellen zu verwenden und sie zu füllen, indem sie Trigger auf tatsächlichen Datentabellen definieren. Auf diese Weise haben Sie die meisten aggregierten Daten bereit zur Hand, und Abfragen wäre einfacher.

    Wenn Sie mit vorbereitete Anweisung dann ist es vorteilhaft für Sie, weil 1. vorbereitet Erklärung sind viel sicherer 2. sql Injektion ist schwierig 3. Sie sind nicht so viel komplex 4. Wartung ist einfach

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.