java - 带有 in 子句的 H2 慢查询不使用索引
问题描述
我在内存配置中嵌入了数据库:
spring.datasource.url=jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;LOCK_TIMEOUT=4000
我有以下查询用休眠条件api构造了什么,当我执行它时它会永远执行,并且它会锁定所有我无法读写的h2操作。
最大的表是 priceline,有 18 000 条记录。似乎出于某种原因,where
子句中使用的字段不使用我的索引(我对所有用于查询的字段都有非唯一索引,ID 有唯一索引)
计划
SELECT
*
FROM PUBLIC.EVENTS EVENT0_
/* PUBLIC.EVENT_SPORTID_INDX: SPORTID IN(227, 239, 240) */
/* WHERE EVENT0_.SPORTID IN(227, 239, 240)
*/
/* scanCount: 137 */
LEFT OUTER JOIN PUBLIC.MARKETS MARKETS1_
/* PUBLIC.FK7ODW956QJK1DITHJORMVBIV3Q_INDEX_5: EVENTID = EVENT0_.ID */
ON EVENT0_.ID = MARKETS1_.EVENTID
/* scanCount: 3230 */
LEFT OUTER JOIN PUBLIC.OUTCOMES OUTCOMES2_
/* PUBLIC.FK2UJCQIHU8G4B8BQY4JEEY8Y8V_INDEX_3: MARKETID = MARKETS1_.ID */
ON MARKETS1_.ID = OUTCOMES2_.MARKETID
/* scanCount: 20599 */
LEFT OUTER JOIN PUBLIC.PRICELINES PRICELINES3_
/* PUBLIC.FK6PK92YV9ASVTBBIF95R5UWU9N_INDEX_C: OUTCOMEID = OUTCOMES2_.ID */
ON OUTCOMES2_.ID = PRICELINES3_.OUTCOMEID
/* scanCount: 36140 */
LEFT OUTER JOIN PUBLIC.OUTCOME_DESCRIPTIONS OUTCOMEDES4_
/* PUBLIC.FK9AMHE7T653TOKDBK97HK31D4Q_INDEX_7: OUTCOMEID = OUTCOMES2_.ID */
ON OUTCOMES2_.ID = OUTCOMEDES4_.OUTCOMEID
/* scanCount: 260890 */
LEFT OUTER JOIN PUBLIC.MARKET_DESCRIPTIONS MARKETDESC5_
/* PUBLIC.FK5X545B89XD3COBCN7EFM04RJC_INDEX_A: MARKETID = MARKETS1_.ID */
ON MARKETS1_.ID = MARKETDESC5_.MARKETID
/* scanCount: 3391570 */
LEFT OUTER JOIN PUBLIC.MARKETFILTER_MAPPING FILTERS6_
/* PUBLIC.PRIMARY_KEY_E: EVENTID = EVENT0_.ID */
ON EVENT0_.ID = FILTERS6_.EVENTID
/* scanCount: 26881816 */
LEFT OUTER JOIN PUBLIC.MARKET_FILTERS MARKETFILT7_
/* PUBLIC.PRIMARY_KEY_9: ID = FILTERS6_.MARKETFILTERID */
ON FILTERS6_.MARKETFILTERID = MARKETFILT7_.ID
/* scanCount: 47472776 */
LEFT OUTER JOIN PUBLIC.EVENT_DESCRIPTIONS EVENTDESCR8_
/* PUBLIC.FKOR6YEH06F2B0D389L2SYV1LX8_INDEX_F: EVENTID = EVENT0_.ID */
ON EVENT0_.ID = EVENTDESCR8_.EVENTID
/* scanCount: 332363850 */
WHERE (OUTCOMEDES4_.LOCALE = 'en-GB')
AND ((MARKETDESC5_.LOCALE = 'en-GB')
AND ((EVENTDESCR8_.LOCALE = 'en-GB')
AND ((MARKETFILT7_.PERIODID IN(209, 113, 100))
AND ((MARKETS1_.PERIODID IN(209, 113, 100))
AND ((MARKETFILT7_.MARKETTYPEID IN(3059, 68, 1))
AND ((MARKETS1_.TYPEID IN(3059, 68, 1))
AND ((EVENT0_.SPORTID IN(227, 239, 240))
AND (PRICELINES3_.PRICELINEID = 2))))))))
ORDER BY 10 DESC
(1 row, 152204 ms)
解决方案
推荐阅读
- php - 从存储下载文档时出现问题,存储:链接不起作用 laravel 6
- tensorflow - 如何解析 tfds.features.Sequence 对象?它与 tf.io.FixedLenSequenceFeature 不兼容
- javascript - 表单提交按钮中的表单同时触发
- javascript - 如何将表格行数据添加到数组
- odata - 我可以在“ZGWSAMPLE_BASIC”odata 服务中创建的表中插入数据吗?
- python - 从分钟值在熊猫数据框中添加日期时间列
- javascript - WooCommerce Checkout - 如果选中复选框,则需要输入
- python - 返回时如何修改表单?
- caching - Hazelcast 没有脑裂恢复(合并)
- javascript - 水平对齐按钮并显示活动按钮