当前位置: 首页 > news >正文

当varchar和Nvarchar关联

Nvarchar数据类型比较特殊

有开发人员反馈,两个字段关联,一个是varchar、另外一个是Nvarchar,会有性能问题吗?

这个问题其实不能说一定有。通过实验来说明吧。

具体实验-表结构

image.png

  • A表的VAR列、NVAR列和B表的NVAR列和M列有索引
  • B表的VAR列索引不可见(或者说没有索引)

类型转换

  • VAR列有索引,但是是字符型,给了一个数值。函数转换了,全表扫描
  • 在执行计划中也看到了TO_NUMBER(“VAR”)=1的字样

image.png

两种类型都有索引情况下

image.png

image.png

  • VAR列有索引,所以用到了索引。
  • NVAR列有索引,所以用到了索引。
  • 但是注意NVAR类型列的时候有一个(“NVAR”=U’1’) U。而Var的类型时候没有。

B表VAR关闭索引

  • XXG@xxg> alter index b_var invisible;

索引已更改。

  • 设置B表var列索引不可见。自然是全表查询。

    image.png

  • B表的M列搜索引,可以使用。

  • image.png

那么B表通过m列找到的数据传导给A表

image.png

  • 可以用到索引的。即使b.var的索引不可见。相当于b.m='1’找到了b.var=‘1’ select * from a,b where a.var=‘1’ and b.m=‘1’;

  • 所以关联列在特殊情况下,不是必须两列都有索引。但是这是特殊情况。一般日常中我还是建议,且强制关联列都建立索引。因为我们无法保证都是B表这种作为传导条件的。如果是A表作为传导入口就不行了。

  • 因为在b.var没有索引的情况下。无论执行下面哪种B表都是全表。

  • image.png

在B表nvar有索引的情况下,看看索引的使用情况

  • B表nvar有索引的情况下,这个是可以用到索引的。

  • image.png

  • 但是只要一关联到A表的VAR列就是全表关联了。

  • image.png

  • 那么在其他不变的情况下,而如果是A表的VAR作为传导开始,也是可以都用到索引的。

  • image.png

  • 所以这就要求如果两个关联列一个是var一个是Nvar的话,那么要以var的作为条件去查比较好。

  • 从nvar传到var即使a.var列有索引还是发生了转换

  • image.png

从var传到nvar即使b.var列现在索引是不可见的,两个表都用到了索引。

  • image.png

结论

  • 最好是类型一样
  • 数据库设计由DBA负责而不是开发人员
  • 如果可能的话,改成varchar。避免使用varchar
  • 最好关联列都建立索引
  • 实在不行的话,用var列的条作为入口查询条件。
http://www.dtcms.com/a/325087.html

相关文章:

  • 6A 工作流:让 Cursor、Trae 等AI编程助手按流程交付的实战手册
  • Java 基础编程案例:从输入交互到逻辑处理
  • 基于django的宠物用品购物商城的设计与实现
  • [创业之路-540]:经营分析会 - 如何实现销售0到1营收的突破
  • 从DDPM对比学习Diffusion Policy:生成模型到策略学习的演进
  • Spring Boot 开发三板斧:POM 依赖、注解与配置管理
  • 字节:计算机存储单位
  • 计算机视觉实战:用YOLO打造智能停车场空位雷达
  • 线程互斥与锁机制详解
  • 【模板】拓扑排序
  • 性能解析案例
  • 人工智能与体育:体育产业的革新
  • Vue3从入门到精通: 2.5 Vue3组件库开发与设计系统构建
  • Python day40
  • Leetcode 3645. Maximum Total from Optimal Activation Order
  • vulnhub-drippingblues靶场攻略
  • VTA学习笔记
  • 实现MATLAB2024b和M文件关联(防止运行多个MATLAB)
  • iptables -F 与 iptables -X
  • GNN训练:本地训练数据准备
  • scikit-learn/sklearn学习|线性回归解读
  • 虚拟机安装ubuntu系统
  • C++多线程服务器
  • MySQL基础知识总结
  • MySQL 序列使用详细说明
  • RAG (Retrieval-Augmented Generation) 原理详解与实例
  • 专题二_滑动窗口_最小覆盖子串
  • 【lucene】BlockDocsEnum 跟BlockImpactsDocsEnum 的区别
  • C++入门学习5
  • Boost.Asio io_service 与 线程 的分析