The estimatedCost field is found in the original virtual table interface, so it probably takes precedence in finding a total cost estimate. The output fields are initialized to (SQLite Release 3.24): pIdxInfo->estimatedCost = SQLITE_BIG_DBL / (double)2; // 4.99999e98 pIdxInfo->estimatedRows = 25; So not changing estimatedCost will tend to discourage using this particular plan.