gpt4 book ai didi

sql-server - 将 BIT 列与 0 而不是 1 进行比较时,查询速度会慢几倍

转载 作者:行者123 更新时间:2023-12-02 01:23:12 25 4
gpt4 key购买 nike

我使用基于具有 17 个连接(内部连接和左/右外部连接)和子查询的复杂查询的 View 。所有 View 行将在大约 5 秒内显示。

SELECT * FROM a_view;

View 列之一的类型为 BIT。当我过滤 View 行并将其与 1 进行比较时,查询会再次运行大约 5 秒。

SELECT * FROM a_view WHERE c = 1;

但是当我将此 BIT 列与 0 进行比较时,查询大约需要 50 秒(慢 10 倍)。

SELECT * FROM a_view WHERE c = 0;

此查询返回相同的结果行,按预期工作大约 10 秒:

SELECT * FROM a_view 
EXCEPT
SELECT * FROM a_view WHERE c = 1;

所以我想知道为什么与 0 或 'FALSE' 比较需要这么多时间?有什么想法请提出来。

在此 BIT 字段上排序速度很快。按其他列过滤也很快。

最佳答案

我知道这是一个非常古老的问题,但如果有人仍在寻找解决方案,您可以尝试这个。我最近遇到了同样的问题,这是一个相对简单的查询,只有 3 个表在一个连接中,其中最大的只有 1000 多行。不幸的是,我没有查看执行计划的权限,所以我不得不即兴发挥。

select * from subquery_x;

非常快,基本上立即完成(仅返回大约 500 行),正如它应该的那样

select * from subquery_x where column_x = 1  

dtto,非常快,column_x是一个非空位列

select * from subquery_x where column_x = 0
select * from subquery_x where column_x != 1

应该返回大约 300 行,两者都非常非常慢,实际上花了几分钟!!

简单(但奇怪)的解决方案 - 将where子句中的列转换为tinyint

select * from subquery_x where convert(tinyint,column_x) = 0

我知道这可能会对性能产生一些副作用,但它的工作方式就像一个魅力,将转换后的列值与 1 进行比较也非常快,所以我就这样(它在提供比较值的报告中使用)作为参数)

如果有人知道为什么会发生这种情况,请告诉我们,我怀疑这是一个错误,但谁知道呢,也可能是一个令人讨厌的功能:-)

关于sql-server - 将 BIT 列与 0 而不是 1 进行比较时,查询速度会慢几倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/468641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com