Sqlserver In 提示查询处理器耗尽了资源

最近项目出了一个问题,经过排查发现是使用in语句子查询过多的话会出现查询处理器耗尽了资源,如果改为使用关联表是一个办法,但是在为了最小改动,改为使用exists实现

1、新建一个函数,注意:不是存储过程

ALTER FUNCTION [dbo].[dnt_split]
(
 @splitstring varchar(max),
 @separator CHAR(1) = ‘,‘
)
RETURNS @splitstringstable TABLE
(
 [item] VARCHAR(200)
)
AS
BEGIN
    DECLARE @currentindex INT
    DECLARE @nextindex INT
    DECLARE @returntext VARCHAR(200)

    SELECT @currentindex=1

    WHILE(@currentindex<=datalength(@splitstring))
    BEGIN
        SELECT @nextindex=charindex(@separator,@splitstring,@currentindex)
        IF(@nextindex=0 OR @nextindex IS NULL)
            SELECT @nextindex=datalength(@splitstring)+1

        SELECT @returntext=substring(@splitstring,@currentindex,@nextindex-@currentindex)

        INSERT INTO @splitstringstable([item])
        VALUES(@returntext)

        SELECT @currentindex=@nextindex+1
    END
    RETURN
END

2、修改In语句如下

StringBuilder ins = new StringBuilder();
//ins.Append("(");
 ins.Append("12,13");//ins.Append(")");  //未修改前下面直接 in + ins.ToString()即可,修改后改为
string strFilter = "exists(SELECT * from dnt_split(\‘"+ ins.ToString()+ "\‘, ‘,‘) where item = xxxid)";

直接将原来的in字句替换成strExist1即可。

3、为什么in语句会出现问题
原因在于in语句相当于将主表个子表做了笛卡尔积,系统资源不足的话,就会出问题,(实际中,我的另一台性能较好电脑不存在这个问题)。

4、其他关于in与exists
转自:https://zhidao.baidu.com/question/134174568.html

当A表数据与B表数据一样大时,in与exists效率差不多,可任选一个使用。in 和 exists的区别如下:

4.1、运用情况不同

sql中in适用于子查询得出的结果集记录较少,主查询中的表较大且又有索引的表,。sql中exist适用于外层的主查询记录较少,子查询中的表大,又有索引的时候。

4.2、驱动顺序不同

IN是先查询子查询的表,然后将内表和外表做一个笛卡尔积,然后按照条件进行筛选。exists是以外层表为驱动表,先被访问。

4.3、对NULL值处理不同。

IN不对NULL进行处理,exists会对NULL值进行处理。

4.4、底层原理不同

in 是把外表和内表作hash 连接,而exists是对外表作loop循环,每次loop循环再对内表进行查询。

原文地址:https://www.cnblogs.com/zhaogaojian/p/12119282.html

时间: 2024-11-10 21:07:25

Sqlserver In 提示查询处理器耗尽了资源的相关文章

SQL提示查询处理器未能为执行并行查询启动必要的线程资源

最近SQL经常提示"查询处理器未能为执行并行查询启动必要的线程资源"反应速度变慢. SQL环境为两台服务器做故障转移群集,一主一备,主为48核心,64G内存,备为24核心,64G内存. 经检查发现服务已转移到备用节点(转移原因后续排查),因之前未出现过此问题,故障锁定在了计算机硬件,SQL配置问题上:我们的服务器CPU是4核(48个逻辑CPU),操作系统会将这些逻辑CPU进行分组.每个分组有分多少个逻辑CPU这个由操作系统决定.(每次重启电脑分组的数量可能会变的)假设,12个逻辑cpu

mssql 数据库“查询处理器用尽了内部资源,无法生成查询计划。”问题的处理

在项目中动态拼接sql语句,使用union all连接结果集,每个查询语句都使用了in(几百个数值).语句如: SELECT AA FROM T1 WHERE aa IN(1,2,3,4..............................) UNION ALL SELECT AA FROM T2 WHERE aa IN(1,2,3,4..............................) 当in和union all 很多时执行就会发生异常 ”查询处理器用尽了内部资源,无法生成查询

第十七章——配置SQLServer(1)——为SQLServer配置更多的处理器

原文:第十七章--配置SQLServer(1)--为SQLServer配置更多的处理器 前言: SQLServer提供了一个系统存储过程,SP_Configure,可以帮助你管理实例级别的配置.微软建议使用默认配置,但是基于不同的服务器.不同负载的系统和你的用法,更改配置可能会给你的性能带来好处.在32位和64位系统中,sp_configure会有一些差异. 我们经常见到SQLServer所在的服务器上还包含了如IIS.文件服务器或者域控制器这些服务或者功能.这些会影响你的性能甚至对正常运作有阻

oracle 实时查询最耗CPU资源的SQL语句

1. 先通过top命令查看产用资源较多的spid号 2.查询当前耗时的会话ID,用户名,sqlID等: select sid,serial#,machine,username,program,sql_hash_value,sql_id,        to_char(logon_time,'yyyy/mm/dd hh24:mi:ss') as login_time from v$session where paddr in (select addr from v$process where sp

SqlServer中循环查询结果集

declare @id int,@value nvarchar(100); begin declare c_test_main cursor fast_forward for select hps_hpId,hps_time from hospitalPermSupp where hps_usId=1; open c_test_main;--打开游标 while 1=1 --开始循环 begin fetch next from c_test_main into @id,@value; --赋值到

sqlserver中怎么查询字段为空的记录

sqlserver中怎么查询字段为空的记录的两种方法:

Oracle、MySql、SQLServer 数据分页查询

Oracle.MySql.SQLServer 数据分页查询 摘自:http://www.cnblogs.com/wangyong/p/3396333.html 近简单的对oracle,mysql,sqlserver2005的数据分页查询作了研究,把各自的查询的语句贴出来供大家学习..... (一). mysql的分页查询 mysql的分页查询是最简单的,借助关键字limit即可实现查询,查询语句通式: /* * sql:可以是单表的查询语句,也可以是多表的联合查询语句 * firstIndex:

SQLServer访问Oracle查询性能问题解决

原文:SQLServer访问Oracle查询性能问题解决 1. 问题 系统有个模块,需要查询Oracle数据库中的数据.目前是通过建立链接服务器实现的. SQLServer访问Oracle实现 可参考这篇文章http://www.cnblogs.com/gnielee/archive/2010/09/07/access-oracle-from-sqlserver.html 目前的查询语句就是一个简单的带where条件的查询语句,类似如下: SELECT * FROM LINKED_NAME..A

Oracle、MySql、SQLServer数据分页查询

看过此博文后Oracle.MySql.SQLServer 数据分页查询,在根据公司的RegionRes表格做出了 SQLserver的分页查询语句: SELECT DISTINCT TOP 500 rr.ID AS id ,rr.strName AS name ,rr.nType AS res_type ,rr.nRegID AS region_id ,rr.strChanName AS channel_name ,rr.nChanNum AS channel ,rr.nSortID AS so