小编Dar*_*ong的帖子

非聚集索引 - 键和非键

我只是想确保我在这些概念的正确轨道上,所以任何反馈都将不胜感激。

这是我刚刚优化的查询的理论,通过反复试验和阅读 MSDN 文档的过程。

查询

DECLARE @pic_id int
SET pic_id = 1

SELECT ROW_NUMBER() OVER (ORDER BY pic_date desc) AS row_num, *
FROM tbl_pics
WHERE deleted = 0 AND map_id = 1 AND (hidden = 0 OR pic_id = @pic_id)
Run Code Online (Sandbox Code Playgroud)

指数

CREATE NONCLUSTERED INDEX [IX_tbl_pics] ON [dbo].[tbl_pics] 
(
    [map_id] ASC,
    [deleted] ASC,
    [pic_date] DESC
)
INCLUDE ( [hidden], [pic_id] )
Run Code Online (Sandbox Code Playgroud)

pic_id上还有一个PK索引

理论

键列是这样,因为它们用于 WHERE 子句(但不用于 OR 情况)或 ORDER BY。

非键 (INCLUDE) 列也是如此,因为它们在 WHERE 中使用,但因为它们用于 OR 场景,它们不能(不能 = 不会提高性能)成为键列。

这些假设正确吗?如果没有,我错过了什么?

谢谢!

index sql-server-2008 sql-server t-sql

8
推荐指数
2
解决办法
228
查看次数

加速 COUNT(*) - WHERE 子句减慢查询速度

以下查询需要 497 ms 才能运行,如果我删除 AND 部分之后只需要 320 ms。有没有办法加快这个速度?我在“messages”表上的唯一索引是“messages_id”上的PK。'hidden' 字段是一个位字段(非空),'message_type_id' 是一个 int 字段(非空),而 message_id 是一个 int 字段(PK)。

SELECT COUNT(*)
FROM messages
WHERE message_type_id = 1
AND (hidden = 0 OR message_id = @message_id)
Run Code Online (Sandbox Code Playgroud)

提前致谢!

sql-server-2008 sql-server t-sql count

7
推荐指数
2
解决办法
5629
查看次数

INNER JOIN 使 COUNT(*) 变慢

我有一个非常简单的查询:

SELECT COUNT(*)
FROM messages
INNER JOIN users ON messages.user_id = users.user_id
Run Code Online (Sandbox Code Playgroud)

加入需要 1146 毫秒,没有加入需要 220 毫秒(220 毫秒对我来说仍然很慢)。在包含 1,000,000+ 行的消息表上进行测试。

我在两个表 ( message_idand user_id)上都设置了主键,并设置了连接messages.user_idand的外键users.user_id

此查询的原因是为分页系统提供记录总数。

我还能做些什么来加速查询?

performance sql-server-2008 join foreign-key sql-server

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