【发布时间】:2010-11-04 01:39:33
【问题描述】:
我有一个类似的查询:
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
【问题讨论】:
-
这些是随机数吗?还是他们来自某个地方?也许您可以制作一个单独的表格并将这些数字放入其中并为其编制索引,然后在您的选择语句中使用连接。
-
不,它们不是随机数。之前执行了一些查询(然后缓存)以返回这些 id。进行联接相当困难,因为在执行该(缓存)查询之后,今天在 C# 中完成了一些应用程序逻辑。
-
您没有提供太多信息,但如果这些 (IN n, n,n ..) 值是不同表中的键,并且有一些共同点 (status=xyz),则可能可以将 INNER JOIN 加入到该表中,这可能会更快。如果您根据某些条件选择所有这些 ID(在不同的查询中),然后从该结果集中构建此 select 语句,那么您应该尝试使用 INNER JOIN 方法
-
然而,从 SQL Server 的角度来看,它们是随机的,它必须单独查询每一个。没有模式我不知道你可以写一个好的提示。您可以尝试多线程 - 将数字分解成更小的块,并使用更小的列表发送更多查询。
-
我不确定您所说的“缓存”是什么意思。我怀疑某些异常情况可能导致发生锁定,并且查询在锁定时超时。
标签: sql sql-server-2000