我有一个类(反映一个db行),它在代码引导程序中创建了200多个实例。每个查询都有一个SELECT查询,唯一的条件是WHERE 'tblA'.'AID' = #,但我正在考虑创建一个查询,该查询将解析由OR逻辑连接的200个子句,然后从结果中创建200个对象,并使用已经找到的数据创建,因此只有一个查询。
目前,我正在测试服务器上实现这一功能,但我想知道这是否是提高效率的一个糟糕步骤,在什么时候执行两组查询更好,每个子句处理一半(或者还需要做更多的查询)?
附加的,我还编写了一个性能增强器来替换类似的东西
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发布于 2013-01-28 21:30:56
如果您有一个离散列表,那么只需使用in。。。
where AID in (2, 3, 5, 6, 7, . . .)并让SQL引擎担心优化。
最大的打击可能是解析查询并向引擎发送大型查询的时间。如果您的列表变得非常长,那么请考虑将列表放在一个临时表中,在表上构建一个索引,然后执行一个联接。
您没有指定所使用的数据库,但这个建议与数据库无关。
发布于 2013-01-28 22:37:17
您还没有指定DBMS。
对于Server来说,这可能是值得的(尽管您很可能希望考虑加入一个表值参数或类似的参数,而不是有一个冗长的IN列表)。
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)T桌。扫描计数64,逻辑读取192
SELECT *
FROM T
WHERE X BETWEEN 1 AND 64T桌。扫描计数1,逻辑读取3
正如本文的注释中所提到的,对于大于64个值,您将得到一个稍微不同的计划,它将添加一个常量表和一个嵌套循环连接到混合中。
https://stackoverflow.com/questions/14571531
复制相似问题