我需要从一个更大的表中选择大量的行,这些表是在自动增量标识列上键入的.我有我想要选择的每一行的主键值,但它可能非常大.
通常但并非总是,所选择的行是连续的,因此我实现了一种机制,将select转换为一组范围子句,用于所有聚集在一起的条目([PrimaryKey] BETWEEN 151 AND 217),以及一个回退方法,用IN子句选择所有隔离的条目.
最后我得到了这样的东西
SELECT * FROM Table WHERE ([PrimaryKey] BETWEEN 151 AND 217) OR ([PrimaryKey] BETWEEN 314 AND 378) OR ... OR [PrimaryKey] IN (1,3,7,14,147...)
这适用于我主要使用大范围的情况,但随着查询变大而崩溃.我只是遇到了一个退化的案例,我有大量的"对"条目,在我放弃它之前,每次尝试描述执行计划的时间超过15分钟,为2个条目生成BETWEEN语句.
我想到的第一件事就是我可以改变开始生成范围的阈值,而不是个别值,超过2(10或许10?),但我想知道是否有更好的解决方案.
使用要选择的值创建Temp表,并执行从主表到临时表的连接.这样你几乎没有限制.