character 7 depts_wo_emps.sql

本文通过具体示例展示了如何使用不同的SQL语法来查询没有员工的部门,并比较了各种查询方式的执行计划,以此来说明SQL语句的不同写法对Oracle数据库性能的影响。
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;
select DISTINCT pi.code_ip AS 住院号, pv.name_pi AS 姓名, DECODE(pi.DT_SEX, '02', '男', '03', '女', '') AS 性别, pv.age_pv AS 年龄, HP.OCCUP_NAME AS 职业, PI.ID_NO AS 身份证号, TO_CHAR(pv.date_begin,'YYYY-MM-DD') AS 入院日期, TO_CHAR(pv.date_end ,'YYYY-MM-DD') AS 出院日期 , hp.in_hos_days AS 住院天数, DIAG_CODE 疾病编码 , (select to_char(wm_concat (DIAG.NAME_DIAG)) FROM PV_CLNDIAG DIAG WHERE DIAG.PK_PV=PV.PK_PV AND DIAG.DT_DIAGTYPE='0100' ) as 入院诊断, (select DIAG.NAME_DIAG FROM PV_CLNDIAG DIAG WHERE DIAG.PK_PV=PV.PK_PV AND DIAG.DT_DIAGTYPE='0109' AND DIAG.FLAG_MAJ='1' ) as 出院主诊断, CONSULT_NAME 经治医师 , HP.curr_phone 电话, HP.contact_name 联系人姓名, HP.contact_phone 联系人电话, -------deptss.name_dept AS 病区, dept.name_dept AS 入院科室, HP.CURR_ADDR || HP.Curr_Addr_Dt AS 现住址 from pv_main pv left join pi_main pi on pi.pk_pi=pv.pk_pi left join pv_inp inp on pv.pk_pv=inp.pk_pv and inp.del_flag='0' join CLN_EMR_HP hp on pv.pk_pv=hp.pk_pv Join CLN_EMR_HP_DIAG diag on hp.pk_page=DIAG.pk_page and flag_primary='1' left join org_dept dept on dept.pk_dept=inp.pk_dept_admit left join org_dept depts on inp.pk_dept_dis=depts.pk_dept left join org_dept deptss on inp.pk_dept_ns_admit=deptss.pk_dept left join org_dept deptss on inp.pk_dept_ns_admit=deptss.pk_dept left join md_dddt dt on inp.DT_OUTCOMES=dt.CODE and dt.CODE_DEFDOCLIST='000110' left join CG_ST st on pv.pk_pv=st.pk_pv and st.EU_PVTYPE=3 and st.FLAG_CANC=0 left join md_hp hpt on st.PK_INSURANCE=hpt.pk_hp where pv.EU_PVTYPE='3' and pv.date_end >= to_date('2025-09-01 00:00:00 ', 'yyyy-mm-dd hh24:mi:ss') and pv.date_end <= to_date('2025-09-30 23:59:59 ', 'yyyy-mm-dd hh24:mi:ss') and 1 = 1 order by dept.name_dept
09-11
目录: F:\Programmer\python\MyAI\backend\routes Mode LastWriteTime Length Name ---- ------------- ------ ---- d----- 2025/11/7 21:43 __pycache__ -a---- 2025/11/7 21:36 4642 admin_stats_routes.py -a---- 2025/11/7 22:16 5697 ai_chat_routes.py -a---- 2025/11/7 22:24 7524 dept_routes.py -a---- 2025/11/7 22:13 4645 page_routes.py -a---- 2025/11/7 21:16 6521 room_routes.py -a---- 2025/11/7 21:16 8240 search_routes.py -a---- 2025/11/7 21:16 9967 share_routes.py -a---- 2025/11/7 21:16 6376 user_routes.py -a---- 2025/11/6 12:51 0 __init__.py # --------------- 基础依赖导入 --------------- from pathlib import Path import os import logging from fastapi.responses import HTMLResponse, RedirectResponse import uvicorn from fastapi import FastAPI, HTTPException, Request, Response from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from dotenv import load_dotenv from typing import Callable # 导入拆分后的路由模块 from backend.routes.page_routes import router as page_router from backend.routes.user_routes import router as user_router from backend.routes.ai_chat_routes import router as ai_chat_router from backend.routes.dept_routes import router as dept_router from backend.routes.room_routes import router as room_router from backend.routes.share_routes import router as share_router from backend.routes.search_routes import router as search_router from backend.routes.admin_stats_routes import router as admin_stats_router # --------------- 全局配置 --------------- # 1. 日志配置 LOG_DIR = Path(__file__).parent / "logs" LOG_DIR.mkdir(exist_ok=True) LOG_FILE = LOG_DIR / "app.log" logging.basicConfig( level=logging.INFO, format='%(asctime)s | %(levelname)s | %(message)s', handlers=[ logging.FileHandler(LOG_FILE, encoding='utf-8', mode='a'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) # 2. 项目路径与FastAPI初始化 BASE_DIR = Path(__file__).resolve().parent FRONTEND_DIR = BASE_DIR / "frontend" # 前端文件存放目录 app = FastAPI(title="智能对话平台", version="1.0") load_dotenv(dotenv_path=BASE_DIR / "backend" / ".env") # 加载环境变量 # 3. 模板和静态资源配置 app.mount("/static", StaticFiles(directory=str(FRONTEND_DIR / "static")), name="static") # --------------- 全局HTTP中间件 --------------- @app.middleware("http") async def debug_request_middleware(request: Request, call_next: Callable): # 记录请求基础信息 client_host = request.client.host if request.client else "unknown" logger.info(f"➡️ {request.method} {request.url.path} from {client_host}") # 解析用户Token(非中断式) try: from backend.jwt_handler import decode_access_token # 延迟导入避免循环依赖 access_token = request.cookies.get("access_token") user_id = decode_access_token(access_token) if access_token else None logger.info(f"👤 User ID: {user_id or 'Not logged in'}") except Exception as e: logger.warning(f"⚠️ Token decode failed: {str(e)}") user_id = None # 记录请求体(POST/PUT/PATCH) if request.method in ("POST", "PUT", "PATCH"): try: body = await request.json() logger.debug(f"📥 Request Body: {body}") except Exception as e: logger.debug(f"❌ Body parse failed: {str(e)}") # 执行请求并记录响应 response: Response = await call_next(request) logger.info(f"⬅️ Response status: {response.status_code}") return response async def http_exception_handler(request: Request, exc: HTTPException): """全局HTTP异常处理器""" if exc.status_code == 401: logger.warning(f"🚫 未登录/Token无效访问 {request.url.path},重定向到登录页") return RedirectResponse(url="/login") logger.error(f"⚠️ HTTP异常: {exc.status_code} - {exc.detail},路径: {request.url.path}") return HTMLResponse( content=f"<h1>{exc.status_code} Error</h1><p>{exc.detail}</p>", status_code=exc.status_code ) # --------------- 注册所有模块化路由 --------------- app.add_exception_handler(HTTPException, http_exception_handler) app.include_router(page_router) # 基础页面路由(无前缀) app.include_router(user_router) # 用户管理路由(前缀/api/users) app.include_router(ai_chat_router) # AI聊天路由(前缀/user2) app.include_router(dept_router) # 院系管理路由(前缀/api/depts) app.include_router(room_router) # 聊天室路由(前缀/api/rooms) app.include_router(share_router) # 分享评论路由(前缀/api/shares) app.include_router(search_router) # 搜索推荐路由(前缀/api/search) app.include_router(admin_stats_router) # 后台统计路由(前缀/api/admin/stats) # --------------- 程序入口 --------------- if __name__ == "__main__": # 启动FastAPI服务 uvicorn.run("myapp:app", host="0.0.0.0", port=8000, reload=True) 我现在有多个接口文件,现在我希望把这些文件的route集中在__init__.py,再由主程序导入注册,
最新发布
11-08
# --------------- 基础依赖导入 --------------- from pathlib import Path import os import logging from fastapi.responses import HTMLResponse, RedirectResponse import uvicorn from fastapi import FastAPI, HTTPException, Request, Response from fastapi.staticfiles import StaticFiles from fastapi.templating import Jinja2Templates from dotenv import load_dotenv from typing import Callable # 导入拆分后的路由模块 from backend.routes.page_routes import router as page_router from backend.routes.user_routes import router as user_router from backend.routes.ai_chat_routes import router as ai_chat_router from backend.routes.dept_routes import router as dept_router from backend.routes.room_routes import router as room_router from backend.routes.share_routes import router as share_router from backend.routes.search_routes import router as search_router from backend.routes.admin_stats_routes import router as admin_stats_router # --------------- 全局配置 --------------- # 1. 日志配置 LOG_DIR = Path(__file__).parent / "logs" LOG_DIR.mkdir(exist_ok=True) LOG_FILE = LOG_DIR / "app.log" logging.basicConfig( level=logging.INFO, format='%(asctime)s | %(levelname)s | %(message)s', handlers=[ logging.FileHandler(LOG_FILE, encoding='utf-8', mode='a'), logging.StreamHandler() ] ) logger = logging.getLogger(__name__) # 2. 项目路径与FastAPI初始化 BASE_DIR = Path(__file__).resolve().parent FRONTEND_DIR = BASE_DIR / "frontend" # 前端文件存放目录 app = FastAPI(title="智能对话平台", version="1.0") load_dotenv(dotenv_path=BASE_DIR / "backend" / ".env") # 加载环境变量 # 3. 模板和静态资源配置 app.mount("/static", StaticFiles(directory=str(FRONTEND_DIR / "static")), name="static") # --------------- 全局HTTP中间件 --------------- @app.middleware("http") async def debug_request_middleware(request: Request, call_next: Callable): # 记录请求基础信息 client_host = request.client.host if request.client else "unknown" logger.info(f"➡️ {request.method} {request.url.path} from {client_host}") # 解析用户Token(非中断式) try: from backend.jwt_handler import decode_access_token # 延迟导入避免循环依赖 access_token = request.cookies.get("access_token") user_id = decode_access_token(access_token) if access_token else None logger.info(f"👤 User ID: {user_id or 'Not logged in'}") except Exception as e: logger.warning(f"⚠️ Token decode failed: {str(e)}") user_id = None # 记录请求体(POST/PUT/PATCH) if request.method in ("POST", "PUT", "PATCH"): try: body = await request.json() logger.debug(f"📥 Request Body: {body}") except Exception as e: logger.debug(f"❌ Body parse failed: {str(e)}") # 执行请求并记录响应 response: Response = await call_next(request) logger.info(f"⬅️ Response status: {response.status_code}") return response async def http_exception_handler(request: Request, exc: HTTPException): """全局HTTP异常处理器""" if exc.status_code == 401: logger.warning(f"🚫 未登录/Token无效访问 {request.url.path},重定向到登录页") return RedirectResponse(url="/login") logger.error(f"⚠️ HTTP异常: {exc.status_code} - {exc.detail},路径: {request.url.path}") return HTMLResponse( content=f"<h1>{exc.status_code} Error</h1><p>{exc.detail}</p>", status_code=exc.status_code ) # --------------- 注册所有模块化路由 --------------- app.add_exception_handler(HTTPException, http_exception_handler) app.include_router(page_router) # 基础页面路由(无前缀) app.include_router(user_router) # 用户管理路由(前缀/api/users) app.include_router(ai_chat_router) # AI聊天路由(前缀/user2) app.include_router(dept_router) # 院系管理路由(前缀/api/depts) app.include_router(room_router) # 聊天室路由(前缀/api/rooms) app.include_router(share_router) # 分享评论路由(前缀/api/shares) app.include_router(search_router) # 搜索推荐路由(前缀/api/search) app.include_router(admin_stats_router) # 后台统计路由(前缀/api/admin/stats) # --------------- 程序入口 --------------- if __name__ == "__main__": # 启动FastAPI服务 uvicorn.run("myapp:app", host="0.0.0.0", port=8000, reload=True) 这是现在的主程序 # frontend/routes.py 或原文件位置 from fastapi import APIRouter, HTTPException, Request, Depends from fastapi.responses import HTMLResponse, RedirectResponse from jinja2 import Environment, FileSystemLoader from pathlib import Path import json import logging from backend.jwt_handler import get_current_user_token_data from backend.database import get_db from sqlalchemy.ext.asyncio import AsyncSession from backend.repositories.character_repo import CharacterRepository router = APIRouter() logger = logging.getLogger(__name__) BASE_DIR = Path(__file__).resolve().parent.parent.parent FRONTEND_DIR = BASE_DIR / "frontend" try: template_env = Environment(loader=FileSystemLoader(str(FRONTEND_DIR)), enable_async=True) logger.info(f"✅ 模板环境初始化成功:{FRONTEND_DIR}") except Exception as e: logger.error(f"❌ 模板环境初始化失败:{str(e)}") raise def render_template(template_name: str, **context) -> HTMLResponse: try: template = template_env.get_template(template_name) content = template.render(**context) return HTMLResponse(content=content) except Exception as e: logger.error(f"❌ 模板渲染失败:{str(e)}") raise HTTPException(status_code=500, detail="页面渲染失败") @router.get("/", response_class=HTMLResponse) async def home(): logger.info("📱 访问首页") return render_template("index.html", debug_user=None) @router.get("/login", response_class=HTMLResponse) async def login_page(): logger.info("🔑 访问登录页") return render_template("login.html") @router.get("/user2", response_class=HTMLResponse) async def chat_page( request: Request, token_data = Depends(get_current_user_token_data), db: AsyncSession = Depends(get_db) ): """聊天页面(需登录)""" current_user_id = token_data.user_id client_ip = request.client.host logger.info(f"📋 用户访问聊天页 | ID:{current_user_id} | 角色:{token_data.role} | IP:{client_ip}") repo = CharacterRepository(db) try: characters = await repo.get_all() # 如果你想加缓存,可以在这里做 chars_list = [{"id": c.id, "name": c.name, "trait": c.trait} for c in characters] characters_json = json.dumps(chars_list, ensure_ascii=False) except Exception as e: logger.error(f"❌ 加载AI角色失败:{str(e)}") raise HTTPException(status_code=500, detail="无法加载AI角色") return render_template( "chat.html", characters=chars_list, characters_json=characters_json, debug_user=current_user_id, user_role=token_data.role, user_dept=token_data.department_id ) 这是已有的page_routes,怎么修改,给我完整的代码
11-08
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值