sql函数与string拼接查询id集合哪个效率高

2025-06-27 17:18:00
推荐回答(1个)
回答1:

由于SQL面向结面向程查询语言所般支持SQL语言型关系型数据库都使用基于查询本优化器即查询提供佳执行策略于优化器输入条查询语句输执行策略 条SQL查询语句种执行策略优化器估计全部执行所需间少所谓本低种所优化都基于用记所使用查询语句where句优化器where句优化主要用搜索参数(Serach Argument) 搜索参数核思想数据库使用表字段索引查询数据必直接查询记录数据 带 =、<、、>= 等操作符条件语句直接使用索引列搜索参数: emp_id = "10001" 或 salary > 3000 或 a =1 and c = 7 列则搜索参数: salary = emp_salary 或 dep_id != 10 或 salary * 12 >= 3000 或 a=1 or c=7 应尽能提供些冗余搜索参数使优化器更选择余请看3种: 第种: select employee.emp_name,department.dep_name from department,employee where (employee.dep_id = department.dep_id) and (department.dep_code='01') and (employee.dep_code='01'); 搜索析结: Estimate 2 I/O operations Scan department using primary key for rows where dep_code equals '01' Estimate getting here 1 times Scan employee sequentially Estimate getting here 5 times 第二种: select employee.emp_name,department.dep_name from department,employee where (employee.dep_id = department.dep_id) and (department.dep_code='01'); 搜索析结: Estimate 2 I/O operations Scan department using primary key for rows where dep_code equals '01' Estimate getting here 1 times Scan employee sequentially Estimate getting here 5 times 第种与第二种运行效率相同第种优化器提供更选择机 第三种: select employee.emp_name,department.dep_name from department,employee where (employee.dep_id = department.dep_id) and (employee.dep_code='01'); 种使用索引优化…… 使用SQL语句应注意几点: 1、避免使用兼容数据类型例FloatIntegerCharVarcharBinaryLong Binary兼容数据类型兼容能使优化器执行些本进行优化操作例: select emp_name form employee where salary > 3000; 语句若salaryFloat类型则优化器难其进行优化3000整数我应编程使用3000.0要等运行让DBMS进行转化 2、尽量要使用表达式编绎所SQL能使用其平均密度估计要命记录数 3、避免搜索参数使用其数操作符: select emp_name from employee where salary * 12 > 3000; 应改: select emp_name from employee where salary > 250; 4、避免使用 != 或 > 等操作符使系统使用索引能直接搜索表数据 目前,几乎所应用程序都要数据库打交道通查询数据库容易获想要数据,令满意:某些查询间,响应速度慢究其原,硬件设备(CPU、磁盘)存取速度跟,内存容量够,需要计算机制造商努力;另面没进行查询优化本文查询优化问题,谈点实践体 解查询 种查询解执行,根据付销少决定何解,何执行便叙述,先给例 关系:SUPPLIER(S#,SNAME,CITY) :S(关键字) PARTS  (P#,PNAME,SIZE)  :P(关键字) PROJECT (J#,JNAME,COLOR) :J(关键字) INVENTORY(S#,P#,QO) :V(关键字) SUPPLY(S#,J#,P#,QU) :Y(关键字) 其,QO:现数量 QU:要用数量 查询找某城市能提供黑色轿车,且供应量于1000供应商名单 1. 般查询 (1) 形卡氏积 S×P×J×V×Y; (2) 卡氏积选择满足条件元组; (3) S.SNAME投影 5元查询查询涉及卡氏积,卡氏积元组数组合性增,仅需要量存储空间,且执行查询间 2. 优化查询 该查询解处理介绍两种: (1) 元查询提取任N元查询Q(X1,X2......Xn)替换元查询Q1其执行Q2,即Q→(Q1,Q2) (2) 化简 Q替换两查询Q1Q2,Q2Q1执行执行,变化,即Q1(X1,X2......Xm), Q2(Xm,Xm+1......Xn) 例例查询两元查询 SELECT P# FROM P WHERE P.PNAME=‘轿车’ AND P.COLOR=‘黑色’ SELECT S#,J#,P#,QO FROM Y WHERE V.QO>1000 另部查询: SELECT S.SNAME FROM S,P,J,V,Y WHERE (S.S#=V.S# AND S.S#=Y.S# AND   S.CITY=J.CITY AND P.P#=V.P# AND   T.P#=V.P# AND J.J#=Y.J#) 面例查询容易化简化涉及(P,V)查询其执行涉及(S,J,Y,V)查询: SELECT S.SNAME FORM S,J,V,Y WHERE S.CITY=J.CITY AND S.S#=Y.S# AND   J.J#=Y.J# AND V.QO>1000 AND P.#=Y.P# AND V.S#=Y.S# AND  V.P#=(SELECT V.P#   FROM  V,P WHERE V.P#=P P#AND P.PNAME=‘轿车’ AND P.COLOR=‘黑色’) 3. 综所述 元查询提取几乎总处,关系运算前尽能减少关系体积减少相应系统销起作用;·通期待优化结,并绝 选择优存取路径 计算查询表达式值要充考虑索引、数据存储布等存取路径,进步提高查询效率例,选择字段、连接字段否索引,利用索引HASHING算快速存取包含索引属性特定值记录建立索引,用户按顺序读文件记录,依照接近于物理顺序顺序读文件记录非效种接近物理顺序读取文件记录索引称聚簇索引聚簇索引使我利用存储块记录物理聚簇优点,加快查询速度面具体谈点实践体 前久,笔者参加内发外数据库应用系统编程工作该系统台使用Oracle 7.3数据库,OracleDBMS处理SQL执 行语句顺序: (1) 根据WHERE句选择行; (2) 根据GROUP BY句些行进行聚合; (3) 每组用组函数计算结; (4) 根据HAVING句选择排除组; (5) 根据ORDER BY句组函数所结组进行排序 体现查询优化思路执行顺序,查询性能具直接影响般说,WHERE句滤记录越,查询速度越快减少GROUP BY运算必须处理行数量工作笔者体 1. 尽量避免连接 例: PowerBuilder 5.0数据窗口选择库表自各表相同属性名(域相同)连接起种自连接数情况益,些情况却需要取消连接查询条件P2000、P3000、P4000效区都1,两种: (1) WHERE(P2000.效区=P3000.效区   P3000.效区=P4000.效区 P2000.效区=1 (2) WHERE(P2000.效区=1 P3000.效区=1 P4000.效区=1 第种自基础添加P2000.效区=1,第二种先要取消连接,再重新写WHERE语句表面看,第种简单,其实第种降低执行效率,必要连接所笔者提醒使用者,要省事降低系统效率 2. 选择佳解决案 解决同问题固,应用应该选择佳解决例,某问题数据库查询两种,执行结,效率却同 查询要求:程序运行界面输入负责代码(放code),查询P2000表负责代码等于code负责名;没输入负责代码,查询P2000表所负责名负责代码取值范围0~9999,两种解决别: (1) IF 没输入负责代码 THEN code1=0 code2=9999 ELSE code1=code2=负责代码 END IF 执行SQL语句: SELECT 负责名 FROM P2000 WHERE 负责代码>=:code1 AND负责代码   1001) OR order_num=1008 虽customer_numorder_num建索引面语句优化器使用顺序存取路径扫描整表语句要检索离行集合所应该改语句: SELECT * FROM orders WHERE customer_num=104 AND order_num>1001 UNION SELECT * FROM orders WHERE order_num=1008 能利用索引路径处理查询 4.避免相关查询 列标签同主查询where句查询现能主查询列值改变查询必须重新查询查询嵌套层越效率越低应尽量避免查询查询避免要查询滤掉尽能行 5.避免困难规表达式 MATCHESLIKE关键字支持通配符匹配技术叫规表达式种匹配特别耗费间例:SELECT * FROM customer WHERE zipcode LIKE 98_ _ _ 即使zipcode字段建立索引种情况采用顺序扫描式语句改SELECT * FROM customer WHERE zipcode >98000执行查询利用索引查询显提高速度 另外要避免非始串例语句:SELECT * FROM customer WHERE zipcode[23] >80where句采用非始串语句使用索引 6.使用临表加速查询 表集进行排序并创建临表能加速查询助于避免重排序操作且其面能简化优化器工作例: SELECT cust.namercvbles.balance……other columns FROM custrcvbles WHERE cust.customer_id = rcvlbes.customer_id AND rcvblls.balance>0 AND cust.postcode>98000 ORDER BY cust.name 查询要执行止所未付款客户找放临文件并按客户名字进行排序: SELECT cust.namercvbles.balance……other columns FROM custrcvbles WHERE cust.customer_id = rcvlbes.customer_id AND rcvblls.balance>0 ORDER BY cust.name INTO TEMP cust_with_balance 面式临表查询: SELECT * FROM cust_with_balance WHERE postcode>98000 临表行要比主表行少且物理顺序所要求顺序减少磁盘I/O所查询工作量幅减少 注意:临表创建反映主表修改主表数据频繁修改情况注意要丢失数据 7.用排序取代非顺序存取 非顺序磁盘存取慢操作表现磁盘存取臂移SQL语句隐藏情况使我写应用程序容易写要求存取量非顺序页查询 些候用数据库排序能力替代非顺序存取能改进查询 数据库查询优化技术(2) 际 实例析 面我举制造公司例说明何进行查询优化制造公司数据库包括3表模式所示: 1.part表 零件号 零件描述 其列 (part_num) (part_desc) (other column) 102032 Seageat 30G disk …… 500049 Novel 10M network card …… …… 2.vendor表 厂商号 厂商名 其列 (vendor _num) (vendor_name) (other column) 910257 Seageat Corp …… 523045 IBM Corp …… …… 3.parven表 零件号 厂商号 零件数量 (part_num) (vendor_num) (part_amount) 102032 910257 3,450,000 234423 321001 4000000 …… 面查询些表定期运行并产关于所零件数量报表: SELECT part_descvendor_namepart_amount FROM partvendorparven WHERE part.part_num=parven.part_num AND parven.vendor_num = vendor.vendor_num ORDER BY part.part_num 建立索引述查询代码销十巨我零件号厂商号建立索引索引建立避免嵌套反复扫描关于表与索引统计信息: 表 行尺寸 行数量 每页行数量 数据页数量 (table) (row size) (Row count) (Rows/Pages) (Data Pages) part 150 10000 25 400 Vendor 150 1000 25 40 Parven 13 15000 300 50 索引 键尺寸 每页键数量 页面数量 (Indexes) (Key Size) (Keys/Page) (Leaf Pages) part 4 500 20 Vendor 4 500 2 Parven 8 250 60 看起相简单3表连接其查询销通查看系统表看part_numvendor_num簇索引索引按照物理顺序存放parven表没特定存放序些表说明缓冲页非顺序存取功率语句优化查询规划:首先part顺序读取400页再parven表非顺序存取1万每2页(索引页、数据页)总计2万磁盘页vendor表非顺序存取1.5万合3万磁盘页看索引连接花费磁盘存取5.04万 实际我通使用临表3步骤提高查询效率: 1.parven表按vendor_num序读数据: SELECT part_numvendor_numprice FROM parven ORDER BY vendor_num INTO temp pv_by_vn 语句顺序读parven(50页)写临表(50页)并排序假定排序销200页总共300