首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL查询连接性能提升

SQL查询连接性能提升
EN

Stack Overflow用户
提问于 2013-01-28 21:26:28
回答 2查看 127关注 0票数 0

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

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

附加的,我还编写了一个性能增强器来替换类似的东西

代码语言:javascript
复制
WHERE `tblA`.`AID` = 2 OR `tblA`.`AID` = 3 OR `tblA`.`AID` = 5 OR `tblA`.`AID` = 6 OR `tblA`.`AID` = 7

使用

代码语言:javascript
复制
WHERE (`tblA`.`AID` >= 2 AND `tblA`.`AID` <= 3) OR (`tblA`.`AID` >= 5 AND `tblA`.`AID` <= 7)

甚至是

代码语言:javascript
复制
WHERE `tblA`.`AID` >= 2 AND `tblA`.`AID` <= 7 AND `tblA`.`AID` <> 4
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-28 21:30:56

如果您有一个离散列表,那么只需使用in。。。

代码语言:javascript
复制
where AID in (2, 3, 5, 6, 7, . . .)

并让SQL引擎担心优化。

最大的打击可能是解析查询并向引擎发送大型查询的时间。如果您的列表变得非常长,那么请考虑将列表放在一个临时表中,在表上构建一个索引,然后执行一个联接。

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

票数 3
EN

Stack Overflow用户

发布于 2013-01-28 22:37:17

您还没有指定DBMS。

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

Server将进行单独的单独搜索,而不是将它们折叠到连续的范围中。什么时候寻求而不是寻求?一文详细介绍了这一点,但下面有一些示例。

代码语言:javascript
复制
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

代码语言:javascript
复制
SELECT *
FROM   T
WHERE   X BETWEEN 1 AND 64

T桌。扫描计数1,逻辑读取3

正如本文的注释中所提到的,对于大于64个值,您将得到一个稍微不同的计划,它将添加一个常量表和一个嵌套循环连接到混合中。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14571531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档