提交 61bdafce authored 作者: tledkov's avatar tledkov

#1057, #1072 fix subquery result cache in lazy mode

上级 24108bee
......@@ -397,7 +397,7 @@ public abstract class Query extends Prepared {
}
fireBeforeSelectTriggers();
if (noCache || !session.getDatabase().getOptimizeReuseResults() ||
session.isLazyQueryExecution()) {
(session.isLazyQueryExecution() && !neverLazy)) {
return queryWithoutCacheLazyCheck(limit, target);
}
Value[] params = getParameterValues();
......
......@@ -285,6 +285,7 @@ public class ViewIndex extends BaseIndex implements SpatialIndex {
return findRecursive(first, last);
}
setupQueryParameters(session, first, last, intersection);
query.setNeverLazy(true);
ResultInterface result = query.query(0);
return new ViewCursor(this, result, first, last);
}
......
......@@ -167,68 +167,7 @@ import org.h2.test.synth.TestStringAggCompatibility;
import org.h2.test.synth.TestTimer;
import org.h2.test.synth.sql.TestSynth;
import org.h2.test.synth.thread.TestMulti;
import org.h2.test.unit.TestAnsCompression;
import org.h2.test.unit.TestAutoReconnect;
import org.h2.test.unit.TestBinaryArithmeticStream;
import org.h2.test.unit.TestBitStream;
import org.h2.test.unit.TestBnf;
import org.h2.test.unit.TestCache;
import org.h2.test.unit.TestCharsetCollator;
import org.h2.test.unit.TestClearReferences;
import org.h2.test.unit.TestCollation;
import org.h2.test.unit.TestCompress;
import org.h2.test.unit.TestConnectionInfo;
import org.h2.test.unit.TestDataPage;
import org.h2.test.unit.TestDate;
import org.h2.test.unit.TestDateIso8601;
import org.h2.test.unit.TestDateTimeUtils;
import org.h2.test.unit.TestDbException;
import org.h2.test.unit.TestExit;
import org.h2.test.unit.TestFile;
import org.h2.test.unit.TestFileLock;
import org.h2.test.unit.TestFileLockProcess;
import org.h2.test.unit.TestFileLockSerialized;
import org.h2.test.unit.TestFileSystem;
import org.h2.test.unit.TestFtp;
import org.h2.test.unit.TestGeometryUtils;
import org.h2.test.unit.TestIntArray;
import org.h2.test.unit.TestIntIntHashMap;
import org.h2.test.unit.TestIntPerfectHash;
import org.h2.test.unit.TestInterval;
import org.h2.test.unit.TestJmx;
import org.h2.test.unit.TestLocalResultFactory;
import org.h2.test.unit.TestLocale;
import org.h2.test.unit.TestMathUtils;
import org.h2.test.unit.TestMemoryUnmapper;
import org.h2.test.unit.TestMode;
import org.h2.test.unit.TestModifyOnWrite;
import org.h2.test.unit.TestNetUtils;
import org.h2.test.unit.TestObjectDeserialization;
import org.h2.test.unit.TestOldVersion;
import org.h2.test.unit.TestOverflow;
import org.h2.test.unit.TestPageStore;
import org.h2.test.unit.TestPageStoreCoverage;
import org.h2.test.unit.TestPattern;
import org.h2.test.unit.TestPerfectHash;
import org.h2.test.unit.TestPgServer;
import org.h2.test.unit.TestReader;
import org.h2.test.unit.TestRecovery;
import org.h2.test.unit.TestReopen;
import org.h2.test.unit.TestSampleApps;
import org.h2.test.unit.TestScriptReader;
import org.h2.test.unit.TestSecurity;
import org.h2.test.unit.TestShell;
import org.h2.test.unit.TestSort;
import org.h2.test.unit.TestStreams;
import org.h2.test.unit.TestStringCache;
import org.h2.test.unit.TestStringUtils;
import org.h2.test.unit.TestTimeStampWithTimeZone;
import org.h2.test.unit.TestTools;
import org.h2.test.unit.TestTraceSystem;
import org.h2.test.unit.TestUtils;
import org.h2.test.unit.TestValue;
import org.h2.test.unit.TestValueHashMap;
import org.h2.test.unit.TestValueMemory;
import org.h2.test.unit.*;
import org.h2.test.utils.OutputCatcher;
import org.h2.test.utils.SelfDestructor;
import org.h2.test.utils.TestColumnNamer;
......@@ -988,6 +927,7 @@ kill -9 `jps -l | grep "org.h2.test." | cut -d " " -f 1`
addTest(new TestUtils());
addTest(new TestValueHashMap());
addTest(new TestLocalResultFactory());
addTest(new TestSubqueryPerformanceOnLazyExecutionMode());
runAddedTests();
......
/*
* Copyright 2004-2018 H2 Group. Multiple-Licensed under the MPL 2.0,
* and the EPL 1.0 (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.test.unit;
import org.h2.command.dml.SetTypes;
import org.h2.test.TestBase;
import org.junit.Assert;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* Test subquery performance with lazy query execution mode {@link SetTypes#LAZY_QUERY_EXECUTION}.
*/
public class TestSubqueryPerformanceOnLazyExecutionMode extends TestBase {
/** Rows count. */
private static final int ROWS = 5000;
/**
* Run just this test.
*
* @param a ignored
*/
public static void main(String[] a) throws Exception {
TestBase.createCaller().init().test();
}
@Override
public void test() throws Exception {
Class.forName("org.h2.Driver");
try (Connection conn = DriverManager.getConnection("jdbc:h2:mem:")) {
try (Statement stmt = conn.createStatement()) {
stmt.execute("CREATE TABLE ONE(X INTEGER , Y INTEGER )");
try (PreparedStatement prep = conn.prepareStatement("insert into one values(?,?)")) {
for (int row = 0; row < ROWS; row++) {
prep.setInt(1, row / 100);
prep.setInt(2, row);
prep.execute();
}
}
testSubqueryInCondition(stmt);
testSubqueryInJoin(stmt);
}
}
}
public void testSubqueryInCondition(Statement stmt) throws Exception {
String sql = "SELECT COUNT (*) FROM one WHERE x IN (SELECT y FROM one WHERE y < 50)";
long tNotLazy = executeAndCheckResult(stmt, sql, false);
long tLazy = executeAndCheckResult(stmt, sql, true);
Assert.assertTrue("Lazy execution too slow. lazy time: "
+ tLazy + ", not lazy time: " + tNotLazy,
tNotLazy * 2 > tLazy);
}
public void testSubqueryInJoin(Statement stmt) throws Exception {
String sql =
"SELECT COUNT (one.x) FROM one " +
"JOIN (SELECT y AS val FROM one WHERE y < 50) AS subq ON subq.val=one.x";
long tNotLazy = executeAndCheckResult(stmt, sql, false);
long tLazy = executeAndCheckResult(stmt, sql, true);
Assert.assertTrue("Lazy execution too slow. lazy time: "
+ tLazy + ", not lazy time: " + tNotLazy,
tNotLazy * 2 > tLazy);
}
/**
* @return Time of the query execution.
*/
private long executeAndCheckResult(Statement stmt, String sql, boolean lazy) throws SQLException {
if (lazy) {
stmt.execute("SET LAZY_QUERY_EXECUTION 1");
}
else {
stmt.execute("SET LAZY_QUERY_EXECUTION 0");
}
long t0 = System.currentTimeMillis();
try (ResultSet rs = stmt.executeQuery(sql)) {
rs.next();
Assert.assertEquals(ROWS, rs.getInt(1));
}
return System.currentTimeMillis() - t0;
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论