【发布时间】:2018-09-27 16:00:05
【问题描述】:
上下文
我正在优化我的表并专门添加索引以减少读取/查询。标识为具有高读取的表之一是用户表。但是,在 ID 上过滤的列已经是一个索引。为什么一个简单的查询会被执行如此多次读取的索引过滤?
该表大约有 200 行。大约有一半的时间针对它运行查询(根据 SQL Server Profiler),它执行 112 次读取,需要 16 毫秒。我意识到这些数字本身并不高,但由于这是一个非常常见的查询,并且应该在 >1ms 内执行 1 次读取,我很想知道如何进一步调试它。
表格
CREATE TABLE [dbo].[Users]
(
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](15) NULL,
[Password] [varchar](128) NULL,
[Code] [varchar](20) NULL,
[ResetCode] [varchar](32) NULL,
[ResetTime] [datetime] NULL,
[LastLogin] [datetime] NULL,
[LastIP] [varchar](50) NULL,
[UserSettings] [varchar](max) NULL,
[LastName] [varchar](30) NULL,
[FirstName] [varchar](30) NULL,
[Middle] [varchar](30) NULL,
[Address1] [varchar](50) NULL,
[Address2] [varchar](50) NULL,
[City] [varchar](50) NULL,
[State] [varchar](4) NULL,
[Zip] [varchar](10) NULL,
[Email] [varchar](80) NULL,
[Flag] [tinyint] NULL,
[Inactive] [tinyint] NULL,
CONSTRAINT [PK_Users]
PRIMARY KEY CLUSTERED ([ID] ASC)
)
查询
SELECT
ID AS id,
Name AS username,
FirstName AS first_name,
LastName AS last_name,
Email AS email,
Flag AS flag
FROM Users
WHERE ID = 180
执行计划
这是我手动执行的,所以不确定它是否与从 php Web 应用程序发送时使用的相同。 https://www.brentozar.com/pastetheplan/?id=HkCx99Xnf
【问题讨论】:
-
分享你的执行计划。 brentozar.com/pastetheplan
-
我不确定执行计划是什么,但这是 sql server 2008,所以无论它自动为我生成什么。
-
点击我分享的链接,然后点击说明。
-
我没有注意到你的索引是聚集的,所以我删除了我的评论。但是,我们仍然需要计划。其次,这个索引有多碎片化?如果您删除并重新创建索引(因为行数太少)或只是重建索引,您可能会看到这种变化。
-
@scsimon - 因为使用的键是主键,所以数据和键一起保存,所以一旦找到 kay,数据就在同一个地方,不需要进一步读取那一排。确实需要执行计划……
标签: sql-server optimization indexing