SQL查询优化

By simon at 2018-02-28 • 0人收藏 • 71人看过

Postgres / PGSQL中的查询优化的基本原则是什么? 甲骨文?

3 个回复 | 最后更新于 2018-02-28
2018-02-28   #1

也许创建适当的索引,并正确缩进你的查询,是 我可以给你的最好建议

2018-02-28   #2

我遵循以下[优化](http://beginner-sql-tutorial.com/sql- query-tuning.htm)技术 1)sql查询becom如果你在SELECT中使用实际的列名,速度会更快 声明而不是'*'。 例如:将查询写为

SELECT id, first_name, last_name, age, subject FROM student_details;
代替:
SELECT * FROM student_details;
2)HAVING子句用于在所有行被选中后过滤行。 它就像一个过滤器河不要将HAVING子句用于任何其他目的。对于 示例:将查询写为
SELECT subject, count(subject)
FROM student_details
WHERE subject != 'Science'
AND subject != 'Maths'
GROUP BY subject;
代替:
SELECT subject, count(subject)
FROM student_details
GROUP BY subject
HAVING subject!= 'Vancouver' AND subject!= 'Toronto';
3)Som有时你可能在主查询中有多个子查询。尝试 尽量减少查询中子查询块的数量。对于例如:写入 查询为
SELECT name
FROM employee
WHERE (salary, age ) = (SELECT MAX (salary), MAX (age)
FROM employee_details)
AND dept = 'Electronics';
代替:
SELECT name
FROM employee
WHERE salary = (SELECT MAX(salary) FROM employee_details)
AND age = (SELECT MAX(age) FROM employee_details)
AND emp_dept = 'Electronics';
4)使用运算符EXISTS,IN和表格在y中适当地加入我们的查询。一个) 通常IN具有最慢的性能。 b)大多数情况下,IN是有效的 过滤条件在子查询中。 C)当大多数情况下EXISTS是有效的 过滤条件在主查询中。 例如:将查询写为
Select * from product p
where EXISTS (select * from order_items o
where o.product_id = p.product_id)
Instead:
Select * from product p
where product_id IN
(select product_id from order_items
5)当使用涉及表的连接时,使用EXISTS而不是DISTINCT 有一对多的关系。对于示例:将查询写为
SELECT d.dept_id, d.dept
FROM dept d
WHERE EXISTS ( SELECT 'X' FROM employee e WHERE e.dept = d.dept);
代替: 9
SELECT id, first_name, last_name, age, subject FROM student_details;
6)尝试使用UNION ALL来代替UNION。例如:写查询为
SELECT id, first_name
FROM student_details_class10
UNION ALL
SELECT id, first_name
FROM sports_team;
代替:
SELECT id, first_name, subject
FROM student_details_class10
UNION
SELECT id, first_name
FROM sports_team;
7)在WHERE子句中使用条件时要小心。例如:写t他 查询为
SELECT id, first_name, age FROM student_details WHERE age > 10;
代替:
SELECT id, first_name, age FROM student_details WHERE age != 10;
将查询写为
SELECT id, first_name, age
FROM student_details
WHERE first_name LIKE 'Chan%';
代替:
SELECT id, first_name, age
FROM student_details
WHERE SUBSTR(first_name,1,3) = 'Cha';
写查询a小号
SELECT id, first_name, age
FROM student_details
WHERE first_name LIKE NVL ( :name, '%');
代替:
SELECT id, first_name, age
FROM student_details
WHERE first_name = NVL ( :name, first_name);
将查询写为
SELECT product_id, product_name
FROM product
WHERE unit_price BETWEEN MAX(unit_price) and MIN(unit_price)
代替:
SELECT product_id, product_name
FROM product
WHERE unit_price >= MAX(unit_price)
and unit_price <= MIN(unit_price)
将查询写为
SELECT subject, count(subject)
FROM student_details
WHERE subject != 'Science'
AND subject != 'Maths'
GROUP BY subject;
0 代替:
SELECT id, name, salary
FROM employee
WHERE dept || location= 'ElectronicsBangalore';
在查询的一边使用非列表达式,因为它是 较早处理。 写t他查询为
SELECT id, name, salary
FROM employee
WHERE salary < 25000;
代替:
SELECT id, name, salary
FROM employee
WHERE salary + 10000 < 35000;
将查询写为
SELECT id, first_name, age
FROM student_details
WHERE age > 10;
代替:
SELECT id, first_name, age
FROM student_details
WHERE age NOT = 10;
8)使用DECODE避免扫描相同的行或加入同一个表 反复。 DECODE也可以用来代替GROUP BY或ORDER BY 条款。例如:将查询写为
SELECT id FROM employee
WHERE name LIKE 'Ramesh%'
and location = 'Bangalore';
代替: SELECT DECODE(location,'Bangalore',id,NULL)id FROM employee在哪里名字喜欢 '拉梅什%'; 9)要存储较大的二进制对象,首先将它们放置在文件系统中并添加 t中的文件路径他数据库。 10)编写能够提供高效性能的查询 SQL标准规则。 a)使用单个案例适用于所有SQL动词 b)开始新行上的所有SQL动词 c)用一个空格分隔所有单词 d)右对齐或左对齐动词在最初的SQL动词中

2018-02-28   #3

一个非常普遍的方法是:   1.确定查询的哪一部分花费最多时间   2.重写那部分查询一种导致相同结果的不同方式   再次测量   4.如果它没有改善查询或您想要的,请再次转到#1进一步优化 如果重写查询没有帮助,则应考虑添加索引 数据库不是ne编辑阅读完整的表格。但是这种方法 测量,再次改变和测量仍然是一样的。 为了识别在查询的昂贵部分中,您可以使用“解释计划”或 Oracle中的“Autotrace”。你会在诸如SQL Deve之类的工具中找到它loper和TOAD。 他们会告诉你如何执行你的查询(执行计划)以及如何执行 代价高昂的是计划的一部分。 如果你的d数据库有相当大的规模,你主要想看 执行计划中的全表扫描。他们是第一目标 优化。

登录后方可回帖

Loading...