描述

大家通常禁止在生产环境直接使用select * 已成常识了,也常常在开发规范中就会规定不允许直接使用select *,那么我们为什么不允许使用select * ,在一些什么场景下select * 会出问题?能否控制不能直接使用select *?出于这些疑问,我们特别测试记录一下。

 

测试环境

Microsoft SQL Server 2012 - 11.0.2100.60 (X64) 
Feb 10 2012 19:39:15 
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: )
 

select * 可能会造成业务功能出错

假设我们有一个视图 V_test 代码如下:
 CREATE VIEW v_test
AS
SELECT *
FROM test
你在web前端调用直接使用如下脚本并对应好显示的字段,当时功能是正常的。
   SELECT  *
FROM v_test
test 表结构如下:

后来因为业务调整,有人调整了test表 ,并加一个字段F ,那么接下来的后果就会前端相应的功能因新增的字段F直接报错。

 

select * 可能会造成性能方面的问题

测试数据准备
 --新建测试表
IF OBJECT_ID('test', 'U') IS NOT NULL
DROP TABLE test;
CREATE TABLE test
(
id int IDENTITY(1, 1) ,
a nvarchar(20) ,
b nvarchar(15) ,
c nvarchar(20) ,
d int ,
e float
);
 --造测试数据
DECLARE @i INT;
SET @i = 10000;
WHILE ( @i > 0 )
BEGIN
INSERT INTO test
( a ,
b ,
c ,
d ,
e
)
SELECT RAND() * 1000 ,
RAND() * 1000 ,
REPLICATE('a', 3) ,
@i ,
@i - 1;
SELECT @i = @i - 1;
END;
 --新建索引(主键、非聚集索引)
ALTER TABLE dbo.test ADD CONSTRAINT PK_test_id PRIMARY KEY(ID);
CREATE INDEX IX_test_1 ON dbo.test(a);
查询条件使用主键字段的执行计划,主键是默认覆盖全部字段。

如直接使用字段a做查询条件

还是聚集索引扫描,全表扫,无法使用我们已新建好的非聚集索引IX_test_1,在上述语句中因该索引未覆盖到非a 的字段。假设实际场景我们只需取a字段,那么执行计划又是怎么样的?

如上图,就会走我们期望的索引,同时也可以减少因select * 而多读的字段(id、b、c、d、e)的网络传输,所以,尽量指定自己所需的字段名,可以避免一些无谓的性能开销。

 

如何控制不让 select *

假设我们不允许在上述测试表test上执行select * 可以如何处理
 --新建测试表
IF OBJECT_ID('test', 'U') IS NOT NULL
DROP TABLE test;
CREATE TABLE test
(
id int IDENTITY(1, 1) ,
a nvarchar(20) ,
b nvarchar(15) ,
c nvarchar(20) ,
d int ,
e float,
abort_select_all AS (1/0) ---新增控制字段
);
--造测试数据
DECLARE @i INT;
SET @i = 10000;
WHILE ( @i > 0 )
BEGIN
INSERT INTO test
( a ,
b ,
c ,
d ,
e
)
SELECT RAND() * 1000 ,
RAND() * 1000 ,
REPLICATE('a', 3) ,
@i ,
@i - 1;
SELECT @i = @i - 1;
END;
--新建索引 (主键、非聚集索引)
ALTER TABLE dbo.test ADD CONSTRAINT PK_test_id PRIMARY KEY(ID);
CREATE INDEX IX_test_1 ON dbo.test(a);
如下图,如果select *  因读取了abort_select_all字段(1/0)就会直接报错,从而达到不能直接select *的效果;

直接按字段名查询没有问题(非abort_select_all字段)。

直接按字段名查询没有问题。

 

SELECT * 测试的更多相关文章

  1. Mybatis-Plus 实战完整学习笔记(七)------select测试二

    1.查询selectOne  (3.0.3版) @Test public void selectMethod() throws SQLException { // 根据ID获取一个对象的数据 Empl ...

  2. Mybatis-Plus 实战完整学习笔记(六)------select测试一

    查询方法(3.0.3) 1.查询一个员工的数据 @Test public void selectMethod() throws SQLException { // 根据ID获取一个对象的数据 Empl ...

  3. sysbench 压力测试

    200 ? "200px" : this.width)!important;} --> 介绍 sysbench是一个模块化.跨平台.多线程基准测试工具,主要用于测试不同系统参 ...

  4. (十二)select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型:int select(int maxfd,fd_set *rdset ...

  5. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET

    http://hi.baidu.com/%B1%D5%C4%BF%B3%C9%B7%F0/blog/item/e7284ef16bcec3c70a46e05e.html select函数用于在非阻塞中 ...

  6. Hibernate框架的基本搭建(一个小的java project的测试向数据库中插入和查询数据的功能)

    Hibernate介绍:Hibernate是一种“对象-关系型数据映射组件”,它使用映射文件将对象(object)与关系型数据(Relational)相关联,在Hibernate中映射文件通常以&qu ...

  7. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型, 原型: int select(int maxfd,fd_set *rds ...

  8. sysbench 0.5 oltp测试笔记

    sysbench 0.5相比0.4版本的主要变化是,oltp测试结合了lua脚本,不需要修改源码,通过自定义lua脚本就可以实现不同业务类型的测试.同时0.5相比0.4需要消耗更多的cpu资源. 1. ...

  9. select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET (转)

    select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: #include <sys/time.h>       ...

随机推荐

  1. cubase 的FX轨道使用方法

    FX为辅助通道!

  2. 下载好的vue项目如何在自己电脑环境上运行,步骤!!

    本文链接:https://blog.csdn.net/qq_39309900/article/details/84837659首先第一步,需要安装node.js 下载地址:https://nodejs ...

  3. java8学习之方法引用详解及默认方法分析

    方法引用: 之前花了很多时间对Lambda表达式进行了深入的学习,接下来开启新的主题---方法引用(Method References),其实在之前的学习中已经使用过了,如: 那方法引用跟Lambda ...

  4. python+Appium自动化:Appium-desktop界面简介

    Appium Desktop是一款适用于Mac,Windows和Linux的开源应用程序,提供了更加优化的图形界面. Appium Desktop是由Simple.Advanced.Presets三个 ...

  5. 初识LVS和LVS_NAT

    如果一台服务器承受过多的压力,那么服务可能会崩溃,所以,我们应该让一台服务器承受的压力在合理范围内,但是如果服务端必须要承受较大的压力,那么一台服务器可能无法满足我们的要求,所以我们可以使用多台服务器 ...

  6. 更改centos的网卡名

    Centos6更改网卡名的方法: 1.修改皮配置文件/etc/udev/rules.d/70-persistent-net.rules # This file was automatically ge ...

  7. mysqldump --tab=path参数使用

    [root@zstedu tmp]# chown -R mysql. /tmp/andyxi3306/ [root@zstedu tmp]# mysqldump -h127.0.0.1 -uroot ...

  8. 编译gpu集群版caffe

    在这个版本安装之前,要先装好opencv,openmpi等. 下载地址:https://github.com/yjxiong/caffe.git 我的opencv是2.4.12版本 编译是用了: cm ...

  9. Java-ConnectDB工具类

    import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; /** * 功能描述: ...

  10. 【ORACLE语句备份】数据库表同步 ——定时任务管理器(EXPDP导出,IMPDP导入)

    1.C:\Users\Administrator>sqlplus sys/xxx@xxx as sysdba; 2.SQL> create directory dbbak4 as 'e:\ ...