一、减少输入

  程序员都喜欢使用通配符,如:

    SELECT * FROM Person

  又或者省略字段名:

  INSERT INTO Person VALUES('10','张飞'...)

二、捷径会让你迷失方向

  对于以上代码,如果你仅仅是在开发过程中用于查看一下数据库信息,又或者你只是写个小程序自己玩玩,这是没有什么问题的。

  但是如果一旦你习惯于这样编写正式生产环境中的代码,那问题就随之而来了。

  1、破坏代码重构

  如果数据库更改了,比如增加了一列:

  ALTER TABLE Person Add Age int

  这下糟糕了,你程序中所有的

  INSERT INTO Person VALUES(...)

  语句都会报错。

  早使用这种隐式模式执行INSERT时,输入必须严格按照定义表时的那些列的顺序,如果列变了,这条语句就会抛出一个错误,甚至有可能就会抛出一个错误,甚至有可能把数据写到错误的列里面去。

  假设原本是使用隐式模式查询:

  SELECT * FROM Person

  但是加入删掉了中间的一个列:

    ALTER TABLE Person DROP COLUMN Age

  那么加入是使用DataTable的方式装载数据库内容,那么row[10]可能就已经不是第十个。在重命名、添加、删除列的时候,程序代码并不能适应查询结果的改变。如果使用了通配符,就无法预测这个查询会返回多少行。

  2、隐藏的开销

  在查询中使用通配符可能会影响性能和扩展性。一次性查询所获取的列越多,客户端程序和数据库之间的网络传输的字节也越多。

  生产环境中的程序可能会有很多并发的查询请求。它们都共享同一个网络带宽。太多客户端同时查询返回上千条记录可能会造成阻塞。

  3、合理使用反模式

  在你只是为了快速地写几个脚本对一个解决方案进行测试,或者写临时SQL查询对当前数据进行查看时,使用通配符是合情合理的。只执行一两次的查询对可维护性没有任何要求。

  当然,输入一张很多列的表的所有列名是很耗时的,对某些人来说,开发效率可能比程序运行效率更加重要。例如,当你开发的是较少用户量的小公司内部访问程序,这时候返回数据所使用的带宽比查询语句本身要多得多。这时候没必要纠结这些问题。

三、解决方案-明确列出列名

  1、预防错误

  每次查询都列出所有你需要用到的列,而不是使用通配符或者隐式列的列表。

  SELECT Id,Name... FROM PersonINSERT INTO Person (Id,Name,Age...) VALUES(1,'张飞',22...)

  这样做的好处如下:

  •   如果这张表的某一列的位置被移动过,他不会对返回结果中这一列的位置造成影响。
  •   如果这张表中新加入一列,它是不会出现在查询结果中的。
  •   如果从这张表中删除一列,你的查询会得到一个错误,但是直接就能够找到问题所在,这是符合尽早出错原则的。

  2、减少资源占用

  如果必须关心软件的可扩展性和程序的吞吐量,你应该检查一下网络传输过程中可能造成的浪费。一旦在SQL中禁用通配符,那么就很自然地去除那些不需要的列,提高了带宽和内存的使用效率。

转载于:https://www.cnblogs.com/zxtceq/p/7160383.html

查询反模式 - 隐式的列相关推荐

  1. SQL反模式笔记7——多列属性

    目标:存储多值属性 反模式:创建多个列.比如产品主图,开始需求是,每个产品都是3张图,但随着时间的推移,可能就不止3张了. 1.查询:多个列的话,查询时可能不得不用IN,或者多个OR 2.添加.删除. ...

  2. 查询反模式 - GroupBy、HAVING的理解

    为了最简单地说明问题,我特地设计了一张这样的表. 一.GROUP BY单值规则 规则1:单值规则,跟在SELECT后面的列表,对于每个分组来说,必须返回且仅仅返回一个值. 典型的表现就是跟在SELEC ...

  3. oracle c op,ORACLE中内部函数SYS_OP_C2C和隐式类型转换

    什么是SYS_OP_C2C呢?官方的介绍如下: SYS_OP_C2C is an internal function which does an implicit conversion of varc ...

  4. sql隐式转换_SQL Server中的隐式转换

    sql隐式转换 This article will provide an overview of SQL Server implicit conversion including data type ...

  5. oracle中的cursor属性有哪些,Oracle学习11:游标(cursor)--显式游标隐式游标、游标四个属性、循环遍历...

    1.概述 上文PLSQL学习中提到的知识,可以发现,基本都可以通过Java等语言实现,而为了实现程序的可移植性,实际开发工作中我们也是如此做的. 那么PLSQL的重点是什么呢?接下来我们来介绍游标cu ...

  6. CSS3 网格布局(grid layout)基础知识 - 隐式网格自动布局(grid-auto-rows/grid-auto-columns/grid-auto-flow)

    网格模板(grid-template)属性及其普通写法(longhands)定义了一个固定数量的轨道,构成显式网格. 当网格项目定位在这些界限之外,网格容器通过增加隐式网格线生成隐式网格轨道. 这些隐 ...

  7. mysql隐式锁定辅助索引_当Mysql - InnoDB行锁遇到复合主键和多列索引-Go语言中文社区...

    背景 今天在配合其他项目组做系统压测,过程中出现了偶发的死锁问题.分析代码后发现有复合主键的update情况,更新复合主键表时只使用了一个字段更新,同时在事务内又有对该表的insert操作,结果出现了 ...

  8. 20,sql 测试 : 1.4g 文件的 sql 运行测试,表关联,日期转换,字符编码,乱码解决,程序的 shell 执行,字符串转数字,三个隐式转换,用列分区,输出,sum over

    一 ,基础操作 : 1 ,表关联 : select stock.area,goods.smallLei,goods.typeColorId,weekofyear(to_date(stock.sellD ...

  9. 隐式 Style–CSS 在反爬虫中的应用

    文章作者:「夜幕团队 NightTeam」 - 戴煌金 润色.校对:「夜幕团队 NightTeam」 - Loco 什么是隐式 Style–CSS 先来唠唠什么是 隐式 Style–CSS: CSS中 ...

最新文章

  1. 计算机:2014年考研大纲解析之数据结构
  2. word2016配置Mathtype
  3. 将长度为n的绳子分为m段求各段乘积的最大值
  4. 让VC程序在Win7下获得管理员权限
  5. COM(组件对象模型)
  6. 安卓吸顶+下拉放大_Android自定义scrollView实现顶部图片下拉放大
  7. 为啥我的页面模板的from提交不了数据_4-9【微信小程序全栈开发课程】意见反馈(四)--提交反馈信息
  8. UVA340 ​​​​​​​Master-Mind Hints【数组】
  9. php 查文件sha1 内存不足,SHA是否足以检查文件重复? (PHP中的sha1_file)
  10. 排序算法——随机快速排序
  11. 官方文档太辣鸡?TensorFlow 2.0开源工具书,30天「无痛」上手
  12. 修改linux服务器时间
  13. 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面
  14. 不购买2021新款MacBook Pro的理由
  15. Snapchat面试题:移除K位
  16. BDTC 2017 | “TOP10大数据应用最佳案例实践”十佳获奖单位精彩分享
  17. 使用ubuntu系统做程序开发
  18. java读取指定位置arraylist,获取元素在Java ArrayList中的位置
  19. 二叉树——中序遍历(递归/非递归)
  20. 基于嵌入式技术的网络视频监控系统

热门文章

  1. 红茶一杯话Binder(传输机制篇_下)
  2. java使用keystore认证过程(license认证)
  3. linux dns语法检测工具,DNS解析检查工具之nslookup
  4. java 连接sqlserver2005_JAVA用jdbc连接SQLServer2005
  5. 思想开放-学数学之人必备的特质(转载)
  6. 【五校联考3day2】B
  7. php获取两个输入框的值,PHP获取多个文本框中值的实例代码
  8. 苹果手机怎样用计算机,苹果手机怎么连接电脑,详细教您怎么使用苹果手机连接电脑...
  9. 什么是java泛型_java泛型背后是什么
  10. php tsrmg,php garbage collect