3

私はAndroidアプリでSQL選択クエリを使用しましたが、これはAndroidの新しいバージョンで正常に動作します。つまり、Samsung Galaxyタブ(Android 4.0.3)ではsqliteデータベースからデータを取得するのに30〜40秒かかりますが、古いバージョンのAndroid 2.3を搭載したデバイスではデータの取得には 18 分かかります。「x_unitperson.UNITSEQによる注文」を削除すると、Android 2.3でパフォーマンスが低下しません。order by句を削除せずにAndroid 2.3でパフォーマンスを向上させるにはどうすればよいですか。

私のSQLは次のとおりです。

SELECT PERSON_ID,
       COMMANDER,
       CITIZEN,
       RANK,
       GIVEN,
       SURNAME,
       ISOR,

  (SELECT GROUP_CONCAT(NAME_SHORT, '\n')
   FROM units
   INNER JOIN
     (SELECT *
      FROM x_unitperson
      WHERE PERSON_ID = people.PERSON_ID
      ORDER BY x_unitperson.UNITSEQ) AS xunits
   WHERE units.UNIT_ID = xunits.UNIT_ID) AS NAME_SHORT,

  (SELECT FNAME
   FROM photos
   WHERE PERSON_ID = People.PERSON_ID) AS FNAME
FROM people
ORDER BY SURNAME,
         GIVEN
4

1 に答える 1

2

私は SQLite オプティマイザにあまり詳しくありません。相関サブクエリを結合として書き換えることができる場合、一部のオプティマイザは両方のクエリに対して同じ実行プランを作成します。SQLite がこれらのいずれかであるかどうかはわかりません。したがって、変換する価値があるかもしれません。相関サブクエリではなく JOIN を使用するクエリを使用して、回避するかどうかを確認します。

SELECT  people.PERSON_ID,
        people.COMMANDER,
        people.CITIZEN,
        people.RANK,
        people.GIVEN,
        people.SURNAME,
        people.ISOR,
        ns.NAME_SHORT,
        Photos.FNANE
FROM    people
        LEFT JOIN
        (   SELECT  units.PERSON_ID, GROUP_CONCAT(NAME_SHORT, '\n') AS NAME_SHORT
            FROM    units
                    INNER JOIN
                    (   SELECT  UNIT_ID, NAME_SHORT
                        FROM    x_unitperson
                        ORDER BY UNIT_ID, x_unitperson.UNITSEQ
                    ) AS xunits
                        ON units.UNIT_ID = xunits.UNIT_ID
            GROUP BY units.PERSON_ID
        ) ns
            ON ns.PERSON_ID = people.PERSON_ID
        LEFT JOIN photos
            ON photos.PERSON_ID = People.PERSON_ID
ORDER BY people.SURNAME, people.GIVEN;

さらに(スキーマについて収集できるものを使用して)SELECT *クエリからすべてを削除しました。これは本番コードでは悪い習慣です。また、すべての列参照の前にテーブル名/エイリアスを付けました。これも、クエリを将来のスキーマから保護します変化します。

于 2013-04-25T08:47:20.567 に答える