summaryrefslogtreecommitdiff
path: root/sql/handler.h
diff options
context:
space:
mode:
Diffstat (limited to 'sql/handler.h')
-rw-r--r--sql/handler.h64
1 files changed, 42 insertions, 22 deletions
diff --git a/sql/handler.h b/sql/handler.h
index 544a2a2f21e..72995db0e18 100644
--- a/sql/handler.h
+++ b/sql/handler.h
@@ -2890,17 +2890,6 @@ public:
CPU_COEFF*idx_cpu_cost;
}
- /**
- Whether or not all costs in the object are zero
-
- @return true if all costs are zero, false otherwise
- */
- bool is_zero() const
- {
- return io_count == 0.0 && idx_io_count == 0.0 && cpu_cost == 0.0 &&
- import_cost == 0.0 && mem_cost == 0.0 && comp_cost;
- }
-
void reset()
{
avg_io_cost= 1.0;
@@ -3634,29 +3623,34 @@ public:
}
/*
- Time for a full table scan + fetching the rows from the table
- The +1 here is to ensure that we prefer unique keys over table scans
- for small tables
+ Time for a full table data scan. To be overrided by engines, should not
+ be used by the sql level.
*/
- double ha_scan_time()
+ virtual double scan_time()
{
- return scan_time() + (double) stats.records * RECORD_COPY_COST + 1;
+ return ((ulonglong2double(stats.data_file_length) / stats.block_size + 2) *
+ avg_io_cost());
}
/*
- Time for a full table scan of data file
+ Time for a full table scan + fetching the rows from the table
*/
- virtual double scan_time()
+ inline double ha_scan_time(ha_rows records)
{
- return ((ulonglong2double(stats.data_file_length) / stats.block_size + 2) *
- avg_io_cost());
+ return scan_time() + (double) records * RECORD_COPY_COST;
}
- virtual double key_scan_time(uint index)
+ /*
+ Time for a full table scan, fetching the rows from the table and comparing
+ the row with the where clause
+ */
+ inline double ha_scan_and_compare_time(ha_rows records)
{
- return keyread_time(index, 1, records());
+ return (scan_time() +
+ (double) records * (RECORD_COPY_COST + 1/TIME_FOR_COMPARE));
}
+
virtual double avg_io_cost()
{
return 1.0;
@@ -3677,6 +3671,7 @@ public:
virtual double read_time(uint index, uint ranges, ha_rows rows)
{ return rows2double(ranges+rows); }
+
/**
Calculate cost of 'keyread' scan for given index and number of records.
@@ -3686,6 +3681,31 @@ public:
*/
virtual double keyread_time(uint index, uint ranges, ha_rows rows);
+ /*
+ Calculate cost of 'keyread' scan for given index and number of records
+ including fetching the key to the 'record' buffer.
+ */
+
+ inline double ha_keyread_time(uint index, uint ranges, ha_rows rows)
+ {
+ return keyread_time(index, ranges, rows) + (double) rows * INDEX_COPY_COST;
+ }
+
+ /* Cost of doing a full index scan */
+ inline double ha_key_scan_time(uint index)
+ {
+ return ha_keyread_time(index, 1, records());
+ }
+
+ /*
+ Time for a full table index scan (without copy or compare cost).
+ To be overrided by engines, sql level should use ha_key_scan_time().
+ */
+ virtual double key_scan_time(uint index)
+ {
+ return keyread_time(index, 1, records());
+ }
+
virtual const key_map *keys_to_use_for_scanning() { return &key_map_empty; }
/*