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