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> ...
随机推荐
- [AWS - EC2]如何使用 PuTTY 连接到 Amazon Linux 2 实例。How to Connect Amazon Linux 2 Instance from Windows Using PuTTY
1. 下载 PuTTY 2. 安装到任意目录 3. 打开 PuTTYgen (注意不是 PuTTY), 如图: 选择 RSA , 点击 Load. 找到从 AWS 创建实例的时候生成的 key,要选择 ...
- linux中centos6.9环境下的python3.6和pip的安装
安装python3.6可能使用的依赖# yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqli ...
- git生成公钥public key并添加SSH key。git乌龟gerrit下推送git【server sent :publickey】
一.key 码云链接:http://git.mydoc.io/?t=180845#text_180845 博客链接: 方式一:https://blog.csdn.net/xb12369/article ...
- ValueError: Only call `softmax_cross_entropy_with_logits` with named arguments (labels=..., logits=..., ...)
tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=predicton,labels=y))
- Redis 安装 与 使用
下载Redis压缩包.地址:https://github.com/MicrosoftArchive/redis/releases 下载完成后,双击运行安装程序. 点击 Next . 点击 Next 等 ...
- nginx静态资源服务
静态文件 动态文件 需要算法,函数封装后,返回给浏览器端的 静态资源的服务场景----CDN 异步I/O-----效果不明显 tcp_nopush 注意,须在sendfile开启的前提下 技术思想: ...
- SpringMVC之RequestContextHolder分析(转)
链接:https://blog.csdn.net/zzy7075/article/details/53559902
- css实现翻面效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- idea设置数据库连接所有项目都能看到
首先打来配置好数据库的项目,打开database视图,点击配置. 点击 Project Data Soures 下配置好的数据库,然后点击 Make Global ,然后就可以在其他项目看到该数据库连 ...
- PC监听鼠标和键盘事件,定时无响应退出
直接上代码: window.onload = function () { initScreenSaver(); } //0912 add function ScreenSaver(settings){ ...