小编Ste*_*and的帖子

列出指定表的所有列

我正在数据库中寻找一条我不了解的精确信息。数据库在一台单独的机器上,但我可以登录它,并psql以管理员权限启动命令行。

这是第三方产品,他们回答问题的速度很慢。我知道数据在那个数据库里面,所以我想做一点逆向工程。

给定一个表名,是否可以获得该表中列名的列表?

例如,在 SQL Server 中,可以将表转储到可重用CREATE语句中,该语句以文本方式列出了该表所包含的所有列。

postgresql metadata information-schema catalogs

386
推荐指数
5
解决办法
74万
查看次数

优化对一系列时间戳的查询(两列)

我在 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)

postgresql index optimization explain postgresql-9.1

129
推荐指数
2
解决办法
13万
查看次数

在另一个 SELECT 的 WHERE 子句中使用 SELECT

我在 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)

postgresql join select

31
推荐指数
2
解决办法
38万
查看次数

在使用 pg_restore.exe 之前禁用约束

当我尝试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标志一起使用会创建一个转储,在还原数据库时绕过约束检查吗?

postgresql foreign-key constraint restore

22
推荐指数
1
解决办法
2万
查看次数

在 MySQL 中设置“锁定等待超时”

在超时之前,我将在哪里设置查询在 MySQL 5.0.68 中等待锁定的最长时间?

mysql mysql-5 locking

16
推荐指数
2
解决办法
6万
查看次数

好、坏或无所谓:哪里 1=1

鉴于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的?手续?

除非需要,否则我不是要优化的人……但如果我正在做一些实际上“不好”的事情,我想尽量减少影响或在适用的情况下进行更改。

performance optimization

16
推荐指数
3
解决办法
1万
查看次数

如何获得每个 postgres 数据库实际分配的表空间大小?

Postgres 表空间是集群范围的。因此,我如何计算每个数据库在 postgres 表空间中分配了多少空间?

postgresql

12
推荐指数
1
解决办法
2万
查看次数

错误:在不能接受集合的上下文中调用 set_valued 函数。它是关于什么的?

我使用 Postgresql 9.1 和 ubuntu 12.04。

克雷格的回答启发,我的问题类型SETOF或SETOF纪录的级联我以为我会使用顺利return querysetof 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

11
推荐指数
1
解决办法
2万
查看次数

SQL Server 更改表将 TEXT 更改为 NVARCHAR(MAX) 大大增加了数据库大小

我需要更新一个大小约为 18GB 的​​ SQL Server 数据库,以将大量TEXT列更改为NVARCHAR(MAX).

我遇到的问题是在执行完所有alter table命令后,数据库的大小最终接近 26GB。我知道从这里开始使用NVARCHAR(MAX)将使数据库增长得更慢,但有什么办法可以防止这种膨胀?

sql-server

8
推荐指数
2
解决办法
1万
查看次数

无法打开扩展控制文件 plpython3u.control : 没有这样的文件或目录

我想在我的 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安装了软件包python3python3-postgresql(除其他外)。我使用的是 Ubuntu 12.04,内核 3.2.0.38,安装了 postgresql 9.1。

我应该安装(或做什么)才能在我的机器上安装 plpython3u.control 文件并在我的数据库中使用 python3?

postgresql postgresql-9.1 python postgresql-extensions

8
推荐指数
1
解决办法
5123
查看次数