• TSQL之哈希索引


    T-SQL之哈希索引

    (一)问题提出

    1,当表中一个字段过长时,建立索引就不适合的了,建立索引的一个原则就是索引不能太宽。

    2,对于varchar(max)、nvarchar(max) 和 varbinary(max) 大值数据类型根本就不能建立索引。

    3,对于这个情况怎么办呢?

    4,哈希索引就派上了用场。

    (二)示例代码

     

    -建立测试表
    CREATE TABLE hash_index
      (
         id   INT IDENTITY(1, 1) PRIMARY KEY,
         name VARCHAR(max)
      )
     
    go
    --插入10000测试数据
    WITH cte
         AS (SELECT NUMBER + 1 AS NUMBER
             FROM   master..spt_values a
             WHERE  a.TYPE = 'P'
                    AND NUMBER < 100)
    INSERT INTO hash_index
                (name)
    SELECT Cast(Newid() AS VARCHAR(50)) + Cast(Newid() AS VARCHAR(50)) + Cast(
                  Newid() AS VARCHAR(50)) + Cast(Newid() AS VARCHAR(50)) + Cast(
                  Newid() AS VARCHAR(50)) + Cast(Newid() AS VARCHAR(50)) + Cast(
                  Newid() AS VARCHAR(50))
    FROM   cte a
           CROSS JOIN cte b
     
    go
    --增加计算列
    ALTER TABLE hash_index
      ADD cs_name AS Checksum(name);
     
    go
    --增加索引
    CREATE INDEX idx_name
      ON hash_index(cs_name)
    

     

     

    (三)查询示例

    --查询一表扫描
    SELECT *
    FROM   hash_index
    WHERE  name =
    'C3AA9897-9303-48C9-B2C2-758C0FFE0BB1ABB3F6FB-BC2C-45DF-B40A-E3DA413AD91E1A598E90-31FE-4F54-B468-0D085A191DA37A35782D-B048-4A6B-89CA-00A15FC1467E0235D0F1-A9EA-4908-9531-3D787C7E7AAA2E6DB162-1099-4B3B-BF93-261B87660B1359768A42-F9F7-4107-9D57-BCB91EEF3CD5'
    --查询二哈希索引
    SELECT *
    FROM   hash_index
    WHERE  name =
    'C3AA9897-9303-48C9-B2C2-758C0FFE0BB1ABB3F6FB-BC2C-45DF-B40A-E3DA413AD91E1A598E90-31FE-4F54-B468-0D085A191DA37A35782D-B048-4A6B-89CA-00A15FC1467E0235D0F1-A9EA-4908-9531-3D787C7E7AAA2E6DB162-1099-4B3B-BF93-261B87660B1359768A42-F9F7-4107-9D57-BCB91EEF3CD5'
    AND cs_name = Checksum(
    'C3AA9897-9303-48C9-B2C2-758C0FFE0BB1ABB3F6FB-BC2C-45DF-B40A-E3DA413AD91E1A598E90-31FE-4F54-B468-0D085A191DA37A35782D-B048-4A6B-89CA-00A15FC1467E0235D0F1-A9EA-4908-9531-3D787C7E7AAA2E6DB162-1099-4B3B-BF93-261B87660B1359768A42-F9F7-4107-9D57-BCB91EEF3CD5'
    )  
    

     (四)对比性能消耗
    表 'hash_index'。扫描计数 1,逻辑读取 340 次,物理读取 4 次,预读 133 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。
    表 'hash_index'。扫描计数 1,逻辑读取 5 次,物理读取 0 次,预读 0 次,lob 逻辑读取 0 次,lob 物理读取 0 次,lob 预读 0 次。

     

  • 相关阅读:
    Could not load file or assembly 'Microsoft.Practices.EnterpriseLibrary.Common, Version=5.0.414.0, ...
    问题:ORA-28000: the account is locked 用户锁住了。
    oracle连接数据库报错:ORA-01034: ORACLE not available(Oracle 不存在),ORA-27101: shared memory realm does not exist
    数据抽取Sql语句
    在Eclipse中部署Maven多模块项目
    Struts 学习记录
    eclipse中git插件无法向远程仓库提交tag的问题
    goldGrid-VBA-EXCLE处理
    SqlBulkCopy效率低下原因分析
    各种奇葩小问题
  • 原文地址:https://www.cnblogs.com/slade/p/2477032.html
Copyright © 2020-2023  润新知