AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 11689
Accepted
Gnomo
Gnomo
Asked: 2010-09-10 10:31:11 +0800 CST2010-09-10 10:31:11 +0800 CST 2010-09-10 10:31:11 +0800 CST

解释执行计划

  • 772

我需要一些帮助来分析一些简单的 t-sql 执行计划。我有一个包含以下 3 列的表 [User]:

Id(主键),用户名(nvarchar(50)),名字(nvarchar(50))

我为用户名列创建了一个唯一的非聚集索引

按 FirstName 过滤查询的执行计划:

select * from [User] where FirstName ='John'

显示总成本为 0,0033095 的聚簇索引扫描

另一个按用户名过滤的查询的执行计划:

select * from [User] where Username = 'johndoe'

显示了一个嵌套循环,其中包含一个索引查找,然后是一个聚集索引查找,总成本为 0,00657038!这是之前查询成本的两倍,我不明白!

有一个与 Username 列关联的索引,没有与 FirstName 关联的索引,我希望第二个查询更快。

sql-server index
  • 3 3 个回答
  • 184 Views

3 个回答

  • Voted
  1. SQLMenace
    2010-09-10T10:37:12+08:002010-09-10T10:37:12+08:00

    对于这样的事情,总成本几乎总是不可靠的

    我会用STATISTICS IOandSTATISTICS TIME代替

    运行两个查询并查看读取的差异

    SET STATISTICS IO ON
    select * from [User] where FirstName ='John'
    select * from [User] where Username = 'johndoe
    SET STATISTICS IO OFF
    

    你也可以用这个看时间

    SET STATISTICS TIME ON
    select * from [User] where FirstName ='John'
    select * from [User] where Username = 'johndoe'
    SET STATISTICS TIME OFF
    
    • 7
  2. gbn
    2010-09-10T10:52:42+08:002010-09-10T10:52:42+08:00

    完全符合预期... :-)

    第一个将是直接的集群/PK 扫描

    第二个将是对 UserName 列的索引查找,然后是对聚集索引的键/书签查找。

    您通常会将 UserName 上的索引设为覆盖索引……SELECT *无论如何,这通常毫无意义。

    相关问题:

    • 哪个更好:书签/键查找或索引扫描
    • SQL 服务器 2K 书签查找
    • 6
  3. Best Answer
    ErikE
    2010-09-10T20:24:17+08:002010-09-10T20:24:17+08:00

    根据您的问题,我了解到您的桌子相对较小。当您在表中放置更多行时,您会发现书签查找保持大致相同,并且扫描时间越来越长。最终扫描的成本将比书签查找多很多倍。

    正如 SQLMenace 所说,执行计划成本通常是不可靠的。使用 Query Profiler 或 SET STATISTICS 查看每个查询实际消耗了哪些资源。

    最后,确保表上的统计信息已更新,否则引擎可能会在以何种顺序使用哪些索引或表方面做出糟糕的选择。

    • 4

相关问题

  • 死锁的主要原因是什么,可以预防吗?

  • 我在索引上放了多少“填充”?

  • 如何确定是否需要或需要索引

  • RDBMS 上的“索引”是什么意思?[关闭]

  • 如何在 MySQL 中创建条件索引?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何在转储中使用使用数据库执行 mysqldump

    • 4 个回答
  • Marko Smith

    在 MySQL Workbench 中,在表的“顶部”插入一个新列?

    • 4 个回答
  • Marko Smith

    SQL Server - 临时表与物理表

    • 3 个回答
  • Marko Smith

    什么时候全表扫描比索引扫描更好?

    • 4 个回答
  • Marko Smith

    收缩数据库和文件有什么区别?

    • 3 个回答
  • Marko Smith

    Sql FILESTREAM 垃圾回收问题

    • 1 个回答
  • Marko Smith

    SQL Server 2008 DBCC 问题

    • 2 个回答
  • Marko Smith

    如何在恢复中停止、脱机和删除 SQL Server 数据库?

    • 2 个回答
  • Marko Smith

    如何将 SQL Server 2000 数据库恢复到 SQL Server 2008 实例?

    • 5 个回答
  • Marko Smith

    在 T-SQL 中使用 CAST 会影响性能

    • 3 个回答
  • Martin Hope
    user481826 如何在转储中使用使用数据库执行 mysqldump 2010-10-29 16:08:59 +0800 CST
  • Martin Hope
    Will A SQL Server - 临时表与物理表 2010-07-05 08:46:10 +0800 CST
  • Martin Hope
    NibblyPig SQL 2008 中的表分区 - 为什么? 2010-06-30 00:59:23 +0800 CST
  • Martin Hope
    Gnomo 解释执行计划 2010-09-10 10:31:11 +0800 CST
  • Martin Hope
    ahsan 什么时候全表扫描比索引扫描更好? 2010-12-10 10:16:54 +0800 CST
  • Martin Hope
    Tom DeMille 我应该定期缩小我的数据库或至少我的日志文件吗? 2010-04-24 08:19:19 +0800 CST
  • Martin Hope
    Jango 收缩数据库和文件有什么区别? 2010-08-24 10:25:42 +0800 CST
  • Martin Hope
    CrapHands 如何在恢复中停止、脱机和删除 SQL Server 数据库? 2010-12-18 07:12:36 +0800 CST
  • Martin Hope
    Ryan Delucchi 在 T-SQL 中使用 CAST 会影响性能 2010-07-02 15:11:16 +0800 CST
  • Martin Hope
    Manjot SQL 2005:我们能否确定重建索引维护作业可以使数据库日志文件增长多少? 2010-08-12 18:40:44 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve