sql-server - 简单 SELECT 的性能不佳
问题描述
我有一个非常简单的 SELECT 语句,它花费的时间比它应该的要多得多。它只从一个没有 JOIN、没有计算列的表中进行选择。该表不是特别大(300 万行,小行大小)。我有一个合适的查询索引(SQL Profile 显示它正在被使用),它最近被重建(每周)并且统计信息是最新的(每天)。我曾尝试将 SELECT 放入存储过程,但这无济于事。我也尝试过使用 WITH (NOLOCK),但没有太大的改进。它经常被查询但不是很频繁——它不在我们应用程序的前 50 个查询中。结果大小通常为 1 - 5 行。该表上也有相当数量的 INSERT / UPDATE 流量,比 SELECT 流量少一点。
带有 SELECT 的存储过程是:
CREATE PROCEDURE [dbo].[fetchcurrentichecklistitemanswers] @p_ichecklistitemid Int
AS
DECLARE @ichecklistitemid Int = @p_ichecklistitemid
SELECT * FROM ichecklistitemanswers WITH (NOLOCK) WHERE ichecklistitemid = @ichecklistitemid AND status = 2 ORDER BY ordering ASC
GO
关于还有什么可能会减慢这样的简单 SELECT 的任何想法?
[编辑 -- 添加执行计划] 查询在 Management Studio (instant) 中运行很快,但在应用程序中,查询时间平均超过 1 秒。
解决方案
您可以在该列上添加索引:
CREATE INDEX idx ON ichecklistitemanswers(ichecklistitemid)
INCLUDE(status, ordering) WHERE status=2;
推荐阅读
- r - 如何重命名表行 tbl_summary?
- sql - 如何在 PostgresSQL 中执行整个 SQL 文件
- python - 谷歌云愿景,将线条融合在一起
- c# - 更改时访问 DataView 的值
- python - 有没有办法修复这段代码中的最大深度错误
- angular - 将 ccavenue 支付集成与 laravel 和 angular 7 集成
- vb.net - 如何将 Databound Gridview 转换为 Datatable?
- wordpress - 在 wordpress 主题中使用 w3 svg 图标
- arduino - 如何诊断 ESP8266/D1 迷你重启循环问题?
- dolphindb - 如何在 DolphinDB 中将集合转换为向量