标签: isnull

为什么IsNull与coalesce(同一个查询)的速度慢两倍?

我们在SQL Server 2008(SP1) - 10.0.2531.0(X64) - Win2008 SP2(X64)上遇到了一个奇怪的情况.

这是一个重问题:

select t1.id, t2.id 
from t1, t2
where 
     t1.id = t2.ext_id
     and isnull(t1.vchCol1, 'Null') = isnull(t2.vchCol1, 'Null')
     and isnull(t1.vchCol2, 'Null') = isnull(t2.vchCol2, 'Null')
     .... and about 10 more comparisons with Isnull
Run Code Online (Sandbox Code Playgroud)

UPD:比较的所有列(ID除外)是varchar(~30 ... 200)
T1是~130mln行,T2是~300k行.

这些查询相当大的Dev服务器运行~5小时 - 这很慢,但我们能做什么?

虽然我们调查了可能的优化方法 - 我们发现,在上面的查询中将"isnull"更改为"coalesce"可以获得双倍的性能提升 - 并且查询现在可以运行~2小时

UPD:当我们删除所有ISNULL检查并使用时t1.vchCol1 = t2.vchCol1,查询在40分钟后完成.

问题是:这是已知行为,我们应该避免在任何地方使用IsNull吗?

performance isnull sql-server-2008

5
推荐指数
1
解决办法
5511
查看次数

5
推荐指数
3
解决办法
2万
查看次数

如何在参数化查询中使用IS NULL(Delphi)

我得到这样的陈述:

SELECT * From Table WHERE Feld IS NULL
SELECT * From Table WHERE Feld IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

现在我想知道如何参数化这个查询:

SELECT * From Table WHERE Feld IS :Value
Run Code Online (Sandbox Code Playgroud)

因为我不能将"NOT NULL"传递给参数,我认为这根本不可能 - 但也许有人知道解决方案吗?谢谢!

delphi parameters isnull

5
推荐指数
1
解决办法
1486
查看次数

如何检查字段是否包含空值? - pymongo

有时我的文档有一个具有空值的字段.

  • 如何检查字段内的值是否为空字符串?
  • 如果它具有空字符串值,如何遍历所有文档并删除文档的字段?
  • 我应该删除此文档的此字段,以便我可以执行此操作以查找空字段吗? for i in v7.find({"eng":{"$exist":True}})

我的文档结构的一个例子是这样的:

{ "_id" : ObjectId("50fd55c1161747668078fed6"), 
"dan" : "Hr. Hänsch repræsenterede Dem dér .", 
"deu" : "Der Kollege Hänsch hat Sie dort vertreten .", 
"eng" : "Mr Hänsch represented you on this occasion .", 
"fin" : "Kollega Hänsch edusti teitä siellä .", 
"ita" : "Il collega Hänsch è intervenuto in sua vece .", 
"md5" : "336b9cd1dc01ae0ff3344072d8db0295", 
"uid" : 2100986 }

{u'uid': 104, 
u'fre': u"Je crois que la pr\xe9vention est d' une importance capitale …
Run Code Online (Sandbox Code Playgroud)

null isnull mongodb pymongo

5
推荐指数
1
解决办法
3180
查看次数

如果发生NULL,则拒绝行的条款

理论问题......

当触发下面给出的一组查询时...

Create table Temp1(C1 varchar(2))
Create table Temp2(C1 varchar(2))
insert into Temp1 Values('A'),(NULL),('B')
insert into Temp2 Values('B'),(NULL),('C'),(NULL)

select *from Temp1 A,Temp2 B
where A.C1 <> B.C1
Run Code Online (Sandbox Code Playgroud)

...给...

实际结果

A.C1 <> B.C1Where条款中使用过.


但我希望......

在此输入图像描述

要获得预期结果作为输出,我需要ISNULL(A.C1,'') <> ISNULL(B.C1,'')在该Where子句中使用.

我的问题是为什么我需要ISNULL每次都按预期使用输出,因为NULL它不等于任何字符串数据.

sql sql-server null isnull sql-server-2008

5
推荐指数
1
解决办法
1214
查看次数

在子句不返回带有NULL字段的记录的地方使用ISNULL

表:

ID     AppType     AppSubType   Factor
1   SC  CD      1.0000000000
2   SC  CD      2.0000000000
3   SC  NULL    3.0000000000
4   SC  NULL    4.0000000000
Run Code Online (Sandbox Code Playgroud)

查询:

declare @ast varchar(10)

set @ast = null

select *
from tbl
where AppType = 'SC' and AppSubType = ISNULL(@ast, AppSubType)
Run Code Online (Sandbox Code Playgroud)

结果:

ID  AppType AppSubType  Factor
1   SC  CD  1.0000000000
2   SC  CD  2.0000000000
Run Code Online (Sandbox Code Playgroud)

题:

此查询不应该返回所有4条记录,而不仅仅是前2条吗?

sql isnull sql-server-2008

5
推荐指数
1
解决办法
3万
查看次数

SQL Server NULL整数到使用ISNULL的空字符串

我的好奇心总是得到我最好的满足,我在网上搜索了对此的解释,但一无所获(可能是因为我没有使用正确的术语。)

有人可以解释一下为什么执行以下命令时SQL Server返回零(0)而不是空字符串('')的原因。

    DECLARE @I AS INT
    SET @I = NULL
    SELECT ISNULL(@I, '') -- 0
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server string isnull

5
推荐指数
1
解决办法
6871
查看次数

不在Presto vs Spark SQL的实现中

我得到了一个非常简单的查询,当在同一硬件上运行Spark SQL和Presto时(3小时vs 3分钟),显示出显着的性能差异。

SELECT field 
FROM test1 
WHERE field NOT IN (SELECT field FROM test2)
Run Code Online (Sandbox Code Playgroud)

经过对查询计划的研究,我发现原因是Spark SQL如何处理NOT IN谓词子查询。为了正确处理NOT IN的NULL,Spark SQL将NOT IN谓词转换为Left AntiJoin( (test1=test2) OR isNULL(test1=test2))

Spark SQL引入OR isNULL(test1=test2)了确保的正确语义NOT IN

但是,ORLeft AntiJoin连接谓词的唯一可行的物理连接策略Left AntiJoinBroadcastNestedLoopJoin。在当前阶段,我可以将NOT IN改写为NOT EXISTS来解决此问题。在NOT EXISTS的查询计划中,我可以看到join谓词是Left AntiJoin(test1=test2)为NOT EXISTS(5分钟完成)导致更好的物理联接运算符的原因。

到目前为止,我很幸运,因为我的数据集当前没有任何NULL属性,但是将来可能会具有,而NOT IN的语义正是我真正想要的。

所以我检查了Presto的查询计划,它没有真正提供,Left AntiJoinSemiJoin与一起使用FilterPredicate = not (expr)。Presto的查询计划没有提供太多信息,例如Spark。

所以我的问题更像是:

我可以假设Presto有更好的物理联接运算符来处理NOT IN操作吗?与Spark SQL不同,它不依赖于连接谓词的重写isnull(op1 = op2)来确保逻辑计划级别中NOT …

null isnull presto apache-spark-sql

5
推荐指数
1
解决办法
119
查看次数

SQLite中的空替换:

在Sybase和MSSqlServer TransactSQL中,我们有一个函数IsNull(columnName,valueForNull),当列值为null时返回一个类型化的默认值.如何在SQLite中复制此功能?

TransactSQL中的示例:

select IsNull(MyColumn,-1) as MyColumn from MyTable
Run Code Online (Sandbox Code Playgroud)

如果MyColumn为null,则此表达式将返回-1作为MyColumn的值.想在SQLite中做类似的事情.

(是的,我知道我可以编写自己的包装函数来处理这个 - 这不是我正在寻找的答案)

TIA

t-sql sqlite null isnull

4
推荐指数
2
解决办法
4079
查看次数

如何在 SQL 中选择没有空值的行(在任何列中)?

我有一张桌子叫table1

它有 100 列:{ col1, col2, ..., col100}

我了解如何在特定列中SELECT包含空值的行,例如:col1

SELECT *
FROM table1
WHERE col1 IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

如何处理任何列中不包含空值的SELECT 所有行

试图

SELECT *
FROM table1
WHERE * IS NOT NULL
Run Code Online (Sandbox Code Playgroud)

但这会返回一个错误MySQL(我正在使用)

mysql sql isnull

4
推荐指数
1
解决办法
2万
查看次数