小编Jas*_*nko的帖子

为什么当 IN 子句有子查询时 SQL Server 会执行聚集扫描?

如果我像这样搜索用户:

SELECT *
FROM userprofile
WHERE userid IN (1, 2, 3)
Run Code Online (Sandbox Code Playgroud)

执行计划显示 UserProfile 正在使用聚集索引查找

如果我更改 IN 子句以使用子查询:

SELECT *
FROM userprofile
WHERE userid IN (
    SELECT DISTINCT senders.UserId
    FROM messages m
    JOIN UserMessages recipients ON recipients.MessageId = m.MessageId
    JOIN UserMessages senders ON senders.MessageId = m.MessageId
    WHERE recipients.TypeId = 2
        AND recipients.UserId = 1
        AND senders.UserId <> 1
        AND senders.TypeId = 1 
)
Run Code Online (Sandbox Code Playgroud)

执行计划显示子查询正在使用聚集索引查找,但 UserProfile 外部查询正在使用聚集索引扫描。

我该如何编写这个以便内部和外部查询都使用 Seeks?

sql t-sql sql-server indexing performance

4
推荐指数
1
解决办法
1143
查看次数

在SQL Server 2008中透视数据

我有一个如下结果集:

MinID       MaxID   ColumnName
----------  ------- -------------------
167         34458   AccountManager
174         174     ClientDeliveryDate
184         184     LocalContactEmail
192         34459   ProjectDeveloper
194         194     ServiceType
Run Code Online (Sandbox Code Playgroud)

我想要一个结果集如:

AccountManager ClientDeliveryDate LocalContactEmail ProjectDeveloper ServiceType
-------------- ------------------ ----------------- ---------------- -----------
167            174                184               192              194
34458          174                184               34459            194
Run Code Online (Sandbox Code Playgroud)

sql sql-server sql-server-2008

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

标签 统计

sql ×2

sql-server ×2

indexing ×1

performance ×1

sql-server-2008 ×1

t-sql ×1