为什么有这么多逻辑读?

Omi*_*eta 7 sql-server-2008 sql-server

我有一个非常简单的查询,它在活动监视器和其他统计信息中显示为在我的整个数据库服务器上具有最多的逻辑读取。

SELECT MAX(RESULT_DATE) FROM TABLEX mm WITH (NOLOCK) 
JOIN TABLEX_RESULTS mr WITH (NOLOCK) on mr.ID = mm.ID 
WHERE DAYS IS NOT NULL AND mm.ORDER_ID = 12345
Run Code Online (Sandbox Code Playgroud)

TABLEX 大约有 2800 万行

TABLEX_RESULTS 大约有 600 万行

我可以在这里做什么来减少此查询的逻辑读取次数?我对如此简单的查询如何拥有如此大量的逻辑读取感到困惑。

谢谢

索引定义(来自评论)

tableX 
IndexName                    PK     Type    Key1            Key2
IDX_MP_MEDS                  0      B AA    ORDER_ID        MEDPASS_DATE
IDX_MP_MEDS_ID_AND_ORDER_ID  0      B A     MEDPASS_DATE    
IX_MP_MEDS_ROOT_ORDER_ID     0      B DA    ROOT_ORDER_ID   MEDPASS_DATE
PK_MP_MED PK                 1      C A     MEDPASS_MEDS_ID 

tablex_resulsts
Run Code Online (Sandbox Code Playgroud)

JNK*_*JNK 10

请注意,这些是页面阅读。这是相关的。

可能性:

  • 索引不正确或不足。 任何过滤的字段是否已编入索引?索引有多宽(见下文)?
  • 页面密度差。 您可能拥有的任何索引的填充因子是多少?如果它太低,你会为此拉很多页。
  • 非常广泛的索引。 如果您有索引但它们有很多字段或非常宽的字段,那么每页的行数就会减少。

我猜您对这些标准中的至少一个进行了表或聚集索引扫描,并且该表很宽,这会导致读取大量数据,而不管您实际需要多少数据。


Rem*_*anu 6

因为你没有合适的索引。最重要的是,您需要一个索引 onTABLEX (ORDER_ID)和一个索引 on TABLEX_RESULTS (ID)。最好的索引ORDER_ID应该包括(DAYS, ID, RESULT_DATE).

您在 上有一个索引ORDER_ID,但没有覆盖。对于tables_results,要么您没有任何索引,要么您的评论不包含它们。