• 一定需要使用(N)Text吗?


    在某些情况下,例如,存储一些特定笔记的时候(读书笔记,心情日志,别人的文章等)。存储在数据库中,VARCHAR(8000)的长度不够用。一般的情况下,往往会想到,直接使用N/Text类型的字段。这时,问题来了:

    假设通常情况下,绝大部分操作是保存一些简单的内容(<1500),长度通过2000已经极为稀少了(<1/10),只有极个别(1/100)会超过8000。此时若所有的数据均使用N/Text来进行记录。在进行数据读取操作的时候,数据库还需要额外地再去读取Lob-Row的数据行,在大数据量搜索的情况下,对性能造成极大的影响。并且N/Text类型的数据无法使用绝大多数字符串的内置函数,这为日常的应用也带来了极大的不方便。

    为了解决这个问题从SQL2005开始,引入了VARCHAR(Max)类型的数据。

    这两个类型的数据,有什么差异呢?做个实验:

    create table VarcharMaxTestTable
    (
    	TestValue varchar(max)
    )
    go
    insert into VarcharMaxTestTable values(REPLICATE('f', 1000));
    
    --insert into VarcharMaxTestTable values(REPLICATE('f', 100));
    
    create table TextTestTable
    (
    	TestValue text
    )
    go
    insert into TextTestTable values(REPLICATE('d', 1000));


    首先创建两张表,并进行数据初始化。而后,进行一次查询统计:

    set statistics io on
    select * from VarcharMaxTestTable
    
    select * from TextTestTable
    set statistics io off

    Table 'VarcharMaxTestTable'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.

    Table 'TextTestTable'. Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 3, lob physical reads 0, lob read-ahead reads 0.

    在进行Text类型的字段的查询,增加了lob 逻辑读,这是为什么呢?看看两张表的数据页分页,

    image

    image

    我们可以看出来,原来,Text类型的字段,具有额外的Log Row类型的数据页,当进行数据查询时,需要额外地再去扫描这些数据页,便有了大数据页逻辑读的额外开销了。

    更多动态请关注微信公众号 dbagrant
  • 相关阅读:
    网站页面性能优化的 34条黄金守则 (雅虎团队经验)
    进程调度算法小结
    玩转TCP连接
    数据包在网络中的流转
    浅入理解JVM虚拟机
    Leecode no.47 全排列 II
    Leecode no.143 重排链表
    关于我用设计模式对公司代码重构的这件事
    进程间通信方式小结
    Leecode no.82 删除排序链表中的重复元素 II
  • 原文地址:https://www.cnblogs.com/laoyumi/p/1796588.html
Copyright © 2020-2023  润新知