惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security @ Cisco Blogs
罗磊的独立博客
宝玉的分享
宝玉的分享
Last Week in AI
Last Week in AI
T
The Blog of Author Tim Ferriss
美团技术团队
T
Tailwind CSS Blog
博客园 - 三生石上(FineUI控件)
博客园 - Franky
G
Google Developers Blog
Jina AI
Jina AI
Stack Overflow Blog
Stack Overflow Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
V
Visual Studio Blog
腾讯CDC
S
SegmentFault 最新的问题
Recent Announcements
Recent Announcements
博客园 - 叶小钗
Microsoft Security Blog
Microsoft Security Blog
雷峰网
雷峰网
L
LangChain Blog
Vercel News
Vercel News
Forbes - Security
Forbes - Security
PCI Perspectives
PCI Perspectives
N
News | PayPal Newsroom
S
Security Affairs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
博客园 - 司徒正美
J
Java Code Geeks
Recent Commits to openclaw:main
Recent Commits to openclaw:main
Hacker News: Ask HN
Hacker News: Ask HN
Schneier on Security
Schneier on Security
A
About on SuperTechFans
Attack and Defense Labs
Attack and Defense Labs
Google Online Security Blog
Google Online Security Blog
aimingoo的专栏
aimingoo的专栏
MongoDB | Blog
MongoDB | Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
酷 壳 – CoolShell
酷 壳 – CoolShell
Cloudbric
Cloudbric
B
Blog
C
CXSECURITY Database RSS Feed - CXSecurity.com
P
Proofpoint News Feed
D
DataBreaches.Net
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
B
Blog RSS Feed
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
N
News and Events Feed by Topic

博客园 - williambirkin

.NET平台自带的AOP机制 转自《设计模式--基于c#的工程化实现及扩展》 今天看PolicyInjection遇到的问题 我的第一个ASP.NET Ajax控件 转 事务隔离级别 转 UML 基础: 类图 关于Form.show的问题 模式 转 SQL Server 索引结构及其使用 (三) 转 SQL Server 索引结构及其使用 (二) 转 SQL Server 索引结构及其使用 (一) 泛型的一点思考 摘自《.NET 2.0 模式开发实战》 转 《为Windows应用创建简单的异步调用模式》 转 C#格式化数值结果表(格式化字符串) SQL游标的简单使用 转“理解VC# 2005中的字符串和正规表达式” 2个IP输入控件 Windows Forms中禁用窗体的关闭按钮 回车移动焦点 文本框事件顺序
关于where中子查询的性能问题 请高手指教
williambirkin · 2008-06-30 · via 博客园 - williambirkin

我今天测试一条语句。
代码如下:
 WITH rList(ID,DBID,ITEM_CODE,BCode,TCode,Quantity,OrderDate,DB_Level,OID)
 AS
 (
  SELECT 5872231,PSO.DBID,PSO.ITEM,UpperWS,
  HPCode,CONVERT(numeric(18, 0),sum(QTY)),OEDate,
  Convert(varchar,'final'),0
  FROM PSO

  WHERE ID=5872231
  OR EXISTS (SELECT NEW_PSO_ID FROM RETURNDETAIL WHERE OLD_PSO_ID=5872231 AND PSO.ID =NEW_PSO_ID)
  GROUP BY PSO.DBID,PSO.ITEM ,UpperWS,HPCode,OEDate
 
  UNION ALL

  SELECT DB.ID,DB.BDB,DB.ITEM,UpperWS,ToWS,QTY,DBDate,Convert(varchar,DB.DB_LEVEL),rList.OID+1
  FROM DB
  INNER JOIN rList ON DB.ID=rList.DBID
 )
 SELECT ID,DBID,rList.ITEM_CODE,ITEM.ITEM_LNAME_ZH AS INAME,CUSTOMER.CUST_NAME AS BName,CUSTOMER_1.CUST_NAME AS TName,Quantity,OrderDate,DB_Level,OID
 FROM rList
 INNER JOIN CUSTOMER ON rList.BCode =CUSTOMER.CUST_CODE
 INNER JOIN CUSTOMER AS CUSTOMER_1 ON rList.TCode =CUSTOMER_1.CUST_CODE
 INNER JOIN ITEM ON rList.ITEM_CODE = ITEM.ITEM_CODE
 ORder by OID OPTION(MAXRECURSION 10)

其中pso是个有500万行数据的销售数据表。DB也是一个有300万行数据的表。ADJUSTDETAIL 里的数据很少,不超过100行。
刚开始没有exists(红色这行)语句,速度很快不要1秒钟。
而加了exists语句后执行时间增加为16秒。其实exists中子查询出的数据只有几行。如果吧exists语句换成OR ID=xx OR ID=xxx,速度也会很快了(不到一秒)。
后来我也试过用ID IN (子查询) 的写法。但是速度和exists的差不多。
所以问题处在exists这。我觉得问题主要是要将PSO的500万条数据的ID拿到子查询中去查一遍。这个处理消耗了大量的时间,所以很慢。
而OR ID=XX OR ID=XX 的写法是直接使用索引的,所以快很多。
但是我暂时想不到好的写法去解决这个问题。后来做了个无聊的得事情。
先将子查询执行出来,然后用游标循环拼出OR ID=XX OR ID=XXX的语句,然后再执行动态sql语句。
虽然中间增加了些处理,但是整体速度没有什么影响。查询执行时间还是在一秒内。
但是这样写毕竟是不规范的。不知道有没有什么好的写法能解决这个问题。

查询计划

https://files.cnblogs.com/williambirkin/WinLWControl.rar

表结构

/****** Object:  Table [dbo].[RETURNDETAIL]    Script Date: 06/30/2008 18:44:56 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[RETURNDETAIL](
 [RETURN_DETAIL_ID] [int] IDENTITY(1,1) NOT NULL,
 [OLD_PSO_ID] [int] NOT NULL,
 [NEW_PSO_ID] [int] NOT NULL,
 [RETURN_CODE] [varchar](3) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [ADD_DATE] [datetime] NOT NULL CONSTRAINT [DF_RETURNDETAIL_ADD_DATE]  DEFAULT (getdate()),
 [ADD_USER] [varchar](36) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [MOD_DATE] [datetime] NULL,
 [MOD_USER] [varchar](36) COLLATE Chinese_PRC_CI_AS NULL,
 CONSTRAINT [PK_RETURNDETAIL] PRIMARY KEY CLUSTERED
(
 [RETURN_DETAIL_ID] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

/****** Object:  Table [dbo].[DB]    Script Date: 06/30/2008 18:44:01 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[DB](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [FrWS] [char](6) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [UpperWS] [char](6) COLLATE Chinese_PRC_CI_AS NULL,
 [ToWS] [char](6) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [ITEM] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [QTY] [numeric](18, 0) NOT NULL,
 [DBDate] [datetime] NOT NULL,
 [InpDate] [datetime] NOT NULL,
 [BDB] [int] NULL,
 [DEL] [char](1) COLLATE Chinese_PRC_CI_AS NULL,
 [SQTY] [numeric](18, 0) NULL,
 [PRICE] [money] NULL,
 [SENDER] [char](3) COLLATE Chinese_PRC_CI_AS NULL,
 [LSTUPD] [datetime] NULL,
 [EDI] [char](1) COLLATE Chinese_PRC_CI_AS NULL,
 [TTID] [char](2) COLLATE Chinese_PRC_CI_AS NULL,
 [DB_LEVEL] [int] NULL,
 [pcdCutOffFlag] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NULL,
 [dbModUser] [char](10) COLLATE Chinese_PRC_CI_AS NULL,
 [dbModDate] [datetime] NULL,
 [AddUser] [nvarchar](36) COLLATE Chinese_PRC_CI_AS NULL,
 [AddDate] [datetime] NULL,
 [ModUser] [nvarchar](36) COLLATE Chinese_PRC_CI_AS NULL,
 [ModDate] [datetime] NULL,
 CONSTRAINT [PK_DB] PRIMARY KEY CLUSTERED
(
 [ID] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF

/****** Object:  Table [dbo].[PSO]    Script Date: 06/30/2008 18:43:43 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[PSO](
 [ID] [int] IDENTITY(1,1) NOT NULL,
 [DBID] [int] NULL,
 [DBTYPE] [varchar](1) COLLATE Chinese_PRC_CI_AS NULL,
 [WSCode] [char](6) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [UpperWS] [char](6) COLLATE Chinese_PRC_CI_AS NULL,
 [HPCode] [char](6) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [ITEM] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [QTY] [numeric](18, 0) NOT NULL,
 [PRICE] [money] NULL,
 [SalesID] [char](3) COLLATE Chinese_PRC_CI_AS NOT NULL,
 [OEDate] [datetime] NOT NULL,
 [CFM] [char](1) COLLATE Chinese_PRC_CI_AS NULL,
 [ADJ] [char](1) COLLATE Chinese_PRC_CI_AS NULL,
 [Memo] [char](100) COLLATE Chinese_PRC_CI_AS NULL,
 [InpDate] [datetime] NOT NULL,
 [EDI] [char](1) COLLATE Chinese_PRC_CI_AS NULL,
 [TTID] [char](2) COLLATE Chinese_PRC_CI_AS NULL,
 [pcdCutOffFlag] [nvarchar](20) COLLATE Chinese_PRC_CI_AS NULL,
 [psoModUser] [char](10) COLLATE Chinese_PRC_CI_AS NULL,
 [psoModDate] [datetime] NULL,
 [AddUser] [nvarchar](36) COLLATE Chinese_PRC_CI_AS NULL,
 [AddDate] [datetime] NULL,
 [ModUser] [varchar](36) COLLATE Chinese_PRC_CI_AS NULL,
 [ModDate] [datetime] NULL,
 CONSTRAINT [PK_PSO] PRIMARY KEY CLUSTERED
(
 [ID] ASC
)WITH (PAD_INDEX  = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF