SELECT * 测试
描述
大家通常禁止在生产环境直接使用select * 已成常识了,也常常在开发规范中就会规定不允许直接使用select *,那么我们为什么不允许使用select * ,在一些什么场景下select * 会出问题?能否控制不能直接使用select *?出于这些疑问,我们特别测试记录一下。
测试环境
select * 可能会造成业务功能出错
CREATE VIEW v_test
AS
SELECT *
FROM test
SELECT *
FROM v_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 *
--新建测试表
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);

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


SELECT * 测试的更多相关文章
- Mybatis-Plus 实战完整学习笔记(七)------select测试二
1.查询selectOne (3.0.3版) @Test public void selectMethod() throws SQLException { // 根据ID获取一个对象的数据 Empl ...
- Mybatis-Plus 实战完整学习笔记(六)------select测试一
查询方法(3.0.3) 1.查询一个员工的数据 @Test public void selectMethod() throws SQLException { // 根据ID获取一个对象的数据 Empl ...
- sysbench 压力测试
200 ? "200px" : this.width)!important;} --> 介绍 sysbench是一个模块化.跨平台.多线程基准测试工具,主要用于测试不同系统参 ...
- (十二)select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET
select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型:int select(int maxfd,fd_set *rdset ...
- 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函数用于在非阻塞中 ...
- Hibernate框架的基本搭建(一个小的java project的测试向数据库中插入和查询数据的功能)
Hibernate介绍:Hibernate是一种“对象-关系型数据映射组件”,它使用映射文件将对象(object)与关系型数据(Relational)相关联,在Hibernate中映射文件通常以&qu ...
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET(转)
select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型, 原型: int select(int maxfd,fd_set *rds ...
- sysbench 0.5 oltp测试笔记
sysbench 0.5相比0.4版本的主要变化是,oltp测试结合了lua脚本,不需要修改源码,通过自定义lua脚本就可以实现不同业务类型的测试.同时0.5相比0.4需要消耗更多的cpu资源. 1. ...
- select()函数以及FD_ZERO、FD_SET、FD_CLR、FD_ISSET (转)
select函数用于在非阻塞中,当一个套接字或一组套接字有信号时通知你,系统提供select函数来实现多路复用输入/输出模型,原型: #include <sys/time.h> ...
随机推荐
- golang 系列学习(-) 数据类型
数据类型的出现 在的编程语言中,数据类型用于声明函数和变量,数据类型的出现是为了要把数据分成数据所需要内存大小的不同数据,编程时需要什么样的内存就申请什么样的内存.就可以充分的利用内存,更好的霸控程序 ...
- Docuemnt 的 NamespaceURI为空问题
创建doc的方式不同,需要增加 DocumentBuilderFactory.setNamespaceAware(true); 这样Element Node.getNamespaceURI 才不为空 ...
- Nginx概念
这篇文章只是单纯的介绍nginx以及一些相关概念,有的概念在实际应用中不会用到,不理解也没有关系,这不影响我们学习nginx. Nginx是什么 如果你知道http协议和httpd是什么,那你就会容易 ...
- java虚拟机的基本结构如图
1 java虚拟机的基本结构如图: 1)类加载子系统负责从文件系统或者网络中加载Class信息,加载的类信息存放于一块称为方法区的内存空间.除了类的信息外,方法区中可能还会存放运行时常量池信息,包括字 ...
- Nginx location模块整理
location模块 Nginx location location 指令的作用是根据用户请求的URI来执行不同的应用,URI就是根据用户请求到的网址URL进行匹配,匹配成功了进行相关的操作. loc ...
- HDU 6034 - Balala Power! | 2017 Multi-University Training Contest 1
/* HDU 6034 - Balala Power! [ 大数进位,贪心 ] 题意: 给一组字符串(小写英文字母),将上面的字符串考虑成26进制数,每个字母分配一个权值,问这组数字加起来的和最大是多 ...
- SpringBoot AOP介绍
说起spring,我们知道其最核心的两个功能就是AOP(面向切面)和IOC(控制反转),这边文章来总结一下SpringBoot如何整合使用AOP. 一.示例应用场景:对所有的web请求做切面来记录日志 ...
- 【leetcode】1276. Number of Burgers with No Waste of Ingredients
题目如下: Given two integers tomatoSlices and cheeseSlices. The ingredients of different burgers are as ...
- JavaScript关系运算符
★关系运算符 通过关系运算符可以比较两个值之间的大小关系 如果关系成立它会返回true,如果关系不成立立即返回false ㈠大于号 (>) ⑴判断符号左侧的值是否大于右侧的值 ⑵如果关系成立 ...
- isset和empty以及is_null区别
2.empty,isset首先都会检查变量是否存在,然后对变量值进行检测.而is_null 和 “参数本身”只是直接检查变量值,是否为null,因此如果变量未定义就会出现错误! 3.isset():仅 ...