小编Joz*_*sky的帖子

在行ID上输入“聚集的身份”主键时,按添加日期进行排序和过滤

我有一个Orders带有CLUSTERED IDENTITY PRIMARY KEYOrderId)的表(),并且正在通过添加日期列()对数据进行过滤排序AddDate。有没有一种方法可以告诉查询优化器,其AddDate排序方式与OrderIdis 相同(因此数据AddDate已经被排序)?

SQL Server确实不需要先扫描整个表然后对其进行排序。所有操作所需的是扫描表直到找到结束日期,然后在开始日期之前过滤掉数据并按原样返回(不进行排序)。

例:

SELECT
      *
    FROM Orders
    WHERE AddDate BETWEEN @FromDate AND @ToDate
    ORDER BY AddDate
Run Code Online (Sandbox Code Playgroud)

sql-server sql-order-by clustered-index

5
推荐指数
1
解决办法
198
查看次数

如何强制 MERGE 语句与 DELETE 使用索引查找?

我为我的 Facebook 应用程序制作了 MS SQL 2014 数据库,该应用程序与朋友一起使用。我在 DB 中为所有用户保留好友,并在应用程序启动时从 Facebook 更新他们。为此,我使用了 MERGE 语句(表变量 @FriendUserIds 包含好友 ID 列表;表 UserFriends 具有聚集主键(UserId、FriendUserId)):

MERGE UserFriends
    USING (
        SELECT
                UserId
            FROM @FriendUserIds
    ) AS source (FriendUserId)
        ON UserFriends.UserId = @UserId
            AND UserFriends.FriendUserId = source.FriendUserId
    WHEN NOT MATCHED BY TARGET
        THEN INSERT (UserId, FriendUserId)
            VALUES (@UserId, source.FriendUserId)
    WHEN NOT MATCHED BY SOURCE
        AND UserFriends.UserId = @UserId
        THEN DELETE;
Run Code Online (Sandbox Code Playgroud)

问题是查询优化器无法识别它可以在 UserFriends 上使用 INDEX SEEK。它使用 SCAN 代替,我不知道强制 SEEK 的方法。现在,我通过将操作拆分为两个查询(用于添加新朋友的 MERGE 和用于删除不再朋友的 DELETE)来规避该问题,这仍然比单个 MERGE 语句快得多(没有 DELETE 语句的 MERGE 使用 …

sql sql-server indexing merge seek

2
推荐指数
1
解决办法
2299
查看次数

标签 统计

sql-server ×2

clustered-index ×1

indexing ×1

merge ×1

seek ×1

sql ×1

sql-order-by ×1