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