sql-server – ‘SELECT TOP’性能问题

前端之家收集整理的这篇文章主要介绍了sql-server – ‘SELECT TOP’性能问题前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个查询,选择前100名运行得更快,而前100名则慢得多.返回记录的数量为0.
你能解释一下查询计划的不同之处或分享这些差异所解释的链接吗?

没有热门文字查询

  1. SELECT --TOP 100
  2. *
  3. FROM InventTrans
  4. JOIN
  5. InventDim
  6. ON InventDim.DATAAREAID = 'dat' AND
  7. InventDim.INVENTDIMID = InventTrans.INVENTDIMID
  8. WHERE InventTrans.DATAAREAID = 'dat' AND
  9. InventTrans.ITEMID = '027743' AND
  10. InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND
  11. InventDim.ECC_BUSINESSUNITID = 'Казахстан';

上面的查询计划(没有顶部):

https://pastebin.com/cbtJpxFf

IO和TIME统计信息(无顶部):

  1. sql Server parse and compile time:
  2. cpu time = 0 ms,elapsed time = 0 ms.
  3.  
  4. sql Server Execution Times:
  5. cpu time = 0 ms,elapsed time = 0 ms.
  6. sql Server parse and compile time:
  7. cpu time = 0 ms,elapsed time = 0 ms.
  8.  
  9. (0 row(s) affected)
  10. Table 'INVENTDIM'. Scan count 0,logical reads 988297,physical reads 0,read-ahead reads 1,lob logical reads 0,lob physical reads 0,lob read-ahead reads 0.
  11. Table 'INVENTTRANS'. Scan count 1,logical reads 1234560,read-ahead reads 14299,lob read-ahead reads 0.
  12.  
  13. (1 row(s) affected)
  14.  
  15. sql Server Execution Times:
  16. cpu time = 6256 ms,elapsed time = 13348 ms.
  17. sql Server parse and compile time:
  18. cpu time = 0 ms,elapsed time = 0 ms.

使用的索引(没有顶部):

  1. 1. INVENTTRANS.I_177TRANSIDIDX
  2. 4 KEYS:
  3. - DATAAREAID
  4. - INVENTTRANSID
  5. - INVENTDIMID
  6. - RECID
  7. 2. INVENTTRANS.I_177ITEMIDX
  8. 3 KEYS:
  9. - DATAAREAID
  10. - ITEMID
  11. - DATEPHYSICAL
  12. 3. INVENTDIM.I_698DIMIDIDX
  13. 2 KEYS:
  14. - DATAAREAID
  15. - INVENTDIMID

顶部的查询

  1. SELECT TOP 100
  2. *
  3. FROM InventTrans
  4. JOIN
  5. InventDim
  6. ON InventDim.DATAAREAID = 'dat' AND
  7. InventDim.INVENTDIMID = InventTrans.INVENTDIMID
  8. WHERE InventTrans.DATAAREAID = 'dat' AND
  9. InventTrans.ITEMID = '027743' AND
  10. InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND
  11. InventDim.ECC_BUSINESSUNITID = 'Казахстан';

查询计划(带TOP):

https://pastebin.com/0dyu6QZd

查询IO和TIME统计信息(带TOP):

  1. sql Server parse and compile time:
  2. cpu time = 0 ms,elapsed time = 0 ms.
  3.  
  4. (0 row(s) affected)
  5. Table 'Worktable'. Scan count 0,logical reads 0,read-ahead reads 0,lob read-ahead reads 0.
  6. Table 'INVENTTRANS'. Scan count 15385,logical reads 82542,lob read-ahead reads 0.
  7. Table 'INVENTDIM'. Scan count 1,logical reads 62704,lob read-ahead reads 0.
  8.  
  9. (1 row(s) affected)
  10.  
  11. sql Server Execution Times:
  12. cpu time = 265 ms,elapsed time = 257 ms.
  13. sql Server parse and compile time:
  14. cpu time = 0 ms,elapsed time = 0 ms.

使用的索引(带TOP):

  1. 1. INVENTTRANS.I_177TRANSIDIDX
  2. 4 KEYS:
  3. - DATAAREAID
  4. - INVENTTRANSID
  5. - INVENTDIMID
  6. - RECID
  7. 2. INVENTTRANS.I_177DIMIDIDX
  8. 3 KEYS:
  9. - DATAAREAID
  10. - INVENTDIMID
  11. - ITEMID
  12. 3. INVENTDIM.I_698DIMIDIDX
  13. 2 KEYS:
  14. - DATAAREAID
  15. - INVENTDIMID
  16. 4. INVENTDIM.I_698ECC_BUSUNITLOCIDX
  17. 3 KEYS
  18. - DATAAREAID
  19. - ECC_BUSINESSUNITID
  20. - INVENTLOCATIONID

将深深感谢有关该主题的任何帮助!

解决方法

sql Server使用不同的排序算法为TOP 100构建不同的执行计划.有时它更快,有时它更慢.

有关它的简单示例,请阅读How Much Can One Row Change A Query Plan? Part 1和@L_403_5@.

有关深入的技术细节,以及TOP 100算法实际较慢的示例,请阅读Paul White’s Sorting,Row Goals,and the TOP 100 Problem.

底线:在你的情况下,如果你知道不会返回任何行,那么……不要运行查询,是吗?最快的查询是你从未做过的.但是,如果您需要进行存在检查,只需执行IF EXISTS(在此处查询),然后sql Server将执行甚至不同的执行计划.

猜你在找的MsSQL相关文章