我这里有一个简单的 PostgreSQL 实例,由构建脚本生成。目标是在一段时间内(例如 5 分钟左右)没有新的连接请求时自动安全关闭。
最好的方法是什么?postgresql.conf
而类似的人在这样的问题上却出人意料地保持沉默。
我这里有一个简单的 PostgreSQL 实例,由构建脚本生成。目标是在一段时间内(例如 5 分钟左右)没有新的连接请求时自动安全关闭。
最好的方法是什么?postgresql.conf
而类似的人在这样的问题上却出人意料地保持沉默。
我有以下输入:
id | value
----+-------
1 | 136
2 | NULL
3 | 650
4 | NULL
5 | NULL
6 | NULL
7 | 954
8 | NULL
9 | 104
10 | NULL
我期待以下结果:
id | value
----+-------
1 | 136
2 | 136
3 | 650
4 | 650
5 | 650
6 | 650
7 | 954
8 | 954
9 | 104
10 | 104
简单的解决方案是将表与<
关系连接起来,然后选择 a 中的MAX
值GROUP BY
:
WITH tmp AS (
SELECT t2.id, MAX(t1.id) AS lastKnownId
FROM t t1, t t2
WHERE
t1.value IS NOT NULL
AND
t2.id >= t1.id
GROUP BY t2.id
)
SELECT
tmp.id, t.value
FROM t, tmp
WHERE t.id = tmp.lastKnownId;
但是,此代码的简单执行将在内部创建输入表行数的平方(O(n^2))。我希望 t-sql 对其进行优化 - 在块/记录级别上,要做的任务非常简单且线性,本质上是一个 for 循环(O(n))。
但是,在我的实验中,最新的 MS SQL 2016 无法正确优化此查询,导致无法针对大型输入表执行此查询。
此外,查询必须快速运行,使得类似简单(但非常不同)的基于游标的解决方案不可行。
使用一些内存支持的临时表可能是一个很好的折衷方案,但我不确定它是否可以运行得更快,考虑到我使用子查询的示例查询不起作用。
我也在考虑从 t-sql 文档中挖掘出一些窗口函数,什么可以被欺骗来做我想做的事情。例如,累积总和做了一些非常相似的事情,但我无法欺骗它给出最新的非空元素,而不是之前元素的总和。
理想的解决方案是没有过程代码或临时表的快速查询。或者,使用临时表的解决方案也可以,但程序上迭代表不是。
我想转储按主键排序的表的全部内容。直觉上,我想做一个
SELECT * FROM %table_name% ORDER BY %primary_key_of(table_name)%;
这将由外部工具运行,知道表的列表,但不知道它们的主键。
如果没有更好的选择,我们可以假设所有主键都是单列的。
我使用的是 PostgreSQL-9.5,但可以升级。
我在想什么mysqldump
或pg_dump
正在做什么。因此,他们将活动数据库转储到包含 SQL 查询的文本文件中,从而重现整个数据库。在 MySQL 和 PostgreSQL 中,这是正常的数据库转储格式。
它存在于 Oracle 上吗?怎么做到呢?
如果它不是标准的 Oracle 东西,那绝对不是问题。我需要解决这个问题。导出单个表是不够的,我要求转储整个数据库。
它是一个大型项目(具有数百万行数据库)的简化开发环境,但仍然具有数百个表和非常复杂的结构。而且,我想快速玩它。当我在玩它时,我还需要能够对其执行棘手的修改。在二进制转储上我不能这样做,在文本上我可以。
所以。SQLPlus 简单地给出了我的第一次尝试(在有一点 postgresql 经验之后):
SQL> SELECT * FROM MYTABLESPACE.MYTABLE;
SELECT * FROM MYTABLESPACE.MYTABLE
*
ERROR at line 1:
ORA-00942: table or view does not exist
我也尝试过SELECT * FROM MYTABLESPACE$MYTABLE
(直观的尝试)并且SELECT * FROM MYTABLE
也很简单,但没有成功。谷歌搜索提供了很多关于表空间管理的信息,但这个微不足道的问题却一无所获。
该怎么办?
扩展#1:好吧,看起来对表空间和模式确实存在一个小误解。但问题仍然很明显:我可以访问该dba_tables
表,我可以访问它的其中一条记录,我想查询该表所描述的表,但它不起作用。
扩展 #2:这是我所做的。我打电话sqlplus
给system
账号(sqlplus system/****
):
SQL> SELECT * FROM (SELECT * FROM dba_tables WHERE tablespace_name='MYTABLESPACE') WHERE ROWNUM<=1;
OWNER TABLE_NAME TABLESPACE_NAME CLUSTER_NAME IOT_NAME STATUS PCT_FREE PCT_USED INI_TRANS
------------------------------ ------------------------------ ------------------------------ ------------------------------ ------------------------------ -------- ---------- ---------- ----------
MAX_TRANS INITIAL_EXTENT NEXT_EXTENT MIN_EXTENTS MAX_EXTENTS PCT_INCREASE FREELISTS FREELIST_GROUPS LOG B NUM_ROWS BLOCKS EMPTY_BLOCKS AVG_SPACE CHAIN_CNT AVG_ROW_LEN
---------- -------------- ----------- ----------- ----------- ------------ ---------- --------------- --- - ---------- ---------- ------------ ---------- ---------- -----------
AVG_SPACE_FREELIST_BLOCKS NUM_FREELIST_BLOCKS DEGREE INSTANCES CACHE TABLE_LO SAMPLE_SIZE LAST_ANA PAR IOT_TYPE T S
------------------------- ------------------- ---------------------------------------- ---------------------------------------- -------------------- -------- ----------- -------- --- ------------ - -
NES BUFFER_ FLASH_C CELL_FL ROW_MOVE GLO USE DURATION SKIP_COR MON CLUSTER_OWNER DEPENDEN COMPRESS COMPRESS_FOR DRO REA SEG RESULT_
--- ------- ------- ------- -------- --- --- --------------- -------- --- ------------------------------ -------- -------- ------------ --- --- --- -------
EXAMPLEOWNER MYTABLE MYTABLESPACE VALID 10 1
255 65536 1048576 1 2147483645 NO N
1 1 N ENABLED NO N N
NO DEFAULT DEFAULT DEFAULT DISABLED NO NO DISABLED YES DISABLED DISABLED NO NO YES DEFAULT
SQL> SELECT * FROM MYTABLE;
SELECT * FROM MYTABLE
*
ERROR at line 1:
ORA-00942: table or view does not exist
我正在考虑这个问题,如果有多个列,搜索必须尽快进行。
例如,查看TEST(COL_A, COL_B)
带有(树)索引的表TEST_IDX(COL_A, COL_B)
。该索引可用于以下WHERE
条件:
WHERE COL_A='x' AND COL_B='y'
WHERE COL_A='x' AND COL_B<'y'
但是,如果两个条件项都使用不等式怎么办?所以我在想一个WHERE COL_A<'x' AND COL_B<'y'
?AFAIK,在这种情况下,普通的记录树索引是行不通的。我可以想象一些数据结构可以使这样的查询也很快,但我认为它应该使用更复杂的数据结构作为一个简单的树。
这在MySQL中存在吗?或者在另一个 SQL 服务器中?
我在我的sqlplus glogin.sql 中设置了一个提示有点长,主要是因为一些内部变量和控制序列。启动 sqlplus 我收到以下错误:
String beginning "truncated_prompt..." is too long. Maximum size is 50 characters.
SQL>
...是的,我的提示确实被截断为 50 个字符。
该怎么办?是否有可能以某种方式使这个限制更高?(我已经尝试过了SET LONG
,SET LONGC
没有任何改变。)
(反应评论)我有这么长的提示,因为我有一些控制序列,这使它如此美丽。我通过 rlwrapper 调用它,这使得普通键(向上/向下翻页、历史搜索、制表符完成等)也可以正常工作,就像在一个好的命令行应用程序中一样。
我使用 DBI。我想做一些像
INSERT INTO ... VALUES (the_generated_timestamp, ...);
命令是什么?它是如何创建的,perlocaltime
标量值具有非常复杂的、针对人眼优化的格式(fe Mon Apr 28 15:58:51 2014
)。我的目标有点像 unixgettimeofday()
所做的(归还自 1970.1.1 以来的秒数),由一些格式字符串转换,我可以让 Oracle 吃掉它。
但任何更简单的解决方案也可以,如果存在的话。
它需要在 perl 中生成。INSERT ... (current_timestamp, ...)
不行。
我想从 Oracle 实例中删除所有实体。我想删除所有表、用户、索引等,就像它是一个新创建的实例一样。结果应该看起来,或者至少从客户端的角度来看非常接近,就好像我已经完全删除然后重新安装了具有相同设置的实例。
通过完全擦除/重新安装来执行此操作很慢,并且不容易自动化。我正在寻找更好的选择,但如果没有的话,这是一个可能的解决方案。
删除模式是不够的,因为一些实体仍然保留在原处(例如,用户)。
有没有一种简单的方法可以放下所有东西,达到最初的清洁和清空状态,但更快?
我正在使用德语 oracle 11.2.0g 安装,它有一些命令行工具与一些非 ascii 字符(ü、ö 等)通信。这些是用 iso8859-1 编码写出的,但我需要将它们作为 utf-8 用于某些脚本。可能吗?
附加信息:
特定语言的输出没问题,它可以毫无问题地提供德语输出。唯一的问题是它来自 iso8859-1 而不是 utf-8。
它是由来自 cygwin 的 iconv 命令转换的,但我只是将其用作最后的手段。最好的是,如果我能够以某种方式设置 utf-8。
另一个工具(来自 cygwin 的 fe 工具)工作没有任何问题。