NOT EXIST和NOT IN 和MINUS的用法

本文探讨了在SQL查询中使用NOTIN和MINUS操作符优化查询性能的方法,通过实例展示了如何避免使用NOT EXISTS,进而提高查询速度。重点介绍了在特定场景下,利用这些操作符可以显著减少查询时间。

①NOT EXISTS一般都会比较慢

UPDATE  A
SET DATE=sysdate
WHERE LINK_TAISHOGAI_FG = '0'
    AND NOT EXISTS
(SELECT 1
 FROM   FROM   B
 WHERE  A.ID1= B.ID1
 AND    A.ID2 = B.ID2
 AND   A.ID3 = B.ID3 
AND    B.ID4 IN ('A','B','C')
)

 

②上面的改为NOT IN

UPDATE  A
SET DATE=sysdate
WHERE LINK_TAISHOGAI_FG = '0'
AND (A.ID1,A.ID2,A.ID3) NOT IN
(SELECT  B.ID1,B.ID2,B.ID3 
 FROM   B
 WHERE  A.ID1= B.ID1
 AND    A.ID2 = B.ID2
 AND   A.ID3 = B.ID3 
AND    B.ID4 IN ('A','B','C')
)

③加入MINUS,能缩短时间

 

A表的数据如果在BC表里不存在的话将其其中一个字段更新

UPDATE  A
SET DATE=sysdate
WHERE LINK_TAISHOGAI_FG = '0'
AND (A.ID1,A.ID2,A.ID3) IN
(
select A.ID1,A.ID2,A.ID3 FROM A
where LINK_TAISHOGAI_FG = '0'
MINUS
select temp.ID1,temp.ID2,temp.ID3 
FROM
 (
  select B.ID1,B.ID2,B.ID3
  FROM B
  where    B.ID4 IN ('A','B','C')
  UNION ALL
  select C.ID1,C.ID2,C.ID3
  FROM C
  where    C.ID4 IN ('AA','BB','CC')
 )
)

import datetime import os import matplotlib.pyplot as plt import pandas as pd from obsqc_tool.data_processing import read_data, split_segments, process_segment, cal_static_info from tqdm import tqdm import codecs import json config = { "font.family": "serif", "font.serif": ["Consolas-with-Yahei"], "font.size": 12, "mathtext.fontset": "stix", "axes.unicode_minus": False, # 解决负号显示问题 } plt.rcParams.update(config) root_folder = r"D:\work\市场问题\sbny1203\out\out" # 替换为你的文件夹路径 output_html = "output.html" prefixes = ['C2', 'C3', 'E', 'G'] suffixes = ['MP1(m)', 'MP2(m)', 'MP3(m)', 'MPC'] data_t = '20251203' image_infos = [] # 提取所有“标识符-序号” identifiers_and_indices = [] result_pic_path = os.path.join(root_folder, '../res_statics/result_pic') os.makedirs(result_pic_path, exist_ok=True) result_tab_path = os.path.join(root_folder, '../res_statics/result_tab') for folder in os.listdir(root_folder): if not os.path.isdir(os.path.join(root_folder, folder)): continue parts = folder.split('_') if len(parts) < 1: continue identifier_index_part = parts[0] try: data_t = parts[1] except: print(parts) if '-' not in identifier_index_part: continue identifier, index = identifier_index_part.split('-') identifiers_and_indices.append((identifier, index)) # 去重并排序 unique_identifier_index = sorted(set(identifiers_and_indices), key=lambda x: (x[1], x[0])) all_identifiers = sorted(set([id for id, _ in unique_identifier_index])) all_indices = sorted(set([int(idx) for _, idx in unique_identifier_index])) all_results = {} fig_, axs_ = plt.subplots(4, 4, figsize=(18, 18)) fig_.suptitle(f"数据分布直方图") for identifier in tqdm(all_identifiers, desc="处理整机"): all_results[identifier] = {} for index in tqdm(all_indices, desc=f"处理{identifier}序号"): folder_path = os.path.join(root_folder, f"{identifier}-{index}_{data_t}_obsqc", f"{identifier}-{index}_{data_t}_obsqc") if not os.path.exists(folder_path): print(f'{folder_path} 不存在') continue file_list = [x for x in os.listdir(folder_path) if x.endswith('.txt')] all_results[identifier][index] = {} a_file_result = {'C2': {}, 'C3': {}, 'E': {}, 'G': {}, } for file in file_list: sys_prn = file.split('.')[0] file_path = os.path.join(folder_path, file) if not os.path.exists(file_path): continue df = read_data(file_path) if df is None: continue segments = split_segments(df) result = pd.concat([process_segment(segment) for segment in segments], ignore_index=True) next_index = None if sys_prn.startswith('C'): prn = int(sys_prn[1:]) if prn <= 16: next_index = 'C2' else: next_index = 'C3' else: next_index = sys_prn[0] if sys_prn in a_file_result[next_index]: a_file_result[next_index][sys_prn] = pd.concat([a_file_result[next_index][sys_prn], result], ignore_index=True) else: a_file_result[next_index][sys_prn] = result for i, (sys, all_data) in enumerate(a_file_result.items()): all_results[identifier][index][sys] = cal_static_info(all_data) with codecs.open('context.json', 'w', encoding='utf-8') as f: json.dump(all_results, f) 修改为合适的多线程、多进程或异步方式,增加运行速度
最新发布
12-06
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值