我正在数据库中寻找一条我不了解的精确信息。数据库在一台单独的机器上,但我可以登录它,并psql
以管理员权限启动命令行。
这是第三方产品,他们回答问题的速度很慢。我知道数据在那个数据库里面,所以我想做一点逆向工程。
给定一个表名,是否可以获得该表中列名的列表?
例如,在 SQL Server 中,可以将表转储到可重用CREATE
语句中,该语句以文本方式列出了该表所包含的所有列。
我在 Ubuntu 12.04 上使用 PostgreSQL 9.1。
我需要在一个时间范围内选择记录:我的表time_limits
有两个timestamp
字段和一个integer
属性。我的实际表中还有其他列与此查询无关。
create table (
start_date_time timestamp,
end_date_time timestamp,
id_phi integer,
primary key(start_date_time, end_date_time,id_phi);
Run Code Online (Sandbox Code Playgroud)
该表包含大约 200 万条记录。
像下面这样的查询花费了大量的时间:
select * from time_limits as t
where t.id_phi=0
and t.start_date_time <= timestamp'2010-08-08 00:00:00'
and t.end_date_time >= timestamp'2010-08-08 00:05:00';
Run Code Online (Sandbox Code Playgroud)
所以我尝试添加另一个索引 - PK的倒数:
create index idx_inversed on time_limits(id_phi, start_date_time, end_date_time);
Run Code Online (Sandbox Code Playgroud)
我的印象是性能有所提高:访问表中间记录的时间似乎更合理:介于 40 到 90 秒之间。
但是对于时间范围中间的值,它仍然是几十秒。在针对表格末尾时(按时间顺序),还有两次。
我explain analyze
第一次尝试得到这个查询计划:
Bitmap Heap Scan on time_limits (cost=4730.38..22465.32 rows=62682 width=36) (actual time=44.446..44.446 rows=0 loops=1)
Recheck …
Run Code Online (Sandbox Code Playgroud) 我在 libpq 之上为PostrgreSQL制作了一个远程应用程序草案。它表现良好,但我已经描述了应用程序的一般功能。对于我产生的每个最终业务结果,我碰巧调用了类似 40 select 子句(通过 tcpip)的东西。
我有 SQL-Server 的回忆,提醒我尽量减少远程应用程序和数据库之间的交互次数。分析了我的选择后,我确实认为我可以SELECT
使用连接将这个数字减少到 3 个子句。但我不记得SELECT
在 another 中使用 a 的结果的语法SELECT
。
例如:
SELECT * FROM individual
INNER JOIN publisher
ON individual.individual_id = publisher.individual_id
WHERE individual.individual_id = 'here I would like to use the results of a another select'
Run Code Online (Sandbox Code Playgroud)
另一个SELECT
就是这样的:
SELECT identifier FROM another_table WHERE something='something'
Run Code Online (Sandbox Code Playgroud)
这是简化的表布局,针对不同的 item_types 拒绝了多次......(3 种完全不同的类型,因此如果优化了 3 个 SQL 查询)。
table passage
id_passage PK
business_field_passage bytea
table item
id_item PK
id_passage FK …
Run Code Online (Sandbox Code Playgroud) 当我尝试pg_restore.exe
从数据库执行转储文件时,它抛出了许多错误,都是一样的:
ERROR: insert or update on table "someTable" violates foreign key constraint "aConstraintName"
这显然是因为我在从转储文件中恢复它之前已经清空了数据库(这个文件来自生产数据库)......当然,如果一个引用的表是空的,那么没有外键约束就可以了...
有没有办法禁用所有表的约束和所有外键,在我调用之前pg_restore.exe
,然后重新启用约束和外键。
在 SO 中,我发现了一些有趣的事情:将约束检查推迟到提交时间。但我不认为我可以在推迟约束后pg_restore.exe
从内部调用psql.exe
。
还有这个帖子,可以追溯到 10 年前,建议删除然后重新添加约束。或者将 pg_class reltriggers 的值更改为 0 并且这对于约束也是可能的......但我担心这比良好的实践更像是黑客攻击......
您有什么建议,在这种情况下的最佳做法是什么?pg_dump.exe
与-clean
标志一起使用会创建一个转储,在还原数据库时绕过约束检查吗?
在超时之前,我将在哪里设置查询在 MySQL 5.0.68 中等待锁定的最长时间?
鉴于reddit 上的这个问题,我清理了查询以指出问题在查询中的位置。我首先使用逗号WHERE 1=1
并使修改查询更容易,所以我的查询通常是这样结束的:
SELECT
C.CompanyName
,O.ShippedDate
,OD.UnitPrice
,P.ProductName
FROM
Customers as C
INNER JOIN Orders as O ON C.CustomerID = O.CustomerID
INNER JOIN [Order Details] as OD ON O.OrderID = OD.OrderID
INNER JOIN Products as P ON P.ProductID = OD.ProductID
Where 1=1
-- AND O.ShippedDate Between '4/1/2008' And '4/30/2008'
And P.productname = 'TOFU'
Order By C.CompanyName
Run Code Online (Sandbox Code Playgroud)
有人基本上说1=1 通常是懒惰的,而且对性能不利。
鉴于我不想“过早优化” - 我确实想遵循良好的做法。我以前看过查询计划,但通常只是为了找出我可以添加(或调整)哪些索引以使我的查询运行得更快。
那么问题真的……会Where 1=1
导致不好的事情发生吗?如果是这样,我怎么知道?
次要编辑:我也一直“假设”1=1
会被优化,或者在最坏的情况下可以忽略不计。质疑一句口头禅永远不会有什么坏处,比如“Goto's are Evil”或“过早优化......”或其他假设的事实。不确定是否1=1 AND
会实际影响查询计划。在子查询中呢?CTE的?手续?
除非需要,否则我不是要优化的人……但如果我正在做一些实际上“不好”的事情,我想尽量减少影响或在适用的情况下进行更改。
Postgres 表空间是集群范围的。因此,我如何计算每个数据库在 postgres 表空间中分配了多少空间?
我使用 Postgresql 9.1 和 ubuntu 12.04。
克雷格的回答启发,我的问题类型SETOF或SETOF纪录的级联我以为我会使用顺利return query
,setof record
等一系列的发电机到这个PLPGSQL功能:
create or replace function compute_all_pair_by_craig(id_obj bigint)
returns setof record as $$
begin
return query select o.id, generate_series(0,o.value) from m_obj as o;
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)
在执行期间我收到错误:
ERROR: set_valued function called in context that cannot accept a set
怎么了 ?与 Craig 相反,我告诉函数返回setof record
。
我可以实现与 Craig 完全一样的工作,即通过定义类型create type pair_id_value as (idx bigint, value integer)
并让我的 plpgsql 函数返回 asetof of pair_id_value
而不是setof record …
postgresql stored-procedures plpgsql set-returning-functions
我需要更新一个大小约为 18GB 的 SQL Server 数据库,以将大量TEXT
列更改为NVARCHAR(MAX)
.
我遇到的问题是在执行完所有alter table
命令后,数据库的大小最终接近 26GB。我知道从这里开始使用NVARCHAR(MAX)
将使数据库增长得更慢,但有什么办法可以防止这种膨胀?
我想在我的 postgresql 数据库中有 python3 来编写存储过程。
在psql
客户端中,当我输入命令时create extension plpython3u
,出现错误:
couldn't open extension control file /usr/share/postgresql/9.1/extension/plpython3u.control : No such file or directory
Run Code Online (Sandbox Code Playgroud)
我已经检查过,目录中有 plpythonu.control 和 plpython2u.control ,但不是版本 3 的那个。
但是,我已经从 depot安装了软件包python3
和python3-postgresql
(除其他外)。我使用的是 Ubuntu 12.04,内核 3.2.0.38,安装了 postgresql 9.1。
我应该安装(或做什么)才能在我的机器上安装 plpython3u.control 文件并在我的数据库中使用 python3?
postgresql ×7
optimization ×2
catalogs ×1
constraint ×1
explain ×1
foreign-key ×1
index ×1
join ×1
locking ×1
metadata ×1
mysql ×1
mysql-5 ×1
performance ×1
plpgsql ×1
python ×1
restore ×1
select ×1
sql-server ×1