1.使用空间索引进行快速间隔数据类型的搜索.
间隔搜索有时候很慢,大部分原因是索引优化器不使用索引,并且在开始列和结束列比较独立。一个解决方案是使用空间索引,它可以把两个独立的值当做一个值来使用。
postgres=# EXPLAIN ANALYZE SELECT * FROM testip WHERE 19999999 BETWEEN startip AND endip;
QUERY PLAN ---------------------------------------------------------------- Seq Scan on testip (cost=0.00..19902.00 rows=200814 width=12) (actual time=3.457..434.218 rows=1 loops=1) Filter: ((19999999 >= startip) AND (19999999 <= endip)) Total runtime: 434.299 ms (3 rows) Time: 435,865 ms
结论:根据以上的执行计划,可以知道上边的查询使用的是序列扫描,花费的时间是:435,865 ms
postgres=# CREATE INDEX ggg ON testip USING gist ((box(point(startip,startip),point(endip,endip))) box_ops);
使用如下的查询:
EXPLAIN ANALYZE SELECT * FROM testip WHERE box(point(startip,startip),point(endip,endip)) @> box(point (19999999,19999999), point(19999999,19999999));
结论:执行计划使用的是Bitmap Index Scan on ggg,花费的时间是:2,805 ms。可见相比以前的查询,使用空间索引的查询效率大大的提高了。
2.16进制到10进制的转换
我们已经有了系统函数将10进制转换成16进制:to_hex(11) result: b 下边的函数实现将16进制的数转换成10进制。非常的简单:
- create or replace function to_dec(text)
- returns integer as $$
- declare r int;
- begin
- execute E'select x''||$1|| E''::integer' into r;
- return r;
- end
- $$ language plpgsql;
--测试
- select to_dec('ff');
--结果
- 255
3.ALTER TABLE ALTER COLUMN USING 语法
在PostgreSQl里边,我们不能将varchar类型直接转换到bool,但是我们可以使用Using语法加判断后进行转换。
- CREATE TABLE foo(a varchar);
- INSERT INTO foo VALUES ('ano');
--更改数据类型,会报错误信息
- ALTER TABLE foo ALTER COLUMN a TYPE boolean;
- ERROR: column "a" cannot be cast to type "pg_catalog.bool"
--使用Using语法更改数据类型
- ALTER TABLE foo
- ALTER COLUMN a TYPE boolean
- USING CASE a
- WHEN 'ano' THEN true
- ELSE false END;
--更改成功
- SELECT * FROM foo;
4.Quote_ident 的使用
使用双引号是一种防止SQL注入的方法,quote_ident 可以检查参数,如果参数中包含任何非法的字符,它会在参数两边加上""
非常简单和有效,但是问题是schema.name,因为中间有点分割。问题如下:
- select quote_ident('public.foo');
他不能在schema和name两边加上双引号。
我们可以通过使用函数来按点分割上边的对象名称,在每个单独的对象上使用quote_ident来完成我们的目的:
--对数组进行表转换,针对每一列来使用quote_ident
- CREATE OR REPLACE FUNCTION quote_array(text[])
- RETURNS text AS $$
- SELECT array_to_string(array(SELECT quote_ident($1[i])
- FROM generate_series(1, array_upper($1,1)) g(i)),
- '.')
- $$ LANGUAGE SQL IMMUTABLE;
--创建函数按点进行拆分字符串
- CREATE OR REPLACE FUNCTION quote_schema_ident(text)
- RETURNS text AS $$
- SELECT quote_array(string_to_array($1,'.'))
- $$ LANGUAGE SQL IMMUTABLE;
--测试
- select quote_schema_ident('public.foo tab');
5.我们已经习惯使用PostgreSQL的exception来捕捉错误,但是错误信息一直不知道如何取得,SQLERRM变量可以给我们详细的信息
以下是一个具体的示例:
- CREATE OR REPLACE FUNCTION fn_log_error(p_function varchar, p_location int, p_error varchar)
- RETURNS void AS $$
- DECLARE
- v_sql varchar;
- v_return varchar;
- v_error varchar;
- BEGIN
--连接数据库
- PERFORM dblink_connect('connection_name', 'dbname=...');
--拼凑插入的字符串
- v_sql:= 'INSERT INTO error_log (function_name, location, error_message, error_time) '
- || 'VALUES (''' || p_function_name || ''', '
- || p_location || ', ''' || p_error || ''', clock_timestamp())';
--远程执行
- SELECT INTO v_return *
- FROM dblink_exec('connection_name', v_sql, false);
--获取远程的错误信息
- SELECT INTO v_error *
- FROM dblink_error_message('connection_name');
--如果出现错误则抛出异常
- IF position('ERROR' in v_error) > 0 OR position('WARNING' in v_error) > 0 THEN
- RAISE EXCEPTION '%', v_error;
- END IF;
- PERFORM dblink_disconnect('connection_name');
- EXCEPTION
- WHEN others THEN
--使用SQLERRM 来显示错误信息
- PERFORM dblink_disconnect('connection_name');
- RAISE EXCEPTION '(%)', SQLERRM;
- END;
- $$ LANGUAGE plpgsql SECURITY DEFINER;
SQLERRM是一个非常有用的变量,可以详细记录错误的具体信息,帮助我们分析执行中发现的错误。
6.循环优化技巧
plpgsql对于非SQL操作效率不是特别高。Plpgsql 不喜欢字符或者字符数组的累计操作,当我们也不能用Perl,因此我们只能用SQL
--使用循环,结果会比较慢的函数
- CREATE OR REPLACE FUNCTION SlowList(int) -- slow function, usable for N <= 100
- RETURNS varchar AS $$
- DECLARE s varchar = '';
- BEGIN
- FOR i IN 1..$1 LOOP
- s:= '<item>' || i || '</item>'; -- slow is s:= s || ..
- END LOOP;
- RETURN s;
- END; $$ LANGUAGE plpgsql IMMUTABLE;
--使用SQL,结果会比较快的函数
- CREATE OR REPLACE FUNCTON FastList(int) -- fast function
- RETURNS varchar AS $$
- BEGIN
- RETURN array_to_string(ARRAY(SELECT '<item>' || i || '</item>'
- FROM generate_series(1, $1) g(i)),
- '');
- END; $$ LANGUAGE plpgsql IMMUTABLE;
--结果:在循环100以下的时候差别并不是很大,当循环更多的时候,差距就非常明显,都来试试吧!
7.查询一组之中的头n条记录
我们一般的做法是使用子查询如下:
- SELECT * FROM people WHERE id IN (
- SELECT id FROM people s
- WHERE people.category = s.category
- ORDER BY age LIMIT 2)
- ORDER BY category, age;
使用连接我们也可以达到同样的效果如下:
- SELECT s1.*
- FROM people s1
- LEFT JOIN
- people s2
- ON s1.category = s2.category AND s1.age < s2.age
- GROUP BY s1.id, s1.category
- HAVING COUNT(s2.id) <= 1
- ORDER BY s1.category, COUNT(s2.id);
说明:这个SQL语句的含义是找到同一类比自己的age大的记录,最后判断比自己大的记录的个数,如果是0,那么应该排名第一,
如果是1,那么排名第二(HAVING COUNT(s2.id) <= 1)
相关推荐
在本案例中,我们将会介绍如何通过实际的业务模型来优化PostgreSQL数据库性能。此案例涉及到了数据库的常见操作,包括...通过对这些知识点的深入理解,能够帮助我们更好地理解和掌握PostgreSQL数据库的性能优化技巧。
总结而言,本书《PostgreSQL-9.0-High-Performance》是数据库管理员和开发者的宝贵资源,旨在提高他们对PostgreSQL数据库系统性能的理解,并提供实际的性能调优技巧。通过学习和应用本书提供的知识,读者可以更好地...
根据提供的文件信息,我们可以归纳和展开一系列与PostgreSQL相关的知识点,尤其聚焦于表格...这些知识点涵盖了PostgreSQL的基础到高级特性,对于初学者来说是很好的入门资料,对于经验丰富的开发者也有很高的参考价值。
Instagram作为一款全球知名的社交...这些实践经验不仅适用于Instagram,对于任何依赖PostgreSQL的大规模应用都有很高的参考价值。通过理解和应用这些方法,其他开发者和企业也能显著提升他们的PostgreSQL数据库性能。
9. 字符串:字符串是字符的序列,虽然在很多语言中被视为基本类型,但在处理时往往需要使用特殊的数据结构,如Trie树(字典树)用于高效搜索。 了解了这些基本数据结构之后,面试中可能会涉及的高级话题包括: 1. ...
总的来说,“网站开发技巧参考大全”这个文档很可能会涵盖以上提到的诸多方面,并可能提供具体的代码示例和最佳实践。通过深入学习和实践,开发者可以不断提升自己的技术水平,构建出更优秀的网站。
5. **API集成**:很多网络工具会通过API与其他服务交互,如获取天气信息、地图服务、社交媒体数据等。学习如何使用和创建API接口是现代Web开发的重要技能。 6. **安全考虑**:网络安全至关重要,包括防止SQL注入、...
这60个技巧涵盖了数据库设计的多个方面,从基础概念到高级优化,希望它们能对你在数据库设计的道路上提供宝贵的指导。在实际工作中,结合具体项目特点灵活运用这些技巧,将有助于构建高效、稳定且易于维护的数据库...
此外,`string`库提供了一些常用字符串操作,而`str`对象内置了很多方法,如`split()`用于分割字符串,`join()`用于合并字符串。 四、绘图分析 Python的`matplotlib`库是数据可视化的基础,它可以创建各种静态、...
【标题】中的“基于php实现...总的来说,这个项目涵盖了微信小程序开发、PHP后端开发、数据库管理、API设计、安全实践、学术论文撰写及答辩技巧等多个IT领域的关键知识点,对于学习和提升全栈开发能力具有很高的价值。
总之,【整站程序】8优技巧网_8ujq.zip是一个包含全面网站资源的压缩包,涉及前端与后端开发、数据库管理、服务器配置、安全实践、SEO优化、响应式设计、性能优化和网站维护等多个方面的知识。掌握这些技能对于构建...
通过这个项目,你可以学习到小程序的开发技巧、Node.js后端架构设计、API接口设计与实现、数据库操作以及文档编写等多方面技能。这是一个很好的实战项目,可以帮助你提升全栈开发的能力。在实际操作中,应按照文档...
它不仅具备高性能和稳定性,还支持多线程和连接池技术,在处理大规模数据和高并发访问方面表现出色。 - **适用场景**:适用于那些需要与PostgreSQL数据库交互的大型项目或需要高并发访问的应用程序。 - **使用技巧**...
【psql develop 8】是PostgreSQL...总的来说,psql develop 8是一个强大的PostgreSQL数据库管理工具,提供多语言支持,方便用户进行各种数据库操作。正确安装和激活软件,并熟悉其使用手册,将极大提高数据库管理效率。
在这个压缩包中,我们能够找到一个名为"销售龙虎榜:包含后端"的项目,这很可能是实现了一个销售业绩展示或者竞赛的小程序应用。下面我们将详细探讨其中涉及的关键知识点。 1. 微信小程序:微信小程序是一种轻量级...
总的来说,这个基于SpringBoot的微信小程序点餐系统项目涵盖了前后端开发、数据库设计、API接口实现等多个方面的知识,对于学习和提升全栈开发能力具有很高的价值。通过深入研究这个项目,开发者不仅能掌握...
1. **多数据库支持**:由于其"多功能"的特性,该数据库浏览器很可能支持多种常见的数据库管理系统,如MySQL、PostgreSQL、SQLite、Oracle和SQL Server等。这使得用户能够通过同一界面管理不同类型的数据库,提高了...
这个教程专注于渗透测试工具的使用,这对于初学者来说是一个很好的起点,因为很多新手在开始时可能会被各种复杂工具的使用所困扰。渗透工具,如Nmap、Metasploit、Burp Suite等,能够帮助我们发现系统漏洞、执行网络...
有很多特定于我们特定电子表格和数据库的代码。 请不要指望这会编译或正常工作。 省略了persistence.xml文件,因为它包含我的数据库密码和其他信息。 而是有一个sample-persistence.xml供您复制到 persistence.xml ...
对于想要学习这些领域的初学者来说,这是一个很好的实践项目,可以通过阅读和运行源码来提升自己的技能。同时,对于已经有一定经验的开发者,这样的项目也可以作为扩展知识和实践编程技巧的素材。