character 7 depts_wo_emps.sql

本文通过具体示例展示了如何使用不同的SQL语法来查询没有员工的部门,并比较了各种查询方式的执行计划,以此来说明SQL语句的不同写法对Oracle数据库性能的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SET ECHO OFF
REM ***************************************************************************
REM ******************* Troubleshooting Oracle Performance ********************
REM ************************* http://top.antognini.ch *************************
REM ***************************************************************************
REM
REM File name...: depts_wo_emps.sql
REM Author......: Christian Antognini
REM Date........: August 2008
REM Description.: This script was used to generate the execution plans used as
REM               examples in the section "Altering the SQL Statement."
REM Notes.......: -
REM Parameters..: -
REM
REM You can send feedbacks or questions about this script to top@antognini.ch.
REM
REM Changes:
REM DD.MM.YYYY Description
REM ---------------------------------------------------------------------------
REM
REM ***************************************************************************


SET TERMOUT ON
SET FEEDBACK OFF
SET VERIFY OFF
SET SCAN ON


@../connect.sql


SET ECHO ON


REM
REM Setup test environment
REM


DROP TABLE dept;


CREATE TABLE dept
       (deptno NUMBER(2),
        dname VARCHAR2(14),
        loc VARCHAR2(13) );


ALTER TABLE dept ADD CONSTRAINT dept_pk PRIMARY KEY (deptno);


INSERT INTO dept VALUES (10, 'ACCOUNTING', 'NEW YORK');
INSERT INTO dept VALUES (20, 'RESEARCH',   'DALLAS');
INSERT INTO dept VALUES (30, 'SALES',      'CHICAGO');
INSERT INTO dept VALUES (40, 'OPERATIONS', 'BOSTON');


execute dbms_stats.gather_table_stats(user, 'dept')


DROP TABLE emp;


CREATE TABLE emp
       (empno NUMBER(4) NOT NULL,
        ename VARCHAR2(10),
        job VARCHAR2(9),
        mgr NUMBER(4),
        hiredate DATE,
        sal NUMBER(7, 2),
        comm NUMBER(7, 2),
        deptno NUMBER(2));


ALTER TABLE emp ADD CONSTRAINT emp_pk PRIMARY KEY (empno);
ALTER TABLE emp ADD CONSTRAINT emp_dept_pk FOREIGN KEY (deptno) REFERENCING DEPT (deptno);


INSERT INTO emp VALUES
        (7369, 'SMITH',  'CLERK',     7902,
        to_date('17-DEC-1980', 'DD-MON-YYYY'),  800, NULL, 20);
INSERT INTO emp VALUES
        (7499, 'ALLEN',  'SALESMAN',  7698,
        to_date('20-FEB-1981', 'DD-MON-YYYY'), 1600,  300, 30);
INSERT INTO emp VALUES
        (7521, 'WARD',   'SALESMAN',  7698,
        to_date('22-FEB-1981', 'DD-MON-YYYY'), 1250,  500, 30);
INSERT INTO emp VALUES
        (7566, 'JONES',  'MANAGER',   7839,
        to_date('2-APR-1981', 'DD-MON-YYYY'),  2975, NULL, 20);
INSERT INTO emp VALUES
        (7654, 'MARTIN', 'SALESMAN',  7698,
        to_date('28-SEP-1981', 'DD-MON-YYYY'), 1250, 1400, 30);
INSERT INTO emp VALUES
        (7698, 'BLAKE',  'MANAGER',   7839,
        to_date('1-MAY-1981', 'DD-MON-YYYY'),  2850, NULL, 30);
INSERT INTO emp VALUES
        (7782, 'CLARK',  'MANAGER',   7839,
        to_date('9-JUN-1981', 'DD-MON-YYYY'),  2450, NULL, 10);
INSERT INTO emp VALUES
        (7788, 'SCOTT',  'ANALYST',   7566,
        to_date('09-DEC-1982', 'DD-MON-YYYY'), 3000, NULL, 20);
INSERT INTO emp VALUES
        (7839, 'KING',   'PRESIDENT', NULL,
        to_date('17-NOV-1981', 'DD-MON-YYYY'), 5000, NULL, 10);
INSERT INTO emp VALUES
        (7844, 'TURNER', 'SALESMAN',  7698,
        to_date('8-SEP-1981', 'DD-MON-YYYY'),  1500,    0, 30);
INSERT INTO emp VALUES
        (7876, 'ADAMS',  'CLERK',     7788,
        to_date('12-JAN-1983', 'DD-MON-YYYY'), 1100, NULL, 20);
INSERT INTO emp VALUES
        (7900, 'JAMES',  'CLERK',     7698,
        to_date('3-DEC-1981', 'DD-MON-YYYY'),   950, NULL, 30);
INSERT INTO emp VALUES
        (7902, 'FORD',   'ANALYST',   7566,
        to_date('3-DEC-1981', 'DD-MON-YYYY'),  3000, NULL, 20);
INSERT INTO emp VALUES
        (7934, 'MILLER', 'CLERK',     7782,
        to_date('23-JAN-1982', 'DD-MON-YYYY'), 1300, NULL, 10);


execute dbms_stats.gather_table_stats(user, 'emp')


PAUSE


REM
REM The test queries...
REM


EXPLAIN PLAN FOR
SELECT deptno
FROM dept
WHERE deptno NOT IN (SELECT deptno FROM emp);


SELECT * FROM table(dbms_xplan.display);


PAUSE

为SQL语句创建执行计划EXPLAIN PLAN FOR
EXPLAIN PLAN FOR
SELECT deptno
FROM dept
WHERE NOT EXISTS (SELECT 1 FROM emp WHERE emp.deptno = dept.deptno);

查看最近一次执行的SQL执行计划
SELECT * FROM table(dbms_xplan.display);
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Plan hash value: 3222363744


------------------------------------------------------------------------------
| Id  | Operation   | Name    | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------
|   0 | SELECT STATEMENT   |     |   1 |   6 |   5  (20)| 00:00:01 |
|*  1 |  HASH JOIN ANTI    |     |   1 |   6 |   5  (20)| 00:00:01 |
|   2 |   INDEX FULL SCAN  | DEPT_PK |   4 |  12 |   1   (0)| 00:00:01 |
|   3 |   TABLE ACCESS FULL| EMP     |  14 |  42 |   3   (0)| 00:00:01 |
------------------------------------------------------------------------------




PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------


   1 - access("DEPT"."DEPTNO"="EMP"."DEPTNO")


15 rows selected.

PAUSE


EXPLAIN PLAN FOR
SELECT deptno FROM dept
MINUS
SELECT deptno FROM emp;


SELECT * FROM table(dbms_xplan.display);


PAUSE


EXPLAIN PLAN FOR
SELECT dept.deptno
FROM dept, emp
WHERE dept.deptno = emp.deptno(+) AND emp.deptno IS NULL;


SELECT * FROM table(dbms_xplan.display);


PAUSE


REM
REM Cleanup
REM


DROP TABLE emp;
PURGE TABLE emp;


DROP TABLE dept;
PURGE TABLE dept;
# -*- coding: utf-8 -*- """ @file: ledger @author: zhangxiukun @date: 2025/7/9 14:10 """ from io import BytesIO from typing import List from fastapi import APIRouter, Query, File, UploadFile, HTTPException from tortoise.expressions import Q from app.api.v1.utils import insert_log from app.controllers import user_controller from app.controllers.changeledger import changeledger_controller from app.core.ctx import CTX_USER_ID from app.models.system import LogType, LogDetailType from app.schemas.base import SuccessExtra, Success from app.schemas.changeledger import ChangeLedgerSearch, ChangeLedgerCreate, ChangeLedgerUpdate from tortoise.queryset import QuerySet router = APIRouter() @router.post("/ledgers/all", summary="查看变更列表") async def _(obj_in: ChangeLedgerSearch): q = Q() if obj_in.source: q &= Q(source=obj_in.source) if obj_in.peco: q &= Q(peco__contains=obj_in.peco) if obj_in.projectno: q &= Q(projectno__contains=obj_in.projectno) if obj_in.can_upgrade: q &= Q(can_upgrade=obj_in.can_upgrade) if obj_in.dept: q &= Q(dept__contains=obj_in.dept) if obj_in.software_change: q &= Q(software_change=obj_in.software_change) user_id = CTX_USER_ID.get() user_obj = await user_controller.get(id=user_id) total, api_objs = await changeledger_controller.list(page=obj_in.current, page_size=obj_in.size, search=q, order=["peco", "id"]) records = [] for obj in api_objs: data = await obj.to_dict(exclude_fields=[]) records.append(data) print(records,111) # test_records = records if records else [ # 若无实际数据则生成测试数据 # {"id": 1, "source": "bom", "peco_name": "test", "peco":"PECO001-ECR2505081","software_change":"硬件加软件", "projectno":"P4-15898", # "soft_responsible_person":"张秀琨_NMC15855", "elec_responsible_person":"张秀琨_NMC15855", # "change_responsible_person":"张秀琨_NMC15855,张秀琨_NMC15855","status":"待处理","customer_demand_time":"2025-10-25", "soft_completion_time":"2025-9-10","hard_completion_time": "2025-10-07", # "plan_completion_time":"2025-10-25",}, # # ] data = {"records": records} await insert_log(log_type=LogType.UserLog, log_detail_type=LogDetailType.ChangeLedgerList, by_user_id=user_obj.id) return SuccessExtra(data=data, total=total, current=obj_in.current, size=obj_in.size) 请参考我已有的代码在后端实现获取部门列表的API接口
07-23
public AjaxResult importData(MultipartFile file, SysDept sysDept) throws Exception { ExcelUtil<SysDept> util = new ExcelUtil<>(SysDept.class); List<SysDept> sysDeptList = util.importExcel(file.getInputStream(), 1); sysDept.setDeptType(Constants.DEPT_BANK); sysDept.setDelFlag(Constants.STATUS_VALID); List<SysDept> depts = deptService.selectDeptList(sysDept); // 创建机构名称集合 List<String> deptNames = new ArrayList<>(); // 创建机构编号集合 List<String> deptNum = new ArrayList<>(); // 创建父部门编号map Map<String, SysDept> parentNum = new HashMap<>(); for (SysDept dept : depts) { deptNames.add(dept.getDeptName()); deptNum.add(dept.getDeptNum()); parentNum.put(dept.getDeptNum(), dept); } for (SysDept dept : sysDeptList) { if (deptNames.contains(dept.getDeptName()) || deptNum.contains(dept.getDeptNum())) { throw new ServiceException("机构已存在!"); } // 添加父部门id if (parentNum.get(dept.getParentNum()) != null) { dept.setParentId(parentNum.get(dept.getParentNum()).getDeptId()); deptNames.add(dept.getDeptName()); parentNum.put(dept.getDeptNum(), dept); deptNum.add(dept.getDeptNum()); } else { throw new ServiceException("添加" + dept.getDeptName() + "失败!经办机构不存在!"); } dept.setDeptType(Constants.DEPT_BANK); dept.setCreateBy(getUserId()); dept.setStatus(Constants.STATUS_VALID); dept.setDelFlag(Constants.STATUS_VALID); //存储用户信息 SysUser user = new SysUser(); user.setUserName(dept.getUserName()); user.setPassword(SecurityUtils.encryptPassword(dept.getPassword())); user.setPhonenumber(dept.getPhonenumber()); user.setRoleIds(dept.getRoleIds()); user.setUserType(Constants.USER_TYPE_BANK); user.setCreateBy(getUserId()); user.setStatus(Constants.STATUS_VALID); user.setDelFlag(Constants.STATUS_VALID); if (!userService.checkUserNameUnique(user)) { throw new ServiceException(ADD_USER + user.getUserName() + ACCOUNT_ALREADY_EXISTS); } else if (StringUtils.isNotEmpty(user.getPhonenumber()) && !userService.checkPhoneUnique(user)) { throw new ServiceException(ADD_USER + user.getUserName() + PHONE_EXISTS); } userService.insertUser(user); //存储部门信息 dept.setUserId(user.getUserId()); deptService.insertDept(dept); //更新用户信息 user.setDeptId(dept.getDeptId()); userService.updateUser(user); } return success(); }重构这段代码 将其认知复杂度从16降低到允许的15。
06-09
package com.nk.mod.zz.sysdept; import com.nk.xt.yy.domain.Domain_AjaxResult; import com.nk.mod.yy.Vo_Dept; import com.nk.mod.yy.Vo_TreeConvert; import com.nk.mod.zz.groupuser.VimUserApiService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; import java.util.List; @RestController @RequestMapping("/api/sys/depts") public class DeptController { private final Logger logger = LoggerFactory.getLogger(DeptController.class); /** * 顶级的 PARENT_ID */ public static final String DEFAULT_PARENT_ID = "0"; @Resource private VimDeptApiService vimDeptApiService; @Resource private VimUserApiService vimUserApiService; @GetMapping public Domain_AjaxResult list(){ Vo_TreeConvert convert = new Vo_TreeConvert(); return Domain_AjaxResult.success(convert.listToTree(vimDeptApiService.getDepts(),DEFAULT_PARENT_ID)); } @GetMapping("parent") public Domain_AjaxResult parent(String deptId) { Vo_Dept dept = vimDeptApiService.get(deptId); List<Vo_Dept> depts = vimDeptApiService.getDepts(dept.getParentIds()); depts.add(dept); return Domain_AjaxResult.success(depts); } /** * 单个部门 用户 * * @param deptId deptId * @return ImDept */ @GetMapping("{deptId}/users") public Domain_AjaxResult users(@PathVariable(value = "deptId") String deptId) { return Domain_AjaxResult.success(vimUserApiService.getByDept(deptId)); } } 以上为后端代码,以下为前端api代码,前端是否有问题import request from '@/utils/request' // 查询父部门 export function parentDept(deptId) { return request({ url: '/api/sys/depts/parent', method: 'get', params: { deptId } }) } // 查询所有部门列表 export function listDepts() { return request({ url: '/api/sys/depts', method: 'get' }) } // 查询部门详情 export function getDept(id) { return request({ url: '/api/sys/depts/' + id, method: 'get' }) } // 查询部门用户 export function listDeptUsers(deptId) { return request({ url: '/api/sys/depts/' + deptId + '/users', method: 'get' }) } // 获取部门人数统计 export function countDept() { return request({ url: '/api/sys/depts/count', method: 'get' }) }
最新发布
08-15
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值