sql-server – ‘SELECT TOP’性能问题
我有一个查询,选择前100名运行得更快,而前100名则慢得多.返回记录的数量为0.
没有热门文字的查询: SELECT --TOP 100 * FROM InventTrans JOIN InventDim ON InventDim.DATAAREAID = 'dat' AND InventDim.INVENTDIMID = InventTrans.INVENTDIMID WHERE InventTrans.DATAAREAID = 'dat' AND InventTrans.ITEMID = '027743' AND InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND InventDim.ECC_BUSINESSUNITID = 'Казахстан'; 上面的查询计划(没有顶部): https://pastebin.com/cbtJpxFf IO和TIME统计信息(无顶部): SQL Server parse and compile time: CPU time = 0 ms,elapsed time = 0 ms. SQL Server Execution Times: CPU time = 0 ms,elapsed time = 0 ms. SQL Server parse and compile time: CPU time = 0 ms,elapsed time = 0 ms. (0 row(s) affected) 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. Table 'INVENTTRANS'. Scan count 1,logical reads 1234560,read-ahead reads 14299,lob read-ahead reads 0. (1 row(s) affected) SQL Server Execution Times: CPU time = 6256 ms,elapsed time = 13348 ms. SQL Server parse and compile time: CPU time = 0 ms,elapsed time = 0 ms. 使用的索引(没有顶部): 1. INVENTTRANS.I_177TRANSIDIDX 4 KEYS: - DATAAREAID - INVENTTRANSID - INVENTDIMID - RECID 2. INVENTTRANS.I_177ITEMIDX 3 KEYS: - DATAAREAID - ITEMID - DATEPHYSICAL 3. INVENTDIM.I_698DIMIDIDX 2 KEYS: - DATAAREAID - INVENTDIMID 顶部的查询: SELECT TOP 100 * FROM InventTrans JOIN InventDim ON InventDim.DATAAREAID = 'dat' AND InventDim.INVENTDIMID = InventTrans.INVENTDIMID WHERE InventTrans.DATAAREAID = 'dat' AND InventTrans.ITEMID = '027743' AND InventDim.INVENTLOCATIONID = 'КзРЦ Алмат' AND InventDim.ECC_BUSINESSUNITID = 'Казахстан'; 查询计划(带TOP): https://pastebin.com/0dyu6QZd 查询IO和TIME统计信息(带TOP): SQL Server parse and compile time: CPU time = 0 ms,elapsed time = 0 ms. (0 row(s) affected) Table 'Worktable'. Scan count 0,logical reads 0,read-ahead reads 0,lob read-ahead reads 0. Table 'INVENTTRANS'. Scan count 15385,logical reads 82542,lob read-ahead reads 0. Table 'INVENTDIM'. Scan count 1,logical reads 62704,lob read-ahead reads 0. (1 row(s) affected) SQL Server Execution Times: CPU time = 265 ms,elapsed time = 257 ms. SQL Server parse and compile time: CPU time = 0 ms,elapsed time = 0 ms. 使用的索引(带TOP): 1. INVENTTRANS.I_177TRANSIDIDX 4 KEYS: - DATAAREAID - INVENTTRANSID - INVENTDIMID - RECID 2. INVENTTRANS.I_177DIMIDIDX 3 KEYS: - DATAAREAID - INVENTDIMID - ITEMID 3. INVENTDIM.I_698DIMIDIDX 2 KEYS: - DATAAREAID - INVENTDIMID 4. INVENTDIM.I_698ECC_BUSUNITLOCIDX 3 KEYS - DATAAREAID - ECC_BUSINESSUNITID - INVENTLOCATIONID 将深深感谢有关该主题的任何帮助! 解决方法SQL Server使用不同的排序算法为TOP 100构建不同的执行计划.有时它更快,有时它更慢.有关它的简单示例,请阅读How Much Can One Row Change A Query Plan? Part 1和Part 2. 有关深入的技术细节,以及TOP 100算法实际较慢的示例,请阅读Paul White’s Sorting,Row Goals,and the TOP 100 Problem. 底线:在你的情况下,如果你知道不会返回任何行,那么……不要运行查询,是吗?最快的查询是你从未做过的.但是,如果您需要进行存在检查,只需执行IF EXISTS(在此处查询),然后SQL Server将执行甚至不同的执行计划. (编辑:银川站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- sql-server – SQL Server中的大量数据和性能
- sql-server – DL380p-Gen8 D2700适用于SQL 2012标准版的适
- 在sql Server自定义一个用户定义星期代码
- SQL Server如何判断表是否存在?教你两个方法
- mssql server 数据库附加不上解决办法分享
- sql创建数据库有中文乱码是啥原因?如何处理?
- sql-server – SQL Server如何确定缺失索引请求中的键列顺序
- jwt – Keycloak从数据库/外部源添加额外声明
- 如何在SQL中选择所有值并隐藏NULL值?
- sql-server – 使用HAProxy为镜像SQL Server提供容错功能
- sql-server – 我可以在SQL R2服务器中创建SQL v
- sql-server-2008 – “无法找到存储过程”,即使已
- 指针数据不存储在本地数据库中,解析ios
- sql-server – 包含要使用文件流的二进制文件的现
- sql-server – SQL Server如何确定缺失索引请求中
- sql-server – 如何保留SQL Server存储过程修订的
- sql-server – 如何在SQL Server 2017中使用SNAP
- sql-server – 资源池“internal”中没有足够的系
- sql-server – 帮助安装SQL Server 2017 – VS S
- 数据库设计 – 需要数据库设计手册