SQL中的计算列的问题

amingo 2009-10-13 01:36:04
表tab中有列A B C都为int ,其中C为计算列C=A+B
问题1:
计算列和使用视图有区别吗? 如:
create view v1
select A,B,A+B AS C from tab

问题2:
计算列中的值的计算时机是在什么时候?是在修改列的时候,select取数的时候,或是有轮询机制?
...全文
199 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
xman_78tom 2009-10-13
  • 打赏
  • 举报
回复
计算列的值是由表达式计算得来,该表达式可以引用常量、变量、函数和表中其他列,但表达式不能是子查询。计算列是虚拟列,其值是在查询执行期间动态生成。
计算列上不能设置 DEFAULT、FOREIGN KEY、NOT NULL 约束(如果计算列表达式发生溢出错误,会导致计算列的值为 NULL);如果计算列表达式不是确定的,则不能在计算列上设置 PRIMARY KEY 和 UNIQUE 约束以及索引。在 INSERT、UPDATE 语句中不能为计算列赋值。
在 SQL SERVER 2K5 中,可以为计算列指定 PERSISTED 选项,将计算列的值实际存储在表中。可以在指定了 PERSISTED 选项的计算列上设置 CHECK、FOREIGN KEY、NOT NULL 约束;可以在指定了 PERSISTED 选项的具有确定但不精确表达式的计算列上设置 UNIQUE、PRIMARY KEY 约束和索引。
SQL77 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 guguda2008 的回复:]
我也一直想问计算列的问题,对计算列的运行机制不大懂
[/Quote]
鸭鸭,研究下执行计划,整出来,发博客,
guguda2008 2009-10-13
  • 打赏
  • 举报
回复
我也一直想问计算列的问题,对计算列的运行机制不大懂
SQL77 2009-10-13
  • 打赏
  • 举报
回复
视图效率好,
ws_hgo 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 amingo 的回复:]
sql版比asp.net版有素质
[/Quote]
amingo 2009-10-13
  • 打赏
  • 举报
回复
sql版比asp.net版有素质
dawugui 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 amingo 的回复:]
表tab中有列A B C都为int ,其中C为计算列C=A+B
问题1:
计算列和使用视图有区别吗? 如:
create view v1
select A,B,A+B AS C from tab

问题2:
计算列中的值的计算时机是在什么时候?是在修改列的时候,select取数的时候,或是有轮询机制?

[/Quote]
是你在用到视图的时候才会更改.
zc_0101 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 sgtzzc 的回复:]
引用 11 楼 zc_0101 的回复:
引用楼主 amingo 的回复:
表tab中有列A B C都为int ,其中C为计算列C=A+B

一个表中可以自带计算列?


可以

create table tb
(
  a int,
  b int,
  c as a+b  --计算列
)
[/Quote]

汗一个,我竟然没遇到过,谢谢了
sgtzzc 2009-10-13
  • 打赏
  • 举报
回复
create table tb(a int,b int,c int)
go

set nocount on
declare @i int,@j int;
set @i=1;
while (@i<=1000)
begin
set @j=1;
while @j<1000
begin
insert tb select @i,@j,0
set @j=@j+1
end
set @i=@i+1
end
go
set nocount off

select a,b,a+b as c from tb
--执行查询计划
--------------------------------------
SELECT 计算标量 表扫描
开销:0% 开销:3% 97%

alter table tb drop column c
alter table tb add c as a+b

select a,b,c from tb
--执行查询计划
--------------------------------------
SELECT 计算标量 计算标量 表扫描
开销:0% 开销:3% 开销:3% 94%


drop table tb

这样看来,貌似用计算列会计算两次
楼主可以自己测试一下,比较一下速度,如果相差不明显,还可以加大数据量
xiequan2 2009-10-13
  • 打赏
  • 举报
回复


create table ta(A int,B int)

create view testAB
As
select A,B, A+B as C from ta



create table tb(A int,B int, C as A+B) --计算列


下面是这两个的执行计划
StmtText
-----------------------------

select * from tb --计算列

(1 行受影响)

StmtText
--------------------------------------------------------------------------------------------------------
|--Compute Scalar(DEFINE:([test1].[dbo].[tb].[C]=[test1].[dbo].[tb].[C]))
|--Compute Scalar(DEFINE:([test1].[dbo].[tb].[C]=[test1].[dbo].[tb].[A]+[test1].[dbo].[tb].[B]))
|--Table Scan(OBJECT:([test1].[dbo].[tb]))

(3 行受影响)

StmtText
------------------------------

select * from testAB --从视图中取

(1 行受影响)

StmtText
---------------------------------------------------------------------------------------
|--Compute Scalar(DEFINE:([Expr1004]=[test1].[dbo].[ta].[A]+[test1].[dbo].[ta].[B]))
|--Table Scan(OBJECT:([test1].[dbo].[ta]))

(2 行受影响)





1:结果上没有什么区别
2:计算列中的列的计算时机在select 的时候

补充:从执行计划来看,视图和计算列都是在select 的时候计算;视图的效率好像高一点,而计算列多了一步Compute Scalar
-狙击手- 2009-10-13
  • 打赏
  • 举报
回复
...
sgtzzc 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 zc_0101 的回复:]
引用楼主 amingo 的回复:
表tab中有列A B C都为int ,其中C为计算列C=A+B

一个表中可以自带计算列?
[/Quote]

可以

create table tb
(
a int,
b int,
c as a+b --计算列
)
jenny0810 2009-10-13
  • 打赏
  • 举报
回复
学习
zc_0101 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 amingo 的回复:]
表tab中有列A B C都为int ,其中C为计算列C=A+B
[/Quote]
一个表中可以自带计算列?
--小F-- 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 amingo 的回复:]
引用 3 楼 fredrickhu 的回复:
2.可以去看看执行计划 应该在select之前就做了A+B的操作


怎么看? 如果列的计算,需要和getdate()交互,那么需要轮询吗?
[/Quote]
CTRL+L
ws_hgo 2009-10-13
  • 打赏
  • 举报
回复
视图就是
对表进行处理的结果集
也可以说是新的表
palosky 2009-10-13
  • 打赏
  • 举报
回复
得到的结果是一样的 不过在视图里处理可以提高效率 方便增删改查等操作
ws_hgo 2009-10-13
  • 打赏
  • 举报
回复
你看执行计划
amingo 2009-10-13
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 fredrickhu 的回复:]
2.可以去看看执行计划 应该在select之前就做了A+B的操作
[/Quote]

怎么看? 如果列的计算,需要和getdate()交互,那么需要轮询吗?
ws_hgo 2009-10-13
  • 打赏
  • 举报
回复
create table #AA
(
A int,
B int
)
insert into #AA select 1,2
insert into #AA select 12,22
insert into #AA select 31,21
insert into #AA select 13,22

select A,B,A+B C from #AA

是先表扫描,然后计算
加载更多回复(4)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧