Home | History | Annotate | Download | only in database
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.database;
     18 
     19 import junit.framework.Assert;
     20 
     21 import android.content.ContentValues;
     22 import android.content.Context;
     23 import android.database.Cursor;
     24 import android.database.sqlite.SQLiteDatabase;
     25 import android.provider.Contacts;
     26 import android.provider.Contacts.People;
     27 import android.test.PerformanceTestCase;
     28 import android.test.TestCase;
     29 
     30 import java.io.File;
     31 import java.util.Random;
     32 
     33 /**
     34  * Database Performance Tests
     35  *
     36  */
     37 
     38 public class DatabasePerformanceTests {
     39 
     40     public static String[] children() {
     41         return new String[] {
     42             ContactReadingTest1.class.getName(),
     43             Perf1Test.class.getName(),
     44             Perf2Test.class.getName(),
     45             Perf3Test.class.getName(),
     46             Perf4Test.class.getName(),
     47             Perf5Test.class.getName(),
     48             Perf6Test.class.getName(),
     49             Perf7Test.class.getName(),
     50             Perf8Test.class.getName(),
     51             Perf9Test.class.getName(),
     52             Perf10Test.class.getName(),
     53             Perf11Test.class.getName(),
     54             Perf12Test.class.getName(),
     55             Perf13Test.class.getName(),
     56             Perf14Test.class.getName(),
     57             Perf15Test.class.getName(),
     58             Perf16Test.class.getName(),
     59             Perf17Test.class.getName(),
     60             Perf18Test.class.getName(),
     61             Perf19Test.class.getName(),
     62             Perf20Test.class.getName(),
     63             Perf21Test.class.getName(),
     64             Perf22Test.class.getName(),
     65             Perf23Test.class.getName(),
     66             Perf24Test.class.getName(),
     67             Perf25Test.class.getName(),
     68             Perf26Test.class.getName(),
     69             Perf27Test.class.getName(),
     70             Perf28Test.class.getName(),
     71             Perf29Test.class.getName(),
     72             Perf30Test.class.getName(),
     73             Perf31Test.class.getName(),
     74             };
     75     }
     76 
     77     public static abstract class PerformanceBase implements TestCase,
     78             PerformanceTestCase {
     79         protected static final int CURRENT_DATABASE_VERSION = 42;
     80         protected SQLiteDatabase mDatabase;
     81         protected File mDatabaseFile;
     82         protected Context mContext;
     83 
     84         public void setUp(Context c) {
     85             mContext = c;
     86             mDatabaseFile = new File("/tmp", "perf_database_test.db");
     87             if (mDatabaseFile.exists()) {
     88                 mDatabaseFile.delete();
     89             }
     90             mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null);
     91             Assert.assertTrue(mDatabase != null);
     92             mDatabase.setVersion(CURRENT_DATABASE_VERSION);
     93         }
     94 
     95         public void tearDown() {
     96             mDatabase.close();
     97             mDatabaseFile.delete();
     98         }
     99 
    100         public boolean isPerformanceOnly() {
    101             return true;
    102         }
    103 
    104         // These test can only be run once.
    105         public int startPerformance(Intermediates intermediates) {
    106             return 0;
    107         }
    108 
    109         public void run() {
    110         }
    111 
    112         public String numberName(int number) {
    113             String result = "";
    114 
    115             if (number >= 1000) {
    116                 result += numberName((number / 1000)) + " thousand";
    117                 number = (number % 1000);
    118 
    119                 if (number > 0) result += " ";
    120             }
    121 
    122             if (number >= 100) {
    123                 result += ONES[(number / 100)] + " hundred";
    124                 number = (number % 100);
    125 
    126                 if (number > 0) result += " ";
    127             }
    128 
    129             if (number >= 20) {
    130                 result += TENS[(number / 10)];
    131                 number = (number % 10);
    132 
    133                 if (number > 0) result += " ";
    134             }
    135 
    136             if (number > 0) {
    137                 result += ONES[number];
    138             }
    139 
    140             return result;
    141         }
    142     }
    143 
    144     /**
    145      * Test reading all contact data.
    146      */
    147     public static class ContactReadingTest1 implements TestCase, PerformanceTestCase {
    148         private static final String[] PEOPLE_PROJECTION = new String[] {
    149                Contacts.People._ID, // 0
    150                Contacts.People.PRIMARY_PHONE_ID, // 1
    151                Contacts.People.TYPE, // 2
    152                Contacts.People.NUMBER, // 3
    153                Contacts.People.LABEL, // 4
    154                Contacts.People.NAME, // 5
    155                Contacts.People.PRESENCE_STATUS, // 6
    156         };
    157 
    158         private Cursor mCursor;
    159 
    160         public void setUp(Context c) {
    161             mCursor = c.getContentResolver().query(People.CONTENT_URI, PEOPLE_PROJECTION, null,
    162                     null, People.DEFAULT_SORT_ORDER);
    163         }
    164 
    165         public void tearDown() {
    166             mCursor.close();
    167         }
    168 
    169         public boolean isPerformanceOnly() {
    170             return true;
    171         }
    172 
    173         public int startPerformance(Intermediates intermediates) {
    174             // This test can only be run once.
    175             return 0;
    176         }
    177 
    178         public void run() {
    179             while (mCursor.moveToNext()) {
    180                 // Read out all of the data
    181                 mCursor.getLong(0);
    182                 mCursor.getLong(1);
    183                 mCursor.getLong(2);
    184                 mCursor.getString(3);
    185                 mCursor.getString(4);
    186                 mCursor.getString(5);
    187                 mCursor.getLong(6);
    188             }
    189         }
    190     }
    191 
    192     /**
    193      * Test 1000 inserts
    194      */
    195 
    196     public static class Perf1Test extends PerformanceBase {
    197         private static final int SIZE = 1000;
    198 
    199         private String[] statements = new String[SIZE];
    200 
    201         @Override
    202         public void setUp(Context c) {
    203             super.setUp(c);
    204             Random random = new Random(42);
    205 
    206             for (int i = 0; i < SIZE; i++) {
    207                 int r = random.nextInt(100000);
    208                 statements[i] =
    209                         "INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    210                                 + numberName(r) + "')";
    211             }
    212 
    213             mDatabase
    214               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    215         }
    216 
    217         @Override
    218         public void run() {
    219             for (int i = 0; i < SIZE; i++) {
    220                 mDatabase.execSQL(statements[i]);
    221             }
    222         }
    223     }
    224 
    225     /**
    226      * Test 1000 inserts into and indexed table
    227      */
    228 
    229     public static class Perf2Test extends PerformanceBase {
    230         private static final int SIZE = 1000;
    231 
    232         private String[] statements = new String[SIZE];
    233 
    234         @Override
    235         public void setUp(Context c) {
    236             super.setUp(c);
    237             Random random = new Random(42);
    238 
    239             for (int i = 0; i < SIZE; i++) {
    240                 int r = random.nextInt(100000);
    241                 statements[i] =
    242                         "INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    243                                 + numberName(r) + "')";
    244             }
    245 
    246             mDatabase
    247               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    248             mDatabase.execSQL("CREATE INDEX i1c ON t1(c)");
    249         }
    250 
    251         @Override
    252         public void run() {
    253             for (int i = 0; i < SIZE; i++) {
    254                 mDatabase.execSQL(statements[i]);
    255             }
    256         }
    257     }
    258 
    259     /**
    260      * 100 SELECTs without an index
    261      */
    262 
    263     public static class Perf3Test extends PerformanceBase {
    264         private static final int SIZE = 100;
    265         private static final String[] COLUMNS = {"count(*)", "avg(b)"};
    266 
    267         private String[] where = new String[SIZE];
    268 
    269         @Override
    270         public void setUp(Context c) {
    271             super.setUp(c);
    272             Random random = new Random(42);
    273 
    274             mDatabase
    275               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    276 
    277             for (int i = 0; i < SIZE; i++) {
    278                 int r = random.nextInt(100000);
    279                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    280                         + numberName(r) + "')");
    281             }
    282 
    283             for (int i = 0; i < SIZE; i++) {
    284                 int lower = i * 100;
    285                 int upper = (i + 10) * 100;
    286                 where[i] = "b >= " + lower + " AND b < " + upper;
    287             }
    288         }
    289 
    290         @Override
    291         public void run() {
    292             for (int i = 0; i < SIZE; i++) {
    293                 mDatabase
    294                         .query("t1", COLUMNS, where[i], null, null, null, null);
    295             }
    296         }
    297     }
    298 
    299     /**
    300      * 100 SELECTs on a string comparison
    301      */
    302 
    303     public static class Perf4Test extends PerformanceBase {
    304         private static final int SIZE = 100;
    305         private static final String[] COLUMNS = {"count(*)", "avg(b)"};
    306 
    307         private String[] where = new String[SIZE];
    308 
    309         @Override
    310         public void setUp(Context c) {
    311             super.setUp(c);
    312             Random random = new Random(42);
    313 
    314             mDatabase
    315               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    316 
    317             for (int i = 0; i < SIZE; i++) {
    318                 int r = random.nextInt(100000);
    319                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    320                         + numberName(r) + "')");
    321             }
    322 
    323             for (int i = 0; i < SIZE; i++) {
    324                 where[i] = "c LIKE '" + numberName(i) + "'";
    325             }
    326         }
    327 
    328         @Override
    329         public void run() {
    330             for (int i = 0; i < SIZE; i++) {
    331                 mDatabase
    332                         .query("t1", COLUMNS, where[i], null, null, null, null);
    333             }
    334         }
    335     }
    336 
    337     /**
    338      * 100 SELECTs with an index
    339      */
    340 
    341     public static class Perf5Test extends PerformanceBase {
    342         private static final int SIZE = 100;
    343         private static final String[] COLUMNS = {"count(*)", "avg(b)"};
    344 
    345         private String[] where = new String[SIZE];
    346 
    347         @Override
    348         public void setUp(Context c) {
    349             super.setUp(c);
    350             Random random = new Random(42);
    351 
    352             mDatabase
    353               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    354             mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
    355 
    356             for (int i = 0; i < SIZE; i++) {
    357                 int r = random.nextInt(100000);
    358                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    359                         + numberName(r) + "')");
    360             }
    361 
    362             for (int i = 0; i < SIZE; i++) {
    363                 int lower = i * 100;
    364                 int upper = (i + 10) * 100;
    365                 where[i] = "b >= " + lower + " AND b < " + upper;
    366             }
    367         }
    368 
    369         @Override
    370         public void run() {
    371             for (int i = 0; i < SIZE; i++) {
    372                 mDatabase
    373                         .query("t1", COLUMNS, where[i], null, null, null, null);
    374             }
    375         }
    376     }
    377 
    378     /**
    379      *  INNER JOIN without an index
    380      */
    381 
    382     public static class Perf6Test extends PerformanceBase {
    383         private static final int SIZE = 100;
    384         private static final String[] COLUMNS = {"t1.a"};
    385 
    386         @Override
    387         public void setUp(Context c) {
    388             super.setUp(c);
    389             Random random = new Random(42);
    390 
    391             mDatabase
    392               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    393             mDatabase
    394               .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))");
    395 
    396             for (int i = 0; i < SIZE; i++) {
    397                 int r = random.nextInt(100000);
    398                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    399                         + numberName(r) + "')");
    400             }
    401 
    402             for (int i = 0; i < SIZE; i++) {
    403                 int r = random.nextInt(100000);
    404                 mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'"
    405                         + numberName(r) + "')");
    406             }
    407         }
    408 
    409         @Override
    410         public void run() {
    411             mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null,
    412                     null, null, null, null);
    413         }
    414     }
    415 
    416     /**
    417      *  INNER JOIN without an index on one side
    418      */
    419 
    420     public static class Perf7Test extends PerformanceBase {
    421         private static final int SIZE = 100;
    422         private static final String[] COLUMNS = {"t1.a"};
    423 
    424         @Override
    425         public void setUp(Context c) {
    426             super.setUp(c);
    427             Random random = new Random(42);
    428 
    429             mDatabase
    430               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    431             mDatabase
    432               .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))");
    433 
    434             mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
    435 
    436             for (int i = 0; i < SIZE; i++) {
    437                 int r = random.nextInt(100000);
    438                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    439                         + numberName(r) + "')");
    440             }
    441 
    442             for (int i = 0; i < SIZE; i++) {
    443                 int r = random.nextInt(100000);
    444                 mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'"
    445                         + numberName(r) + "')");
    446             }
    447         }
    448 
    449         @Override
    450         public void run() {
    451             mDatabase.query("t1 INNER JOIN t2 ON t1.b = t2.b", COLUMNS, null,
    452                     null, null, null, null);
    453         }
    454     }
    455 
    456     /**
    457      *  INNER JOIN without an index on one side
    458      */
    459 
    460     public static class Perf8Test extends PerformanceBase {
    461         private static final int SIZE = 100;
    462         private static final String[] COLUMNS = {"t1.a"};
    463 
    464         @Override
    465         public void setUp(Context c) {
    466             super.setUp(c);
    467             Random random = new Random(42);
    468 
    469             mDatabase
    470               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    471             mDatabase
    472               .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))");
    473 
    474             mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
    475 
    476             for (int i = 0; i < SIZE; i++) {
    477                 int r = random.nextInt(100000);
    478                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    479                         + numberName(r) + "')");
    480             }
    481 
    482             for (int i = 0; i < SIZE; i++) {
    483                 int r = random.nextInt(100000);
    484                 mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'"
    485                         + numberName(r) + "')");
    486             }
    487         }
    488 
    489         @Override
    490         public void run() {
    491             mDatabase.query("t1 INNER JOIN t2 ON t1.c = t2.c", COLUMNS, null,
    492                     null, null, null, null);
    493         }
    494     }
    495 
    496     /**
    497      *  100 SELECTs with subqueries. Subquery is using an index
    498      */
    499 
    500     public static class Perf9Test extends PerformanceBase {
    501         private static final int SIZE = 100;
    502         private static final String[] COLUMNS = {"t1.a"};
    503 
    504         private String[] where = new String[SIZE];
    505 
    506         @Override
    507         public void setUp(Context c) {
    508             super.setUp(c);
    509             Random random = new Random(42);
    510 
    511             mDatabase
    512               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    513             mDatabase
    514               .execSQL("CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100))");
    515 
    516             mDatabase.execSQL("CREATE INDEX i2b ON t2(b)");
    517 
    518             for (int i = 0; i < SIZE; i++) {
    519                 int r = random.nextInt(100000);
    520                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    521                         + numberName(r) + "')");
    522             }
    523 
    524             for (int i = 0; i < SIZE; i++) {
    525                 int r = random.nextInt(100000);
    526                 mDatabase.execSQL("INSERT INTO t2 VALUES(" + i + "," + r + ",'"
    527                         + numberName(r) + "')");
    528             }
    529 
    530             for (int i = 0; i < SIZE; i++) {
    531                 int lower = i * 100;
    532                 int upper = (i + 10) * 100;
    533                 where[i] =
    534                         "t1.b IN (SELECT t2.b FROM t2 WHERE t2.b >= " + lower
    535                                 + " AND t2.b < " + upper + ")";
    536             }
    537         }
    538 
    539         @Override
    540         public void run() {
    541             for (int i = 0; i < SIZE; i++) {
    542                 mDatabase
    543                         .query("t1", COLUMNS, where[i], null, null, null, null);
    544             }
    545         }
    546     }
    547 
    548     /**
    549      *  100 SELECTs on string comparison with Index
    550      */
    551 
    552     public static class Perf10Test extends PerformanceBase {
    553         private static final int SIZE = 100;
    554         private static final String[] COLUMNS = {"count(*)", "avg(b)"};
    555 
    556         private String[] where = new String[SIZE];
    557 
    558         @Override
    559         public void setUp(Context c) {
    560             super.setUp(c);
    561             Random random = new Random(42);
    562 
    563             mDatabase
    564               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    565             mDatabase.execSQL("CREATE INDEX i3c ON t1(c)");
    566 
    567             for (int i = 0; i < SIZE; i++) {
    568                 int r = random.nextInt(100000);
    569                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    570                         + numberName(r) + "')");
    571             }
    572 
    573             for (int i = 0; i < SIZE; i++) {
    574                 where[i] = "c LIKE '" + numberName(i) + "'";
    575             }
    576         }
    577 
    578         @Override
    579         public void run() {
    580             for (int i = 0; i < SIZE; i++) {
    581                 mDatabase
    582                         .query("t1", COLUMNS, where[i], null, null, null, null);
    583             }
    584         }
    585     }
    586 
    587     /**
    588      *  100 SELECTs on integer
    589      */
    590 
    591     public static class Perf11Test extends PerformanceBase {
    592         private static final int SIZE = 100;
    593         private static final String[] COLUMNS = {"b"};
    594 
    595         private String[] where = new String[SIZE];
    596 
    597         @Override
    598         public void setUp(Context c) {
    599             super.setUp(c);
    600             Random random = new Random(42);
    601 
    602             mDatabase
    603               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    604 
    605             for (int i = 0; i < SIZE; i++) {
    606                 int r = random.nextInt(100000);
    607                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    608                         + numberName(r) + "')");
    609             }
    610 
    611         }
    612 
    613         @Override
    614         public void run() {
    615             for (int i = 0; i < SIZE; i++) {
    616                 mDatabase.query("t1", COLUMNS, null, null, null, null, null);
    617             }
    618         }
    619     }
    620 
    621     /**
    622      *  100 SELECTs on String
    623      */
    624 
    625     public static class Perf12Test extends PerformanceBase {
    626         private static final int SIZE = 100;
    627         private static final String[] COLUMNS = {"c"};
    628 
    629         private String[] where = new String[SIZE];
    630 
    631         @Override
    632         public void setUp(Context c) {
    633             super.setUp(c);
    634             Random random = new Random(42);
    635 
    636             mDatabase
    637               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    638 
    639             for (int i = 0; i < SIZE; i++) {
    640                 int r = random.nextInt(100000);
    641                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    642                         + numberName(r) + "')");
    643             }
    644 
    645         }
    646 
    647         @Override
    648         public void run() {
    649             for (int i = 0; i < SIZE; i++) {
    650                 mDatabase.query("t1", COLUMNS, null, null, null, null, null);
    651             }
    652         }
    653     }
    654 
    655     /**
    656      *  100 SELECTs on integer with index
    657      */
    658 
    659     public static class Perf13Test extends PerformanceBase {
    660         private static final int SIZE = 100;
    661         private static final String[] COLUMNS = {"b"};
    662 
    663         @Override
    664         public void setUp(Context c) {
    665             super.setUp(c);
    666             Random random = new Random(42);
    667 
    668             mDatabase
    669               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    670             mDatabase.execSQL("CREATE INDEX i1b on t1(b)");
    671 
    672             for (int i = 0; i < SIZE; i++) {
    673                 int r = random.nextInt(100000);
    674                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    675                         + numberName(r) + "')");
    676             }
    677 
    678         }
    679 
    680         @Override
    681         public void run() {
    682             for (int i = 0; i < SIZE; i++) {
    683                 mDatabase.query("t1", COLUMNS, null, null, null, null, null);
    684             }
    685         }
    686     }
    687 
    688     /**
    689      *  100 SELECTs on String with index
    690      */
    691 
    692     public static class Perf14Test extends PerformanceBase {
    693         private static final int SIZE = 100;
    694         private static final String[] COLUMNS = {"c"};
    695 
    696         @Override
    697         public void setUp(Context c) {
    698             super.setUp(c);
    699             Random random = new Random(42);
    700 
    701             mDatabase
    702               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    703             mDatabase.execSQL("CREATE INDEX i1c ON t1(c)");
    704 
    705             for (int i = 0; i < SIZE; i++) {
    706                 int r = random.nextInt(100000);
    707                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    708                         + numberName(r) + "')");
    709             }
    710 
    711         }
    712 
    713         @Override
    714         public void run() {
    715             for (int i = 0; i < SIZE; i++) {
    716                 mDatabase.query("t1", COLUMNS, null, null, null, null, null);
    717             }
    718         }
    719     }
    720 
    721     /**
    722      *  100 SELECTs on String with starts with
    723      */
    724 
    725     public static class Perf15Test extends PerformanceBase {
    726         private static final int SIZE = 100;
    727         private static final String[] COLUMNS = {"c"};
    728         private String[] where = new String[SIZE];
    729 
    730         @Override
    731         public void setUp(Context c) {
    732             super.setUp(c);
    733             Random random = new Random(42);
    734 
    735             mDatabase
    736               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    737             mDatabase.execSQL("CREATE INDEX i1c ON t1(c)");
    738 
    739             for (int i = 0; i < SIZE; i++) {
    740                 int r = random.nextInt(100000);
    741                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    742                         + numberName(r) + "')");
    743             }
    744 
    745             for (int i = 0; i < SIZE; i++) {
    746                 int r = random.nextInt(100000);
    747                 where[i] = "c LIKE '" + numberName(r).substring(0, 1) + "*'";
    748 
    749             }
    750 
    751         }
    752 
    753         @Override
    754         public void run() {
    755             for (int i = 0; i < SIZE; i++) {
    756                 mDatabase
    757                         .query("t1", COLUMNS, where[i], null, null, null, null);
    758             }
    759         }
    760     }
    761 
    762     /**
    763      *  1000  Deletes on an indexed table
    764      */
    765 
    766     public static class Perf16Test extends PerformanceBase {
    767         private static final int SIZE = 1000;
    768         private static final String[] COLUMNS = {"c"};
    769 
    770         @Override
    771         public void setUp(Context c) {
    772             super.setUp(c);
    773             Random random = new Random(42);
    774 
    775             mDatabase
    776               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    777             mDatabase.execSQL("CREATE INDEX i3c ON t1(c)");
    778 
    779             for (int i = 0; i < SIZE; i++) {
    780                 int r = random.nextInt(100000);
    781                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    782                         + numberName(r) + "')");
    783             }
    784 
    785         }
    786 
    787         @Override
    788         public void run() {
    789             for (int i = 0; i < SIZE; i++) {
    790                 mDatabase.delete("t1", null, null);
    791             }
    792         }
    793     }
    794 
    795     /**
    796      *  1000  Deletes
    797      */
    798 
    799     public static class Perf17Test extends PerformanceBase {
    800         private static final int SIZE = 1000;
    801         private static final String[] COLUMNS = {"c"};
    802 
    803         @Override
    804         public void setUp(Context c) {
    805             super.setUp(c);
    806             Random random = new Random(42);
    807 
    808             mDatabase
    809               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    810 
    811             for (int i = 0; i < SIZE; i++) {
    812                 int r = random.nextInt(100000);
    813                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    814                         + numberName(r) + "')");
    815             }
    816 
    817         }
    818 
    819         @Override
    820         public void run() {
    821             for (int i = 0; i < SIZE; i++) {
    822                 mDatabase.delete("t1", null, null);
    823             }
    824         }
    825     }
    826 
    827     /**
    828      *  1000 DELETE's without an index with where clause
    829      */
    830 
    831     public static class Perf18Test extends PerformanceBase {
    832         private static final int SIZE = 1000;
    833         private String[] where = new String[SIZE];
    834 
    835         @Override
    836         public void setUp(Context c) {
    837             super.setUp(c);
    838             Random random = new Random(42);
    839 
    840             mDatabase
    841               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    842 
    843             for (int i = 0; i < SIZE; i++) {
    844                 int r = random.nextInt(100000);
    845                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    846                         + numberName(r) + "')");
    847             }
    848 
    849             for (int i = 0; i < SIZE; i++) {
    850                 int lower = i * 100;
    851                 int upper = (i + 10) * 100;
    852                 where[i] = "b >= " + lower + " AND b < " + upper;
    853             }
    854         }
    855 
    856         @Override
    857         public void run() {
    858             for (int i = 0; i < SIZE; i++) {
    859                 mDatabase.delete("t1", where[i], null);
    860             }
    861         }
    862     }
    863 
    864     /**
    865      *  1000 DELETE's with an index with where clause
    866      */
    867 
    868     public static class Perf19Test extends PerformanceBase {
    869         private static final int SIZE = 1000;
    870         private String[] where = new String[SIZE];
    871 
    872         @Override
    873         public void setUp(Context c) {
    874             super.setUp(c);
    875             Random random = new Random(42);
    876 
    877             mDatabase
    878               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    879             mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
    880 
    881             for (int i = 0; i < SIZE; i++) {
    882                 int r = random.nextInt(100000);
    883                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    884                         + numberName(r) + "')");
    885             }
    886 
    887             for (int i = 0; i < SIZE; i++) {
    888                 int lower = i * 100;
    889                 int upper = (i + 10) * 100;
    890                 where[i] = "b >= " + lower + " AND b < " + upper;
    891             }
    892         }
    893 
    894         @Override
    895         public void run() {
    896             for (int i = 0; i < SIZE; i++) {
    897                 mDatabase.delete("t1", where[i], null);
    898             }
    899         }
    900     }
    901 
    902     /**
    903      *  1000 update's with an index with where clause
    904      */
    905 
    906     public static class Perf20Test extends PerformanceBase {
    907         private static final int SIZE = 1000;
    908         private String[] where = new String[SIZE];
    909         ContentValues[] mValues = new ContentValues[SIZE];
    910 
    911         @Override
    912         public void setUp(Context c) {
    913             super.setUp(c);
    914             Random random = new Random(42);
    915 
    916             mDatabase
    917               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    918             mDatabase.execSQL("CREATE INDEX i1b ON t1(b)");
    919 
    920             for (int i = 0; i < SIZE; i++) {
    921                 int r = random.nextInt(100000);
    922                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    923                         + numberName(r) + "')");
    924             }
    925 
    926             for (int i = 0; i < SIZE; i++) {
    927 
    928                 int lower = i * 100;
    929                 int upper = (i + 10) * 100;
    930                 where[i] = "b >= " + lower + " AND b < " + upper;
    931                 ContentValues b = new ContentValues(1);
    932                 b.put("b", upper);
    933                 mValues[i] = b;
    934 
    935             }
    936         }
    937 
    938         @Override
    939         public void run() {
    940             for (int i = 0; i < SIZE; i++) {
    941                 mDatabase.update("t1", mValues[i], where[i], null);
    942             }
    943         }
    944     }
    945 
    946     /**
    947      *  1000 update's without an index with where clause
    948      */
    949 
    950     public static class Perf21Test extends PerformanceBase {
    951         private static final int SIZE = 1000;
    952         private String[] where = new String[SIZE];
    953         ContentValues[] mValues = new ContentValues[SIZE];
    954 
    955         @Override
    956         public void setUp(Context c) {
    957             super.setUp(c);
    958             Random random = new Random(42);
    959 
    960             mDatabase
    961               .execSQL("CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100))");
    962 
    963             for (int i = 0; i < SIZE; i++) {
    964                 int r = random.nextInt(100000);
    965                 mDatabase.execSQL("INSERT INTO t1 VALUES(" + i + "," + r + ",'"
    966                         + numberName(r) + "')");
    967             }
    968 
    969             for (int i = 0; i < SIZE; i++) {
    970 
    971                 int lower = i * 100;
    972                 int upper = (i + 10) * 100;
    973                 where[i] = "b >= " + lower + " AND b < " + upper;
    974                 ContentValues b = new ContentValues(1);
    975                 b.put("b", upper);
    976                 mValues[i] = b;
    977             }
    978         }
    979 
    980         @Override
    981         public void run() {
    982             for (int i = 0; i < SIZE; i++) {
    983                 mDatabase.update("t1", mValues[i], where[i], null);
    984             }
    985         }
    986     }
    987 
    988     /**
    989      *  10000 inserts for an integer
    990      */
    991 
    992     public static class Perf22Test extends PerformanceBase {
    993         private static final int SIZE = 10000;
    994         ContentValues[] mValues = new ContentValues[SIZE];
    995 
    996         @Override
    997         public void setUp(Context c) {
    998             super.setUp(c);
    999             Random random = new Random(42);
   1000 
   1001             mDatabase
   1002               .execSQL("CREATE TABLE t1(a INTEGER)");
   1003 
   1004             for (int i = 0; i < SIZE; i++) {
   1005                 int r = random.nextInt(100000);
   1006                 ContentValues b = new ContentValues(1);
   1007                 b.put("a", r);
   1008                 mValues[i] = b;
   1009             }
   1010         }
   1011 
   1012         @Override
   1013         public void run() {
   1014             for (int i = 0; i < SIZE; i++) {
   1015                 mDatabase.insert("t1", null, mValues[i]);
   1016             }
   1017         }
   1018     }
   1019 
   1020     /**
   1021      *  10000 inserts for an integer -indexed table
   1022      */
   1023 
   1024     public static class Perf23Test extends PerformanceBase {
   1025         private static final int SIZE = 10000;
   1026         ContentValues[] mValues = new ContentValues[SIZE];
   1027 
   1028         @Override
   1029         public void setUp(Context c) {
   1030             super.setUp(c);
   1031             Random random = new Random(42);
   1032 
   1033             mDatabase
   1034               .execSQL("CREATE TABLE t1(a INTEGER)");
   1035             mDatabase.execSQL("CREATE INDEX i1a ON t1(a)");
   1036 
   1037             for (int i = 0; i < SIZE; i++) {
   1038                 int r = random.nextInt(100000);
   1039                 ContentValues b = new ContentValues(1);
   1040                 b.put("a", r);
   1041                 mValues[i] = b;
   1042             }
   1043         }
   1044 
   1045         @Override
   1046         public void run() {
   1047             for (int i = 0; i < SIZE; i++) {
   1048                 mDatabase.insert("t1", null, mValues[i]);
   1049             }
   1050         }
   1051     }
   1052 
   1053     /**
   1054      *  10000 inserts for a String
   1055      */
   1056 
   1057     public static class Perf24Test extends PerformanceBase {
   1058         private static final int SIZE = 10000;
   1059         ContentValues[] mValues = new ContentValues[SIZE];
   1060 
   1061         @Override
   1062         public void setUp(Context c) {
   1063             super.setUp(c);
   1064             Random random = new Random(42);
   1065 
   1066             mDatabase
   1067               .execSQL("CREATE TABLE t1(a VARCHAR(100))");
   1068 
   1069             for (int i = 0; i < SIZE; i++) {
   1070                 int r = random.nextInt(100000);
   1071                 ContentValues b = new ContentValues(1);
   1072                 b.put("a", numberName(r));
   1073                 mValues[i] = b;
   1074             }
   1075         }
   1076 
   1077         @Override
   1078         public void run() {
   1079             for (int i = 0; i < SIZE; i++) {
   1080                 mDatabase.insert("t1", null, mValues[i]);
   1081             }
   1082         }
   1083     }
   1084 
   1085     /**
   1086      *  10000 inserts for a String - indexed table
   1087      */
   1088 
   1089     public static class Perf25Test extends PerformanceBase {
   1090         private static final int SIZE = 10000;
   1091         ContentValues[] mValues = new ContentValues[SIZE];
   1092 
   1093         @Override
   1094         public void setUp(Context c) {
   1095             super.setUp(c);
   1096             Random random = new Random(42);
   1097 
   1098             mDatabase
   1099               .execSQL("CREATE TABLE t1(a VARCHAR(100))");
   1100             mDatabase.execSQL("CREATE INDEX i1a ON t1(a)");
   1101 
   1102             for (int i = 0; i < SIZE; i++) {
   1103                 int r = random.nextInt(100000);
   1104                 ContentValues b = new ContentValues(1);
   1105                 b.put("a", numberName(r));
   1106                 mValues[i] = b;
   1107             }
   1108         }
   1109 
   1110         @Override
   1111         public void run() {
   1112             for (int i = 0; i < SIZE; i++) {
   1113                 mDatabase.insert("t1", null, mValues[i]);
   1114             }
   1115         }
   1116     }
   1117 
   1118 
   1119     /**
   1120      *  10000 selects for a String -starts with
   1121      */
   1122 
   1123     public static class Perf26Test extends PerformanceBase {
   1124         private static final int SIZE = 10000;
   1125         private static final String[] COLUMNS = {"t3.a"};
   1126         private String[] where = new String[SIZE];
   1127 
   1128         @Override
   1129         public void setUp(Context c) {
   1130             super.setUp(c);
   1131             Random random = new Random(42);
   1132 
   1133             mDatabase
   1134               .execSQL("CREATE TABLE t3(a VARCHAR(100))");
   1135 
   1136             for (int i = 0; i < SIZE; i++) {
   1137                 int r = random.nextInt(100000);
   1138                 mDatabase.execSQL("INSERT INTO t3 VALUES('"
   1139                         + numberName(r) + "')");
   1140             }
   1141 
   1142             for (int i = 0; i < SIZE; i++) {
   1143                 int r = random.nextInt(100000);
   1144                 where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'";
   1145 
   1146             }
   1147         }
   1148 
   1149         @Override
   1150         public void run() {
   1151             for (int i = 0; i < SIZE; i++) {
   1152                 mDatabase.query("t3", COLUMNS, where[i], null, null, null, null);
   1153             }
   1154         }
   1155     }
   1156 
   1157     /**
   1158      *  10000 selects for a String - indexed table -starts with
   1159      */
   1160 
   1161     public static class Perf27Test extends PerformanceBase {
   1162         private static final int SIZE = 10000;
   1163         private static final String[] COLUMNS = {"t3.a"};
   1164         private String[] where = new String[SIZE];
   1165 
   1166         @Override
   1167         public void setUp(Context c) {
   1168             super.setUp(c);
   1169             Random random = new Random(42);
   1170 
   1171             mDatabase
   1172               .execSQL("CREATE TABLE t3(a VARCHAR(100))");
   1173             mDatabase.execSQL("CREATE INDEX i3a ON t3(a)");
   1174 
   1175             for (int i = 0; i < SIZE; i++) {
   1176                 int r = random.nextInt(100000);
   1177                 mDatabase.execSQL("INSERT INTO t3 VALUES('"
   1178                         + numberName(r) + "')");
   1179             }
   1180 
   1181             for (int i = 0; i < SIZE; i++) {
   1182                 int r = random.nextInt(100000);
   1183                 where[i] = "a LIKE '" + numberName(r).substring(0, 1) + "*'";
   1184 
   1185             }
   1186            }
   1187 
   1188         @Override
   1189         public void run() {
   1190             for (int i = 0; i < SIZE; i++) {
   1191                 mDatabase.query("t3", COLUMNS, where[i], null, null, null, null);
   1192             }
   1193         }
   1194     }
   1195 
   1196     /**
   1197      *  10000 selects for an integer -
   1198      */
   1199 
   1200     public static class Perf28Test extends PerformanceBase {
   1201         private static final int SIZE = 10000;
   1202         private static final String[] COLUMNS = {"t4.a"};
   1203         private String[] where = new String[SIZE];
   1204 
   1205         @Override
   1206         public void setUp(Context c) {
   1207             super.setUp(c);
   1208             Random random = new Random(42);
   1209 
   1210             mDatabase
   1211               .execSQL("CREATE TABLE t4(a INTEGER)");
   1212 
   1213             for (int i = 0; i < SIZE; i++) {
   1214                 int r = random.nextInt(100000);
   1215                 mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")");
   1216                 int lower = i * 100;
   1217                 int upper = (i + 10) * 100;
   1218                 where[i] = "a >= " + lower + " AND a < " + upper;
   1219             }
   1220            }
   1221 
   1222         @Override
   1223         public void run() {
   1224             for (int i = 0; i < SIZE; i++) {
   1225                 mDatabase.query("t4", COLUMNS, where[i], null, null, null, null);
   1226             }
   1227         }
   1228     }
   1229 
   1230     /**
   1231      *  10000 selects for an integer -indexed table
   1232      */
   1233 
   1234     public static class Perf29Test extends PerformanceBase {
   1235         private static final int SIZE = 10000;
   1236         private static final String[] COLUMNS = {"t4.a"};
   1237         private String[] where = new String[SIZE];
   1238 
   1239         @Override
   1240         public void setUp(Context c) {
   1241             super.setUp(c);
   1242             Random random = new Random(42);
   1243 
   1244             mDatabase
   1245               .execSQL("CREATE TABLE t4(a INTEGER)");
   1246            mDatabase.execSQL("CREATE INDEX i4a ON t4(a)");
   1247 
   1248             for (int i = 0; i < SIZE; i++) {
   1249                 int r = random.nextInt(100000);
   1250                 mDatabase.execSQL("INSERT INTO t4 VALUES(" + r + ")");
   1251 
   1252                 int lower = i * 100;
   1253                 int upper = (i + 10) * 100;
   1254                 where[i] = "a >= " + lower + " AND a < " + upper;
   1255             }
   1256 
   1257            }
   1258 
   1259         @Override
   1260         public void run() {
   1261             for (int i = 0; i < SIZE; i++) {
   1262                 mDatabase.query("t4", COLUMNS, where[i], null, null, null, null);
   1263             }
   1264         }
   1265     }
   1266 
   1267 
   1268     /**
   1269      *  10000 selects for a String - contains 'e'
   1270      */
   1271 
   1272     public static class Perf30Test extends PerformanceBase {
   1273         private static final int SIZE = 10000;
   1274         private static final String[] COLUMNS = {"t3.a"};
   1275         private String[] where = new String[SIZE];
   1276 
   1277         @Override
   1278         public void setUp(Context c) {
   1279             super.setUp(c);
   1280             Random random = new Random(42);
   1281 
   1282             mDatabase
   1283               .execSQL("CREATE TABLE t3(a VARCHAR(100))");
   1284 
   1285             for (int i = 0; i < SIZE; i++) {
   1286                 int r = random.nextInt(100000);
   1287                 mDatabase.execSQL("INSERT INTO t3 VALUES('"
   1288                         + numberName(r) + "')");
   1289             }
   1290 
   1291             for (int i = 0; i < SIZE; i++) {
   1292                  where[i] = "a LIKE '*e*'";
   1293 
   1294             }
   1295            }
   1296 
   1297         @Override
   1298         public void run() {
   1299             for (int i = 0; i < SIZE; i++) {
   1300                 mDatabase.query("t3", COLUMNS, where[i], null, null, null, null);
   1301             }
   1302         }
   1303     }
   1304 
   1305     /**
   1306      *  10000 selects for a String - contains 'e'-indexed table
   1307      */
   1308 
   1309     public static class Perf31Test extends PerformanceBase {
   1310         private static final int SIZE = 10000;
   1311         private static final String[] COLUMNS = {"t3.a"};
   1312         private String[] where = new String[SIZE];
   1313 
   1314         @Override
   1315         public void setUp(Context c) {
   1316             super.setUp(c);
   1317             Random random = new Random(42);
   1318 
   1319             mDatabase
   1320               .execSQL("CREATE TABLE t3(a VARCHAR(100))");
   1321             mDatabase.execSQL("CREATE INDEX i3a ON t3(a)");
   1322 
   1323             for (int i = 0; i < SIZE; i++) {
   1324                 int r = random.nextInt(100000);
   1325                 mDatabase.execSQL("INSERT INTO t3 VALUES('"
   1326                         + numberName(r) + "')");
   1327             }
   1328 
   1329             for (int i = 0; i < SIZE; i++) {
   1330                 where[i] = "a LIKE '*e*'";
   1331 
   1332             }
   1333 
   1334            }
   1335 
   1336         @Override
   1337         public void run() {
   1338             for (int i = 0; i < SIZE; i++) {
   1339                 mDatabase.query("t3", COLUMNS, where[i], null, null, null, null);
   1340             }
   1341         }
   1342     }
   1343 
   1344     public static final String[] ONES =
   1345             {"zero", "one", "two", "three", "four", "five", "six", "seven",
   1346                 "eight", "nine", "ten", "eleven", "twelve", "thirteen",
   1347                 "fourteen", "fifteen", "sixteen", "seventeen", "eighteen",
   1348                 "nineteen"};
   1349 
   1350     public static final String[] TENS =
   1351             {"", "ten", "twenty", "thirty", "forty", "fifty", "sixty",
   1352                 "seventy", "eighty", "ninety"};
   1353 }
   1354