位置: 编程技术 - 正文

SQLServer性能优化--间接实现函数索引或者Hash索引(SQL Server性能优化工具Profiler)

编辑:rootadmin

推荐整理分享SQLServer性能优化--间接实现函数索引或者Hash索引(SQL Server性能优化工具Profiler),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:sqlserver性能优化与管理艺术pdf,sqlserver性能优化论述,sqlserver性能优化与管理的艺术百度网盘,sqlserver性能优化方案有哪些,sqlserver性能优化与管理艺术pdf,sqlserver性能优化与管理艺术pdf,sqlserver性能优化与管理艺术pdf,sqlserver性能优化与管理艺术pdf,内容如对您有帮助,希望把文章链接给更多的朋友!

SQLServer中没有函数索引,在某些场景下查询的时候要根据字段的某一部分做查询或者经过某种计算之后做查询,如果使用函数或者其他方式作用在字段上之后,就会限制到索引的使用,不过我们可以间接地实现类似于函数索引的功能。

另外一个就是如果查询字段较大或者字段较多的时候,所建立的索引就显得有点笨重,效率也不高,就需要考虑使用一个较小的"替代性"字段做等价替换,类似于Hash索引,

本文粗浅地介绍两种上述两种问题的解决方式,仅供参考。

1,在计算列上建索引,实现“函数索引”的功能

SQLServer在建表的时候允许使用计算列,可以借助这个计算列来实现函数索引的功能,这里举例说明一下

在有索引的字段上使用函数之后,是无法使用索引的

如果直接在计算列上查询,就可以正常地使用到索引了

以上通过在计算列上建立一个索引,可以根据计算列上的索引做查找,避免了直接在字段上使用函数或者其他操作,造成即便字段上有索引也用不到的情况

补充:

测试中神奇地发现,如果计算列字段上建立了索引,在原始字段上使用函数与计算列的函数一样的时候,可以神奇地使用到计算列上的索引。可见SQLServer在我们没有注意的地方也是下了不少功夫的啊

2,生成较长字段或者多个字段的Hash值替代原始字段做查询或者连接来提升查询效率

开发中遇到另外一种常见的情况是经常使用到的查询条件字段较长,或者是表连接的时候连接条件字段较多,

即便是字段或者查询条件上有索引,但是因为字段较长或者条件较多,此时有可能会影响到查询的效率

这种情况就适当考虑将原始的较长的字段生成一个较小的字段(但是要确保唯一性),或者是讲多个字段生成一个较短的数据类型做替代,以提高查询的效率

举个例子,假如有这么一张表,Name字段是我模拟出来的,Name是一个比较长的字段,又要用来做检索

SQLServer性能优化--间接实现函数索引或者Hash索引(SQL Server性能优化工具Profiler)

意思就是查询字段较长,索引代价太大,此时就需要考虑用一种较小的等价字段来替代

下面通过某种方式计算较长字段的Hash值,来做等价替换

模拟生成一下测试数据

我们知道,Name这个名字是nvarchar()的,这个字段做索引不是不可以,如果情况复杂,实际中有可能比这个字段更大,做索引显得太宽了,造成索引空间过大,在效率上有一定程度的影响。

这里就可以考虑在Name这个字段上生成一个“替代”字段(上述HashName AS CAST( HASHBYTES('MD2',QueryName) AS UNIQUEIDENTIFIER) persisted这个计算列),

这个字段首选是要跟实际值一一对应的,另外就是要求“替代”的字段类型要求相对较小,当然方法也有多种,比如生成利用checksum函数生成一个校验值,但是据实际观察checksum生成的校验值是有可能重复的,也就是说两个不同的字符串,生成同一个校验值

比如这样,很容易验证出来这个问题,可以认为是对于不同的字符串,计算之后得到同一个校验和

因此在生成“替代”字段的时候,需要考虑计算值的唯一性

这里使用的是HASHBYTES加密函数,对字符串加密,然后对加密之后的数据生成一个UNIQUEIDENTIFIER,重复的概率就小的多的多了

演示这里通过CAST( HASHBYTES('MD2','北京新视点科技文化传媒有限公司') AS UNIQUEIDENTIFIER)的方式,就可以给这个较长的字段生成一个UNIQUEIDENTIFIER类型的字段,

当然也不一定只有这一种方法,甚至可以做的跟复杂,只要能保证一个唯一的长字段生成的较短的字段也是唯一的就可以达到目的了

参考如下查询,就可以使用HashName计算出来的值与计算列做比较,在一定程度上可以减少检索字段索引的大小,又能达到目的的效果

如截图,就可以使用HashName字段上的索引了,同时也避免了在原始的QueryName这个较长的字段上建索引,节约了空间并提高了查询效率

3, 逻辑主键为多个字段的时候,在多了字段上生成一个“替代”性的唯一字段

某些情况下业务需求或者设计也好(比如没有达到第三范式,BC范式,第四范式,甚至是第五范式),在表连接的时候往往会有多个字段

比如这种样子:

在表关联的时候,连接条件很多,如果是这样子,最好的情况就是建立一个较宽的复合索引,但是这样的话,索引的宽度和体积就变得很大,使用的时候效率也有一定的影响。这种情况就可以考虑在TableNameA 和 TableNameB 上,利用多个连接的字段(Key+Type +Status +CreationTime+***)做了类似于示例2中的一个计算列,在计算列上建立一个索引,然后再表连接的时候就可以用如下的方式替代

总是,这是一种以空间换时间的思路(冗余存储一个类似于标识符的字段,提高查询效率),在生成“替代”字段的思想有两点,第一要足够的小,第二要原始值生成替代字段的唯一性

总结:SQLServer 中没有函数索引和Hash索引,而某些业务需求或者说是为了性能考虑,又需要类似的功能,通过类似于空间换时间的方法来实现,可以变通地来实现类似于函数索引或者Hash索引的功能,已达到其他数据库中函数索引和Hash索引的效果(虽然原理可能不一样)。需要注意的就是在生成计算列或者说Hash值替代的时候要注意计算方式,确保生成之后的Key值的唯一性。当然实现方式就可以根据需要自行选择了,条条大路通罗马。

标签: SQL Server性能优化工具Profiler

本文链接地址:https://www.jiuchutong.com/biancheng/324381.html 转载请保留说明!

上一篇:SqlServer 在事务中获得自增ID的实例代码(sql如何进行事务操作)

下一篇:SQL Server日期加减函数DATEDIFF与DATEADD用法分析(sqlserver日期加减月份)

  • 农民专业合作社章程模板
  • 个人开具服务费发票税率
  • 增值税的征税范围
  • 汇兑损益一般是多少
  • 银行存款支付运费会计科目
  • 出口退税贷款操作流程
  • 固定资产清理期末余额在借方是什么意思
  • 建筑行业一般纳税人增值税税率是多少
  • 小规模纳税人企业所得税怎么申报
  • 小规模纳税人交印花税吗
  • 小规模开专票要计提附加税吗
  • 跨年确认收入税务风险
  • 销售蔬菜的个体工商怎么开具发票
  • 不可修复废品损失会计分录
  • 接受虚开增值税 经侦立案
  • 结构性存款质押 叫停
  • 购买金蝶软件计入什么费用
  • 挂靠建筑公司企业所得税怎么交?
  • 如何确认增值税纳税义务发生时间
  • 财税[2001]10号
  • 物业公司怎么开展业务
  • 税前可以扣除的管理费用计算公式
  • 企业法人信息变更
  • 房地产企业按照功能可分为
  • 增值税(滞纳金)
  • 个体定税标准
  • 劳务派遣用工工资标准
  • 外购软件可以加计扣除吗
  • 附加税零申报怎么申报
  • 稽查查补税款怎么计算企业所得税
  • 网络发票开具
  • 怎么激活win10密钥
  • 如何彻底清洁
  • linux获取网络接口及ip命令
  • win7为什么现在不能用了
  • 跨年退税怎么处理
  • ipados15什么时候发布
  • 怎么关闭windows defender
  • 最早的操作系统被称为什么操作系统
  • 网上打印企业征信流程
  • resnet+unet
  • 帝国cms功能
  • 以前多计提的工资怎么办
  • 门诊收费票据能作为报销凭证吗
  • 增值税普通发票需要交税吗
  • 一般纳税人暂估入账的会计分录
  • 软件开发企业如何核算成本
  • 利润表中所得税费用为负数是什么意思
  • 商品流通企业的含义
  • 劳务报酬的个人所得税
  • 其他权益工具的公允价值变动计入哪里
  • 申报成功后怎么更正申报
  • 票据背书转让挂什么科目
  • 电子承兑汇票接收流程
  • 其他未列明信息技术服务业
  • 招待费进项税额可以抵扣吗
  • 房屋租赁产生的税费叫什么
  • 向母公司贷款利率是多少
  • 企业注销其他应付款怎么处理账务
  • 研发费用占销售的比例
  • 成本利润率计算销售价格
  • 明细账模版
  • 如何配置samba配置文件
  • 如何提升windows版本
  • 64位CentOS 6.4安装配置流量监控工具ntopng
  • win7设置路由器上网
  • win7系统图形设置选项
  • win8开始界面如何设置成win7
  • win7桌面右键菜单多余选项删除
  • 详解杭州亚运会会徽和口号
  • 趣谈 linux 操作系统
  • sticky memo widget
  • nodejs如何使用
  • cocos2dx-3.2+lua 常用代码
  • python入门100例
  • android基础知识总结
  • 详解Python中的Descriptor描述符类
  • 怎样从增值税发票查询
  • 上海税务登记如何网上申请
  • 企业可以享受哪些政策优惠
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设