我编写了一个 SQL Server 查询,它在对字段进行分区后更新记录以具有序列号。当我将它作为 SELECT 语句运行时,一切看起来都很棒:
DECLARE @RunDetailID INT = 448
DECLARE @JobDetailID INT
SELECT @JobDetailID = [JobDetailID] FROM [RunDetails] WHERE [RunDetailID] = @RunDetailID
SELECT
[OrderedRecords].[NewSeq9],
RIGHT([OrderedRecords].[NewSeq9], 4)
FROM
(
SELECT
[Records].*,
[Records].[SortField] + RIGHT('0000' + CAST(ROW_NUMBER() OVER(PARTITION BY [Records].[SortField] ORDER BY [Records].[RunDetailID], [Records].[SortField], [Records].[PieceID]) AS VARCHAR), 4) NewSeq9
FROM
(
SELECT
[MRDFStorageID],
[RunDetailID],
[SortField],
[PieceID],
[Seq9],
[BallotType]
FROM
[MRDFStorage]
JOIN [BallotStyles] ON [MRDFStorage].[SortField] = [BallotStyles].[Style] and [BallotStyles].[JobDetailID] = @JobDetailID
WHERE
[RunDetailID] IN (SELECT [RunDetailID] FROM [RunDetails] WHERE [JobDetailID] = …
Run Code Online (Sandbox Code Playgroud) 我有一个Records
包含 100 多列和非常多行的表,以及基于我的访问路径的 5 个字段的非聚集索引:
CREATE NONCLUSTERED INDEX [IX_Records_CustomerID]
ON [dbo].[Records] (
[CustomerID] ASC, -- int
[IsInvalid] ASC, -- int
[IsProcessed] ASC, -- bit
[IsRejected] ASC, -- bit
[RecordName] ASC, -- varchar(12)
;
Run Code Online (Sandbox Code Playgroud)
这 5 个字段不包括主键RecordID
,它是聚集索引中的列。
这是我性能不佳的查询:
SELECT * FROM Records WHERE CustomerID IN (181, 283, 505)
Run Code Online (Sandbox Code Playgroud)
执行计划显示它执行聚集索引扫描,我理解这是因为我选择了未包含在索引中的列。在 Management Studio 中,我将查询更改为:
SELECT CustomerID, IsInvalid, IsProcessed, IsRejected, RecordName FROM Records
WHERE CustomerID IN (181, 283, 505)
Run Code Online (Sandbox Code Playgroud)
并且执行计划显示Index Seek,查询执行时间从44秒下降到2秒。但是,我在应用程序中缺乏自由,无法*
仅用我需要并包含在索引中的列替换。
当我被锁定时,有没有办法绕过聚集索引扫描SELECT *
?
performance index sql-server nonclustered-index query-performance