【问题标题】:Seek & Scan in SQL Server在 SQL Server 中查找和扫描
【发布时间】:2010-12-11 02:48:06
【问题描述】:

谷歌搜索后,我知道索引搜索比扫描更好。

我如何编写将产生寻找而不是扫描的查询。我试图在谷歌中找到这个,但到目前为止还没有运气。

任何带有解释的简单示例将不胜感激。

谢谢

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    索引查找是指 SQL Server 可以使用binary search 快速查找行。索引中的行按特定顺序排序,您的查询必须在 WHERE 子句中指定足够的信息以允许 SQL Server 使用排序索引。

    索引扫描是指 SQL Server 无法使用索引的排序顺序,但仍可以使用索引本身。如果表行非常大,但索引相对较小,这是有道理的。 SQL Server 只需从磁盘读取较小的索引。

    举个简单的例子,以电话簿表为例:

    id int identity primary key
    lastname varchar(50)
    phonenumber varchar(15)
    

    假设 (lastname) 上有一个索引。然后这个查询将导致 index seek

    select * from phonebook where lastname = 'leno'
    

    此查询将导致索引扫描

    select * from phonebook where lastname like '%no'
    

    与现实生活中的电话簿类似,您无法查找姓名以“no”结尾的人。您必须浏览整个电话簿。

    【讨论】:

      【解决方案2】:
      1. 按主键列搜索
      2. 按带有索引的列搜索

      索引是一种数据结构,可提高对数据库表的数据检索操作的速度。当为表定义主键时,大多数 dbs 会自动创建索引。 SQL Server 为主键(复合或其他)创建一个索引作为“聚集索引”,但它必须是主键 - 它可以是其他列。

      注意:

      • LIKE '%'+ 条件 +'%' 将使用索引; LIKE 条件 +'%'

      相关阅读:

      【讨论】:

      • 先生,为什么呢?不介意的请解释一下背后的逻辑。
      • @psasik:您可以编辑我的答案,但我希望您发布自己的答案,以便我为您投票。
      • 好点雷克斯。我今天刚超过 2k,所以编辑不是自动的。
      【解决方案3】:

      扩展 rexem 的反馈:

      pkeys 的聚集索引想法不是任意的。将 pkey 聚集在一起只是默认设置。集群意味着值将在 Sql Server 8k 页面上物理上彼此靠近放置,因此假设如果您通过 pkey 获取一个值,您可能会对它的邻居感兴趣。我认为对 pkeys 这样做不是一个好主意,因为它们通常是唯一但任意的标识符。更好地聚集在更有用的数据上。顺便说一句,每个表有一个聚集索引。

      简而言之:如果您可以在聚集索引列上过滤查询(这是有道理的),那就更好了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-16
        • 2012-01-31
        • 1970-01-01
        • 2010-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多