我见过很多人声称你应该在选择查询中专门命名你想要的每一列.
假设我要使用所有列,为什么我不使用SELECT *?
即使考虑问题*SQL查询 - 从视图中选择*或从视图*选择col1,col2,... colN,我不认为这是完全重复的,因为我从一个略微不同的角度来看待问题.
我们的原则之一是不要在它之前进行优化.考虑到这一点,似乎使用SELECT *应该是首选方法,直到它被证明是一个资源问题或模式几乎是一成不变的.据我们所知,在开发完成之前不会发生这种情况.
那就是说,不使用是否有一个压倒一切的问题SELECT *?
为一篇冗长的帖子道歉,但我需要发布一些代码来说明问题.
灵感来自问题*什么是不使用选择的原因?,我决定指出一些我之前注意到的select*行为的观察结果.
让我们的代码说明一切:
IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[starTest]') AND type in (N'U'))
DROP TABLE [dbo].[starTest]
CREATE TABLE [dbo].[starTest](
[id] [int] IDENTITY(1,1) NOT NULL,
[A] [varchar](50) NULL,
[B] [varchar](50) NULL,
[C] [varchar](50) NULL
) ON [PRIMARY]
GO
insert into dbo.starTest(a,b,c)
select 'a1','b1','c1'
union all select 'a2','b2','c2'
union all select 'a3','b3','c3'
go
IF EXISTS (SELECT * FROM sys.views WHERE object_id = OBJECT_ID(N'[dbo].[vStartest]'))
DROP VIEW [dbo].[vStartest]
go
create view dbo.vStartest as
select * from dbo.starTest …Run Code Online (Sandbox Code Playgroud) 我正在创建基准表来测量我们的Netezza盒子上的每小时负载(查询延迟,查询持续时间).我对表中想要的行数有了一个很好的了解,我正在尝试确定列的数量.没有索引; 我将运行全表扫描.
我正在尝试确定基准表中需要多少列,并且有以下问题:列数(及其类型)将如何影响计数(*)查询的性能.我最初的想法是,具有更多列的表将分布在更多磁盘块上.因此,系统将不得不进行更多磁盘搜索,从而导致更长的查询.
当我在Netezza工作时,我也欢迎与其他系统相关的答案(MySql,Postgres,Vertica等)以帮助我理解.
关于列数对查询性能的影响,已经有几个讨论(Q1,Q2,Q3).这些问题讨论的是通用查询,而不是没有索引的全表扫描.因此,单独的问题.