小编Chr*_*uer的帖子

为什么我的 SQL Server 查询在 UPDATE 和 SELECT 上的表现不同?

我编写了一个 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)

sql-server subquery window-functions update

10
推荐指数
1
解决办法
363
查看次数

由于“SELECT *”的聚簇表扫描

我有一个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

7
推荐指数
1
解决办法
804
查看次数