sql-server - 当数据库强制连接时,如何强制更好的执行计划?

标签 sql-server tsql sql-server-2005 query-performance

我正在优化 SQL Server 2005 上的查询。我对大约有 200 万行的 mytable 有一个简单的查询:

SELECT id, num
FROM mytable
WHERE t_id = 587

id字段是主键(聚集索引),t_id字段上存在非聚集索引。

上述查询的查询计划包括聚集索引查找和索引查找,然后执行嵌套循环(内连接)来合并结果。 STATISTICS IO 显示 3325 页面读取。

如果我将查询更改为以下内容,则服务器仅执行 6 次页面读取和一次无连接的索引查找:

SELECT id
FROM mytable
WHERE t_id = 587

我尝试在 num 列上添加索引,并在 numtid 上添加索引。服务器未选择这两个索引。

我希望减少页面读取次数,但仍检索 idnum 列。

最佳答案

以下索引应该是最佳的:

CREATE INDEX idx ON MyTable (t_id)
INCLUDE (num)

我不记得 INCLUDEd 列在 2005 年是否是有效语法,您可能必须使用:

CREATE INDEX idx ON MyTable (t_id, num)

[id] 列将包含在索引中,因为它是聚集键。

关于sql-server - 当数据库强制连接时,如何强制更好的执行计划?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56763193/

相关文章:

sql - 我如何使用 CASE-WHEN 将空值列设置为 0?

java - 哪些 MS SQL Server 类型映射到 Types.VARCHAR

sql - 选择从开始日期起 1-2 年的记录

sql - 如何从列的值中删除双引号?

sql-server - 如何在 MS SQL 2005 中删除除最新 20,000 条记录之外的所有记录?

c# - 如何获取本地网络中已安装并存在的Sql Server实例(或SqlExpress)的列表

sql - 如何中止触发器中多行的插入

sql - SQL Server 2005 中动态命名索引?

sql-server - 是否可以将数据从sql server 2005 中的表恢复到sql server 2008?

sql-server - 为 T-SQL 变量分配的内存在哪里?