i****a 发帖数: 36252 | 1 SQL Server 2012
select a / b
from table
Error: Divide by zero error encountered
select a / b
, row_number() over (order by ID)
from table
no error
why??? |
c****s 发帖数: 10 | |
s**********o 发帖数: 14359 | |
c*****d 发帖数: 6045 | 4 估计是有人已经删除了0的记录
结论:
1。当被除数为0时“Divide by zero error encountered.”
2。在ORACLE和SQL Server中,(any number)/null结果都为NULL
试验
select @@version
-----------------------------------------------------------------
Microsoft SQL Server 2012 - 11.0.5343.0 (X64)
May 4 2015 19:11:32
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 (Build 7601: Service
Pack 1) (Hypervisor)
create table demo (id int, a int, b int)
insert into demo values(1,1,1)
insert into demo values(2,2,0)
insert into demo (id, a) values(3,3)
case 1:
select A/B, row_number() over (order by ID)
from demo
where id=1
----------- --------------------
1 1
case 2:
select A/B, row_number() over (order by ID)
from demo
where id=2
----------- --------------------
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
case 3:
select A/B, row_number() over (order by ID)
from demo
where id=3
----------- --------------------
NULL 1 |
i****a 发帖数: 36252 | 5 update my post.
select a / b
from table
where x = y
I've found the reason:
even if the result with the where clause has no zero value problem, sql
optimizer is doing a / b for all records and then filter it down to where x
= y.
When I add the row_number function, optimizer execute the query with
filtering it down to x = y first. |
c*****d 发帖数: 6045 | 6 你的解释不对,肯定不是先对所有行做a/b然后filter
用我上面的表和数据
select A/B
from demo
where 1=0
-----------
(0 row(s) affected)
按你的解释,即便这个sql不返回结果,因为在数据中有2/0,也要报错?
实验结果是不报错
select A/B
from demo
where id<2
-----------
1
(1 row(s) affected)
同样道理,不是先scan所有记录做A/B,然后再filter,那简直太傻瓜了
x
【在 i****a 的大作中提到】 : update my post. : select a / b : from table : where x = y : I've found the reason: : even if the result with the where clause has no zero value problem, sql : optimizer is doing a / b for all records and then filter it down to where x : = y. : When I add the row_number function, optimizer execute the query with : filtering it down to x = y first.
|
i****a 发帖数: 36252 | 7 数据大的话, optimizer 如果认为更高效, 可以选择先对所有行做a/b.
我可以在我的数据库反复重现这结果. 刚刚才想起去看看 execution plan. 证明了这
个说法.
附件. 上面那个没有ROW_NUMBER, 下面有ROW_NUMBER. Compute Scalar 就是计算 a /
b.
【在 c*****d 的大作中提到】 : 你的解释不对,肯定不是先对所有行做a/b然后filter : 用我上面的表和数据 : select A/B : from demo : where 1=0 : ----------- : (0 row(s) affected) : 按你的解释,即便这个sql不返回结果,因为在数据中有2/0,也要报错? : 实验结果是不报错 : select A/B
|
c*****d 发帖数: 6045 | 8 index是在哪个字段上?
另外你的x=y是x column = y column,还是x column = y value
我试了几个case,也确认了exec plan在使用索引
但是并没有出现zero divided的问题
create clustered index on (id,a,b)
create clustered index on (a,b) |
i****a 发帖数: 36252 | 9 what if you join with another table?
【在 c*****d 的大作中提到】 : index是在哪个字段上? : 另外你的x=y是x column = y column,还是x column = y value : 我试了几个case,也确认了exec plan在使用索引 : 但是并没有出现zero divided的问题 : create clustered index on (id,a,b) : create clustered index on (a,b)
|
B*****g 发帖数: 34098 | 10 shame on M$
加个hint看行不行?
/
【在 i****a 的大作中提到】 : 数据大的话, optimizer 如果认为更高效, 可以选择先对所有行做a/b. : 我可以在我的数据库反复重现这结果. 刚刚才想起去看看 execution plan. 证明了这 : 个说法. : 附件. 上面那个没有ROW_NUMBER, 下面有ROW_NUMBER. Compute Scalar 就是计算 a / : b.
|
|
|
c*****d 发帖数: 6045 | 11 实验了,还是无法复制出这个问题
你能一次把你的case说明白吗?
哪几个表,哪个字段有0,index在哪几个字段上
语句中x=y是字段x = 字段y ?
【在 i****a 的大作中提到】 : what if you join with another table?
|
c*****d 发帖数: 6045 | 12 虽然我教比软软的数据库nb很多
但是也不能这么瞎黑软软
这个query根本没法加hint
你说在oracle里怎么加hint能跳过predicate直接先对全表处理
类似select 2*id from table where id=1
把全部的id都double一遍之后再看谁符合条件
【在 B*****g 的大作中提到】 : shame on M$ : 加个hint看行不行? : : /
|
B*****g 发帖数: 34098 | 13 会不会是fetch多少records的问题?
2个query都套上count,看第二个会不会error
【在 c*****d 的大作中提到】 : 虽然我教比软软的数据库nb很多 : 但是也不能这么瞎黑软软 : 这个query根本没法加hint : 你说在oracle里怎么加hint能跳过predicate直接先对全表处理 : 类似select 2*id from table where id=1 : 把全部的id都double一遍之后再看谁符合条件
|
i****a 发帖数: 36252 | 14 SELECT p.product_id
, pp.price / pp.regular_price
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
SELECT p.product_id
, pp.price / pp.regular_price
, ROW_NUMBER() OVER(ORDER BY p.product_id) AS RowNum
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
productprice 表, regular_price有零, 但 inner join p.type = 1 的结果是没有零的
【在 c*****d 的大作中提到】 : 实验了,还是无法复制出这个问题 : 你能一次把你的case说明白吗? : 哪几个表,哪个字段有0,index在哪几个字段上 : 语句中x=y是字段x = 字段y ?
|
c*****d 发帖数: 6045 | 15 create table dbo.product
(product_id int, name varchar(20), type int)
create table dbo.productprice
(product_id int, price int, regular_price int)
insert into dbo.product values(1,'a',1)
insert into dbo.product values(2,'b',2)
insert into dbo.productprice values(1,1,1)
insert into dbo.productprice values(2,2,0)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected) |
c*****d 发帖数: 6045 | 16 create index ind_p on dbo.product (product_id)
create index ind_pp on dbo.productprice (product_id)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected) |
c*****d 发帖数: 6045 | 17 drop index ind_p on dbo.product
drop index ind_pp on dbo.productprice
create index ind_p on dbo.product (product_id,type)
create index ind_pp on dbo.productprice(product_id,price,regular_price)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected) |
c*****d 发帖数: 6045 | 18 drop index ind_p on dbo.product
drop index ind_pp on dbo.productprice
create index ind_p on dbo.product (type)
create index ind_pp on dbo.productprice (price,regular_price)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected) |
i****a 发帖数: 36252 | 19 也顷□痗q的问题. 你看我贴的 execution plan 就是这两个 query 的
【在 c*****d 的大作中提到】 : drop index ind_p on dbo.product : drop index ind_pp on dbo.productprice : create index ind_p on dbo.product (type) : create index ind_pp on dbo.productprice (price,regular_price) : SELECT p.product_id, pp.price / pp.regular_price discount : FROM product p : INNER JOIN productprice pp ON pp.product_id = p.product_id : WHERE p.type = 1 : product_id discount : ----------- -----------
|
i****a 发帖数: 36252 | 20 SQL Server 2012
select a / b
from table
where x = y
Error: Divide by zero error encountered
select a / b
, row_number() over (order by ID)
from table
where x = y
no error
why??? |
|
|
c****s 发帖数: 10 | |
s**********o 发帖数: 14359 | |
c*****d 发帖数: 6045 | 23 估计是有人已经删除了0的记录
结论:
1。当被除数为0时“Divide by zero error encountered.”
2。在ORACLE和SQL Server中,(any number)/null结果都为NULL
试验
select @@version
-----------------------------------------------------------------
Microsoft SQL Server 2012 - 11.0.5343.0 (X64)
May 4 2015 19:11:32
Copyright (c) Microsoft Corporation
Standard Edition (64-bit) on Windows NT 6.1 (Build 7601: Service
Pack 1) (Hypervisor)
create table demo (id int, a int, b int)
insert into demo values(1,1,1)
insert into demo values(2,2,0)
insert into demo (id, a) values(3,3)
case 1:
select A/B, row_number() over (order by ID)
from demo
where id=1
----------- --------------------
1 1
case 2:
select A/B, row_number() over (order by ID)
from demo
where id=2
----------- --------------------
Msg 8134, Level 16, State 1, Line 1
Divide by zero error encountered.
case 3:
select A/B, row_number() over (order by ID)
from demo
where id=3
----------- --------------------
NULL 1 |
i****a 发帖数: 36252 | 24 update my post.
select a / b
from table
where x = y
I've found the reason:
even if the result with the where clause has no zero value problem, sql
optimizer is doing a / b for all records and then filter it down to where x
= y.
When I add the row_number function, optimizer execute the query with
filtering it down to x = y first. |
c*****d 发帖数: 6045 | 25 你的解释不对,肯定不是先对所有行做a/b然后filter
用我上面的表和数据
select A/B
from demo
where 1=0
-----------
(0 row(s) affected)
按你的解释,即便这个sql不返回结果,因为在数据中有2/0,也要报错?
实验结果是不报错
select A/B
from demo
where id<2
-----------
1
(1 row(s) affected)
同样道理,不是先scan所有记录做A/B,然后再filter,那简直太傻瓜了
x
【在 i****a 的大作中提到】 : update my post. : select a / b : from table : where x = y : I've found the reason: : even if the result with the where clause has no zero value problem, sql : optimizer is doing a / b for all records and then filter it down to where x : = y. : When I add the row_number function, optimizer execute the query with : filtering it down to x = y first.
|
i****a 发帖数: 36252 | 26 数据大的话, optimizer 如果认为更高效, 可以选择先对所有行做a/b.
我可以在我的数据库反复重现这结果. 刚刚才想起去看看 execution plan. 证明了这
个说法.
附件. 上面那个没有ROW_NUMBER, 下面有ROW_NUMBER. Compute Scalar 就是计算 a /
b.
【在 c*****d 的大作中提到】 : 你的解释不对,肯定不是先对所有行做a/b然后filter : 用我上面的表和数据 : select A/B : from demo : where 1=0 : ----------- : (0 row(s) affected) : 按你的解释,即便这个sql不返回结果,因为在数据中有2/0,也要报错? : 实验结果是不报错 : select A/B
|
c*****d 发帖数: 6045 | 27 index是在哪个字段上?
另外你的x=y是x column = y column,还是x column = y value
我试了几个case,也确认了exec plan在使用索引
但是并没有出现zero divided的问题
create clustered index on (id,a,b)
create clustered index on (a,b) |
i****a 发帖数: 36252 | 28 what if you join with another table?
【在 c*****d 的大作中提到】 : index是在哪个字段上? : 另外你的x=y是x column = y column,还是x column = y value : 我试了几个case,也确认了exec plan在使用索引 : 但是并没有出现zero divided的问题 : create clustered index on (id,a,b) : create clustered index on (a,b)
|
B*****g 发帖数: 34098 | 29 shame on M$
加个hint看行不行?
/
【在 i****a 的大作中提到】 : 数据大的话, optimizer 如果认为更高效, 可以选择先对所有行做a/b. : 我可以在我的数据库反复重现这结果. 刚刚才想起去看看 execution plan. 证明了这 : 个说法. : 附件. 上面那个没有ROW_NUMBER, 下面有ROW_NUMBER. Compute Scalar 就是计算 a / : b.
|
c*****d 发帖数: 6045 | 30 实验了,还是无法复制出这个问题
你能一次把你的case说明白吗?
哪几个表,哪个字段有0,index在哪几个字段上
语句中x=y是字段x = 字段y ?
【在 i****a 的大作中提到】 : what if you join with another table?
|
|
|
c*****d 发帖数: 6045 | 31 虽然我教比软软的数据库nb很多
但是也不能这么瞎黑软软
这个query根本没法加hint
你说在oracle里怎么加hint能跳过predicate直接先对全表处理
类似select 2*id from table where id=1
把全部的id都double一遍之后再看谁符合条件
【在 B*****g 的大作中提到】 : shame on M$ : 加个hint看行不行? : : /
|
B*****g 发帖数: 34098 | 32 会不会是fetch多少records的问题?
2个query都套上count,看第二个会不会error
【在 c*****d 的大作中提到】 : 虽然我教比软软的数据库nb很多 : 但是也不能这么瞎黑软软 : 这个query根本没法加hint : 你说在oracle里怎么加hint能跳过predicate直接先对全表处理 : 类似select 2*id from table where id=1 : 把全部的id都double一遍之后再看谁符合条件
|
i****a 发帖数: 36252 | 33 SELECT p.product_id
, pp.price / pp.regular_price
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
SELECT p.product_id
, pp.price / pp.regular_price
, ROW_NUMBER() OVER(ORDER BY p.product_id) AS RowNum
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
productprice 表, regular_price有零, 但 inner join p.type = 1 的结果是没有零的
【在 c*****d 的大作中提到】 : 实验了,还是无法复制出这个问题 : 你能一次把你的case说明白吗? : 哪几个表,哪个字段有0,index在哪几个字段上 : 语句中x=y是字段x = 字段y ?
|
c*****d 发帖数: 6045 | 34 create table dbo.product
(product_id int, name varchar(20), type int)
create table dbo.productprice
(product_id int, price int, regular_price int)
insert into dbo.product values(1,'a',1)
insert into dbo.product values(2,'b',2)
insert into dbo.productprice values(1,1,1)
insert into dbo.productprice values(2,2,0)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected) |
c*****d 发帖数: 6045 | 35 create index ind_p on dbo.product (product_id)
create index ind_pp on dbo.productprice (product_id)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected) |
c*****d 发帖数: 6045 | 36 drop index ind_p on dbo.product
drop index ind_pp on dbo.productprice
create index ind_p on dbo.product (product_id,type)
create index ind_pp on dbo.productprice(product_id,price,regular_price)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected) |
c*****d 发帖数: 6045 | 37 drop index ind_p on dbo.product
drop index ind_pp on dbo.productprice
create index ind_p on dbo.product (type)
create index ind_pp on dbo.productprice (price,regular_price)
SELECT p.product_id, pp.price / pp.regular_price discount
FROM product p
INNER JOIN productprice pp ON pp.product_id = p.product_id
WHERE p.type = 1
product_id discount
----------- -----------
1 1
(1 row(s) affected) |
i****a 发帖数: 36252 | 38 也顷□痗q的问题. 你看我贴的 execution plan 就是这两个 query 的
【在 c*****d 的大作中提到】 : drop index ind_p on dbo.product : drop index ind_pp on dbo.productprice : create index ind_p on dbo.product (type) : create index ind_pp on dbo.productprice (price,regular_price) : SELECT p.product_id, pp.price / pp.regular_price discount : FROM product p : INNER JOIN productprice pp ON pp.product_id = p.product_id : WHERE p.type = 1 : product_id discount : ----------- -----------
|
j*r 发帖数: 17 | 39 我碰到这种问题,都给分母加个数,比如
a/(b+0.00000001) |