From 3be7598ee1b3b59ff59ff4a127c3f618a8cef4fc Mon Sep 17 00:00:00 2001 From: vraskulin Date: Fri, 16 Dec 2016 17:27:19 +0300 Subject: [PATCH] SQL query perfomance improvements There will be always 0 or 1 distinct result. If we don't limit this query it will find an item, and still will go through the whole table trying another one, which is unneccesary and have performance impact. --- .../server/record/UserStatsRepository.java | 17 +++++++++-------- .../mage/cards/repository/CardRepository.java | 19 +++++++------------ .../cards/repository/ExpansionRepository.java | 7 ++++--- 3 files changed, 20 insertions(+), 23 deletions(-) diff --git a/Mage.Server/src/main/java/mage/server/record/UserStatsRepository.java b/Mage.Server/src/main/java/mage/server/record/UserStatsRepository.java index 0e6ad74892..7a06d6741a 100644 --- a/Mage.Server/src/main/java/mage/server/record/UserStatsRepository.java +++ b/Mage.Server/src/main/java/mage/server/record/UserStatsRepository.java @@ -7,17 +7,18 @@ import com.j256.ormlite.stmt.QueryBuilder; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.support.DatabaseConnection; import com.j256.ormlite.table.TableUtils; -import java.io.File; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; import mage.cards.repository.RepositoryUtil; import mage.game.result.ResultProtos; import mage.server.rating.GlickoRating; import mage.server.rating.GlickoRatingSystem; import org.apache.log4j.Logger; +import java.io.File; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; + public enum UserStatsRepository { instance; @@ -68,7 +69,7 @@ public enum UserStatsRepository { public UserStats getUser(String userName) { try { QueryBuilder qb = dao.queryBuilder(); - qb.where().eq("userName", userName); + qb.limit(1L).where().eq("userName", userName); List users = dao.query(qb.prepare()); if (users.size() == 1) { return users.get(0); @@ -92,7 +93,7 @@ public enum UserStatsRepository { public long getLatestEndTimeMs() { try { QueryBuilder qb = dao.queryBuilder(); - qb.orderBy("endTimeMs", false).limit(1); + qb.orderBy("endTimeMs", false).limit(1L); List users = dao.query(qb.prepare()); if (users.size() == 1) { return users.get(0).getEndTimeMs(); @@ -106,7 +107,7 @@ public enum UserStatsRepository { // updateUserStats reads tables finished after the last DB update and reflects it to the DB. // It returns the list of user names that are upated. public List updateUserStats() { - HashSet updatedUsers = new HashSet(); + HashSet updatedUsers = new HashSet<>(); // Lock the DB so that no other updateUserStats runs at the same time. synchronized(this) { long latestEndTimeMs = this.getLatestEndTimeMs(); diff --git a/Mage/src/main/java/mage/cards/repository/CardRepository.java b/Mage/src/main/java/mage/cards/repository/CardRepository.java index 47f1503e4c..4c58b70247 100644 --- a/Mage/src/main/java/mage/cards/repository/CardRepository.java +++ b/Mage/src/main/java/mage/cards/repository/CardRepository.java @@ -37,20 +37,17 @@ import com.j256.ormlite.stmt.Where; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.support.DatabaseConnection; import com.j256.ormlite.table.TableUtils; -import java.io.File; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Set; -import java.util.TreeSet; -import java.util.concurrent.Callable; import mage.cards.CardSetInfo; import mage.constants.CardType; import mage.constants.SetType; import mage.util.RandomUtil; import org.apache.log4j.Logger; +import java.io.File; +import java.sql.SQLException; +import java.util.*; +import java.util.concurrent.Callable; + /** * * @author North @@ -65,12 +62,10 @@ public enum CardRepository { private static final long CARD_DB_VERSION = 48; // raise this if new cards were added to the server private static final long CARD_CONTENT_VERSION = 65; - + private final TreeSet landTypes = new TreeSet(); private Dao cardDao; private Set classNames; - private final TreeSet landTypes = new TreeSet(); - CardRepository() { File file = new File("db"); if (!file.exists()) { @@ -315,7 +310,7 @@ public enum CardRepository { public CardInfo findCard(String setCode, String cardNumber) { try { QueryBuilder queryBuilder = cardDao.queryBuilder(); - queryBuilder.where().eq("setCode", new SelectArg(setCode)).and().eq("cardNumber", cardNumber).and().eq("nightCard", false); + queryBuilder.limit(1L).where().eq("setCode", new SelectArg(setCode)).and().eq("cardNumber", cardNumber).and().eq("nightCard", false); List result = cardDao.query(queryBuilder.prepare()); if (!result.isEmpty()) { return result.get(0); diff --git a/Mage/src/main/java/mage/cards/repository/ExpansionRepository.java b/Mage/src/main/java/mage/cards/repository/ExpansionRepository.java index cf4f72c7b0..b2ff360a11 100644 --- a/Mage/src/main/java/mage/cards/repository/ExpansionRepository.java +++ b/Mage/src/main/java/mage/cards/repository/ExpansionRepository.java @@ -7,12 +7,13 @@ import com.j256.ormlite.stmt.QueryBuilder; import com.j256.ormlite.stmt.SelectArg; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.table.TableUtils; +import org.apache.log4j.Logger; + import java.io.File; import java.sql.SQLException; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; -import org.apache.log4j.Logger; /** * @@ -112,7 +113,7 @@ public enum ExpansionRepository { ExpansionInfo set = null; try { QueryBuilder qb = expansionDao.queryBuilder(); - qb.where().eq("code", new SelectArg(setCode)); + qb.limit(1L).where().eq("code", new SelectArg(setCode)); List expansions = expansionDao.query(qb.prepare()); if (expansions.size() > 0) { set = expansions.get(0); @@ -126,7 +127,7 @@ public enum ExpansionRepository { ExpansionInfo set = null; try { QueryBuilder qb = expansionDao.queryBuilder(); - qb.where().eq("name", new SelectArg(setName)); + qb.limit(1L).where().eq("name", new SelectArg(setName)); List expansions = expansionDao.query(qb.prepare()); if (expansions.size() > 0) { set = expansions.get(0);