#19685832 add index hint when document select query.

add low_priority when docuement insert, update, delete query. because select slow query table lock.


git-svn-id: http://xe-core.googlecode.com/svn/branches/1.5.0@8289 201d5d3c-b55e-5fd7-737f-ddc643e51545
This commit is contained in:
ovclas 2011-04-11 08:41:40 +00:00
parent 0943470d5f
commit 048866cd25
10 changed files with 1663 additions and 1534 deletions

View file

@ -411,7 +411,6 @@
* @remarks if $type is not 'number', call addQuotes() and wrap with ' '
**/
function getConditionValue($name, $value, $operation, $type, $column_type) {
if(!in_array($operation,array('in','notin','between')) && $type == 'number') {
if(is_array($value)){
$value = join(',',$value);

View file

@ -449,7 +449,11 @@
$value_list[] = $value;
}
$query = sprintf("insert into %s (%s) values (%s);", implode(',',$table_list), implode(',',$column_list), implode(',', $value_list));
//priority setting
$priority = '';
if($output->priority) $priority = $output->priority['type'].'_priority';
$query = sprintf("insert %s into %s (%s) values (%s);", $priority, implode(',',$table_list), implode(',',$column_list), implode(',', $value_list));
return $this->_query($query);
}
@ -477,7 +481,11 @@
// List the conditional clause
$condition = $this->getCondition($output);
$query = sprintf("update %s set %s %s", implode(',',$table_list), implode(',',$column_list), $condition);
//priority setting
$priority = '';
if($output->priority) $priority = $output->priority['type'].'_priority';
$query = sprintf("update %s %s set %s %s", $priority, implode(',',$table_list), implode(',',$column_list), $condition);
return $this->_query($query);
}
@ -493,7 +501,11 @@
// List the conditional clause
$condition = $this->getCondition($output);
$query = sprintf("delete from %s %s", implode(',',$table_list), $condition);
//priority setting
$priority = '';
if($output->priority) $priority = $output->priority['type'].'_priority';
$query = sprintf("delete %s from %s %s", $priority, implode(',',$table_list), $condition);
return $this->_query($query);
}
@ -568,7 +580,11 @@
$output->column_list = $column_list;
$condition = $this->getCondition($output);
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $condition, $output);
if(count($output->index_hint))
$index_hint = sprintf(' %s index (%s) ', $output->index_hint['type'], $output->index_hint['name']);
if($output->list_count && $output->page) return $this->_getNavigationData($table_list, $columns, $left_join, $index_hint, $condition, $output);
// Add a condition to use an index when sorting in order by list_order, update_order
if($output->order) {
$conditions = $this->getConditionList($output);
@ -615,7 +631,7 @@
$columns = join(',',$columns);
}
$query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $condition, $groupby_query.$orderby_query);
$query = sprintf("select %s from %s %s %s %s %s", $columns, implode(',',$table_list),implode(' ',$left_join), $index_hint, $condition, $groupby_query.$orderby_query);
// Apply when using list_count
if($output->list_count['value']) $query = sprintf('%s limit %d', $query, $output->list_count['value']);
@ -644,7 +660,7 @@
*
* It is quite convenient although its structure is not good at all .. -_-;
**/
function _getNavigationData($table_list, $columns, $left_join, $condition, $output) {
function _getNavigationData($table_list, $columns, $left_join, $index_hint, $condition, $output) {
require_once(_XE_PATH_.'classes/page/PageHandler.class.php');
$column_list = $output->column_list;
@ -715,7 +731,7 @@
$columns = join(',',$columns);
}
$query = sprintf("select %s from %s %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $condition, $groupby_query.$orderby_query);
$query = sprintf("select %s from %s %s %s %s %s", $columns, implode(',',$table_list), implode(' ',$left_join), $index_hint, $condition, $groupby_query.$orderby_query);
$query = sprintf('%s limit %d, %d', $query, $start_count, $list_count);
$query .= (__DEBUG_QUERY__&1 && $output->query_id)?sprintf(' '.$this->comment_syntax,$this->query_id):'';

View file

@ -108,6 +108,19 @@
$group_list = $xml_obj->query->groups->group;
$out = $this->_setGroup($group_list);
$output->groups = $out->groups;
//priority arrange
$priority = $xml_obj->query->priority;
if($priority) $output->priority['type'] = $priority->attrs->type;
//index hint arrange
$index_hint = $xml_obj->query->index_hint;
if($index_hint)
{
$output->index_hint['name'] = $index_hint->attrs->name;
$output->index_hint['type'] = $index_hint->attrs->type;
}
// Navigation
$out = $this->_setNavigation($xml_obj);
$output->order = $out->order;
@ -116,6 +129,8 @@
$output->page = $out->page;
$column_count = count($output->columns);
$priority_count = count($output->priority);
$index_hint_count = count($output->index_hint);
$condition_count = count($output->conditions);
$buff .= '$output->tables = array( ';
@ -145,6 +160,19 @@
$buff .= $this->_getColumn($output->columns);
$buff .= ' );'."\n";
}
//priority arrange
if($priority_count) {
$priority_str .= '$output->priority = array("type"=>"%s");'."\n";
$buff .= vsprintf($priority_str, $output->priority);
}
// index arrange
if($index_hint_count) {
$index_hint_str .= '$output->index_hint = array("name"=>"%s", "type"=>"%s");'."\n";
$buff .= vsprintf($index_hint_str, $output->index_hint);
}
// get conditions
if($condition_count) {
$buff .= '$output->conditions = array ( ';