0

我有一个类(反映一个 db 行),它在代码引导程序中创建了 200 多个实例。每个人都有一个SELECT查询,唯一的条件是WHERE 'tblA'.'AID' = #,但我正在考虑创建一个查询,它将解析由OR逻辑连接的 200 个 WHERE 子句,然后从结果中,使用已经找到的数据创建了 200 个对象,所以有只有 1 个查询。

我目前正在测试服务器上实现这个,但我想知道这是否是提高效率的一个坏步骤,什么时候做两组查询会更好,每组处理一半的子句(或者如何还需要制作更多)?

另外,我还在其中编写了一个性能增强器来替换类似的东西

WHERE `tblA`.`AID` = 2 OR `tblA`.`AID` = 3 OR `tblA`.`AID` = 5 OR `tblA`.`AID` = 6 OR `tblA`.`AID` = 7

WHERE (`tblA`.`AID` >= 2 AND `tblA`.`AID` <= 3) OR (`tblA`.`AID` >= 5 AND `tblA`.`AID` <= 7)

甚至

WHERE `tblA`.`AID` >= 2 AND `tblA`.`AID` <= 7 AND `tblA`.`AID` <> 4
4

2 回答 2

3

如果您有离散列表,则只需使用in. . .

where AID in (2, 3, 5, 6, 7, . . .)

并让 SQL 引擎操心优化。

最大的打击可能是解析查询并将大型查询发送到引擎的时间。如果您的列表真的很长,请考虑将列表放入临时表中,在表上建立索引,然后进行连接。

您没有指定您使用的是什么数据库,但这个建议与数据库无关。

于 2013-01-28T21:30:56.010 回答
1

您还没有指定 DBMS。

对于 SQL Server,这可能是值得的(尽管您可能很想考虑加入表值参数或类似参数,而不是拥有一个冗长的IN列表)。

SQL Server 将进行单独的单独搜索,而不是将它们折叠成连续的范围。这在文章什么时候是寻找不是寻找?但下面有一些例子。

CREATE TABLE T (X int PRIMARY KEY)

INSERT INTO T 
SELECT TOP 1000000 ROW_NUMBER() OVER (ORDER BY @@SPID)
FROM master..spt_values v1, master..spt_values v2

SET STATISTICS IO ON;

SELECT *
FROM   T
WHERE   X IN ( 1, 2, 3, 4, 5, 6, 7, 8, 9,10,
              11,12,13,14,15,16,17,18,19,20,
              21,22,23,24,25,26,27,28,29,30,
              31,32,33,34,35,36,37,38,39,40,
              41,42,43,44,45,46,47,48,49,50,
              51,52,53,54,55,56,57,58,59,60,
              61,62,63,64)

药片'。扫描计数 64,逻辑读取 192

SELECT *
FROM   T
WHERE   X BETWEEN 1 AND 64

药片'。扫描计数 1,逻辑读取 3

正如文章评论中提到的,对于大于 64 的值,您将获得一个稍微不同的计划,该计划添加了一个常量表和一个嵌套循环连接。

于 2013-01-28T22:37:17.850 回答