Skip to content
项目
群组
代码片段
帮助
正在加载...
帮助
为 GitLab 提交贡献
登录/注册
切换导航
H
h2database
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
计划
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
Administrator
h2database
Commits
cb88fe35
提交
cb88fe35
authored
8 年前
作者:
Sergi Vladykin
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Fix for minimal covering index selection in query plan
上级
cb1a382d
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
95 行增加
和
3 行删除
+95
-3
BaseIndex.java
h2/src/main/org/h2/index/BaseIndex.java
+3
-3
TestCases.java
h2/src/test/org/h2/test/db/TestCases.java
+92
-0
没有找到文件。
h2/src/main/org/h2/index/BaseIndex.java
浏览文件 @
cb88fe35
...
...
@@ -274,10 +274,10 @@ public abstract class BaseIndex extends SchemaObjectBase implements Index {
/*
* The (20-x) calculation makes sure that when we pick a covering
* index, we pick the covering index that has the smallest number of
* columns
. This is faster because a smaller index will fit into
* fewer data blocks.
* columns
(the more columns we have in index - the higher cost).
*
This is faster because a smaller index will fit into
fewer data blocks.
*/
rc
=
rowsCost
+
sortingCost
+
(
20
-
columns
.
length
)
;
rc
=
rowsCost
+
sortingCost
+
columns
.
length
;
}
return
rc
;
}
...
...
This diff is collapsed.
Click to expand it.
h2/src/test/org/h2/test/db/TestCases.java
浏览文件 @
cb88fe35
...
...
@@ -41,6 +41,8 @@ public class TestCases extends TestBase {
@Override
public
void
test
()
throws
Exception
{
testMinimalCoveringIndexPlan
();
testMinMaxDirectLookupIndex
();
testReferenceLaterTable
();
testAutoCommitInDatabaseURL
();
testReferenceableIndexUsage
();
...
...
@@ -1717,6 +1719,96 @@ public class TestCases extends TestBase {
assertEquals
(
"Lob file was not deleted: "
+
list
,
0
,
list
.
size
());
}
private
void
testMinimalCoveringIndexPlan
()
throws
SQLException
{
deleteDb
(
"cases"
);
Connection
conn
=
getConnection
(
"cases"
);
Statement
stat
=
conn
.
createStatement
();
stat
.
execute
(
"create table t(a int, b int, c int)"
);
stat
.
execute
(
"create index a_idx on t(a)"
);
stat
.
execute
(
"create index b_idx on t(b)"
);
stat
.
execute
(
"create index ab_idx on t(a, b)"
);
stat
.
execute
(
"create index abc_idx on t(a, b, c)"
);
ResultSet
rs
;
String
plan
;
rs
=
stat
.
executeQuery
(
"explain select a from t"
);
assertTrue
(
rs
.
next
());
plan
=
rs
.
getString
(
1
);
assertContains
(
plan
,
"/* PUBLIC.A_IDX */"
);
rs
.
close
();
rs
=
stat
.
executeQuery
(
"explain select b from t"
);
assertTrue
(
rs
.
next
());
plan
=
rs
.
getString
(
1
);
assertContains
(
plan
,
"/* PUBLIC.B_IDX */"
);
rs
.
close
();
rs
=
stat
.
executeQuery
(
"explain select b, a from t"
);
assertTrue
(
rs
.
next
());
plan
=
rs
.
getString
(
1
);
assertContains
(
plan
,
"/* PUBLIC.AB_IDX */"
);
rs
.
close
();
rs
=
stat
.
executeQuery
(
"explain select b, a, c from t"
);
assertTrue
(
rs
.
next
());
plan
=
rs
.
getString
(
1
);
assertContains
(
plan
,
"/* PUBLIC.ABC_IDX */"
);
rs
.
close
();
conn
.
close
();
}
private
void
testMinMaxDirectLookupIndex
()
throws
SQLException
{
deleteDb
(
"cases"
);
Connection
conn
=
getConnection
(
"cases"
);
Statement
stat
=
conn
.
createStatement
();
stat
.
execute
(
"create table t(a int, b int)"
);
stat
.
execute
(
"create index b_idx on t(b desc)"
);
stat
.
execute
(
"create index ab_idx on t(a, b)"
);
final
int
count
=
100
;
PreparedStatement
p
=
conn
.
prepareStatement
(
"insert into t values (?,?)"
);
for
(
int
i
=
0
;
i
<=
count
;
i
++)
{
p
.
setInt
(
1
,
i
);
p
.
setInt
(
2
,
count
-
i
);
assertEquals
(
1
,
p
.
executeUpdate
());
}
p
.
close
();
ResultSet
rs
;
String
plan
;
rs
=
stat
.
executeQuery
(
"select max(b) from t"
);
assertTrue
(
rs
.
next
());
assertEquals
(
count
,
rs
.
getInt
(
1
));
rs
.
close
();
rs
=
stat
.
executeQuery
(
"explain select max(b) from t"
);
assertTrue
(
rs
.
next
());
plan
=
rs
.
getString
(
1
);
assertContains
(
plan
,
"/* PUBLIC.B_IDX */"
);
assertContains
(
plan
,
"/* direct lookup */"
);
rs
.
close
();
rs
=
stat
.
executeQuery
(
"select min(b) from t"
);
assertTrue
(
rs
.
next
());
assertEquals
(
0
,
rs
.
getInt
(
1
));
rs
.
close
();
rs
=
stat
.
executeQuery
(
"explain select min(b) from t"
);
assertTrue
(
rs
.
next
());
plan
=
rs
.
getString
(
1
);
assertContains
(
plan
,
"/* PUBLIC.B_IDX */"
);
assertContains
(
plan
,
"/* direct lookup */"
);
rs
.
close
();
conn
.
close
();
}
private
void
testDeleteTop
()
throws
SQLException
{
deleteDb
(
"cases"
);
Connection
conn
=
getConnection
(
"cases"
);
...
...
This diff is collapsed.
Click to expand it.
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论