gpt4 book ai didi

sql - SQL IN 对性能有影响吗?

转载 作者:行者123 更新时间:2023-12-03 05:41:48 24 4
gpt4 key购买 nike

我有一个查询,执行以下操作:

SELECT FieldX, FieldY FROM A
WHERE FieldW IN (108, 109, 113, 138, 146, 160,
307, 314, 370, 371, 441, 454 ,457, 458, 479, 480,
485, 488, 490, 492, 519, 523, 525, 534, 539, 543,
546, 547, 550, 564, 573, 629, 642, 643, 649, 650,
651, 694, 698, 699, 761, 762, 768, 772, 773, 774,
775, 778, 784, 843, 844, 848, 851, 852, 853, 854,
855, 856, 857, 858, 859, 860, 861, 862, 863, 864,
865, 868, 869, 871, 872, 873, 891)

IN 子句有如此多的选项,是否会影响查询性能?我在我的应用程序中遇到了很多超时,我相信这可能是此类问题的根源。我可以使用任何好的 SQL 提示来优化查询而不删除数字吗?

编辑:

@KM 这些是不同表中的键。这是一个论坛应用程序,简单解释一下:c#从数据库获取所有论坛并将其存储在应用程序缓存中。在 C# 调用获取这些论坛和该用户的线程的过程之前,C# 会考虑权限和一些业务逻辑,对“所有论坛”集合进行一些逻辑过滤。超时发生在数据库上,而不是应用程序本身。在查询上执行所有这些逻辑将需要大量内部联接,并且我不能 100% 确定我可以在过程中完成所有这些操作。

我使用的是SQL Server 2000

最佳答案

使用 IN 运算符编写查询时有几个注意事项可能会影响性能。

首先,大多数数据库通常会在内部重写 IN 子句以使用 OR 逻辑连接词。因此 col IN ('a','b','c') 被重写为:(COL = 'a') OR (COL = 'b') or (COL = 'c')。假设您在 col 上有索引,两个查询的执行计划可能是相同的。

其次,当使用 IN 或 OR 以及可变数量的参数时,会导致数据库在每次参数更改时都必须重新解析查询并重建执行计划。查询的执行计划可能是一个昂贵的步骤。大多数数据库使用 EXACT 查询文本作为键来缓存它们运行的​​查询的执行计划。如果您执行类似的查询但在谓词中使用不同的参数值 - 您很可能会导致数据库花费大量时间来解析和构建执行计划。这就是为什么bind variables are strongly recommended作为确保最佳查询性能的一种方式。

第三,许多数据库对其可以执行的查询的复杂性有限制 - 其中一个限制是谓词中可以包含的逻辑连接词的数量。在您的情况下,有一些限制十几个值不太可能达到数据库的内置限制,但如果您希望将数百或数千个值传递给 IN 子句 - 这肯定会发生。在这种情况下,数据库将简单地取消查询请求。

第四,在谓词中包含 IN 和 OR 的查询并不总是能够在并行环境中以最佳方式重写。 在多种情况下,并行服务器优化不会得到应用 - MSDN has a decent introduction优化查询的并行性。但一般来说,使用 UNION ALL 运算符的查询在大多数数据库中都可以并行化 - 并且在可能的情况下优先于逻辑连接词(如 OR 和 IN)。

关于sql - SQL IN 对性能有影响吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1013797/

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