部分原因是在完全安装 Oracle 客户端时遇到版本冲突或位数问题,我的开发团队(我是其中的成员)一直在转向使用Oracle Instant Client并避免在我们的开发机器上安装大多数新项目。这已经很有效了,甚至到了我们使用此设置部署到生产的程度。由于我们主要是一家 .NET 商店,因此我们使用本机客户端(带有 .NET 包装器),而不是 Java 客户端。
现在客户端要求我们向 LDAP 服务器注册数据库服务并使用 LDAP 服务器进行名称查找。他们提供sqlnet.ora
和ldap.ora
显示文件(以及伴随的加密的配置文件)是正确的。特别是,该sqlnet.ora
文件确实将 LDAP 指定为查找网络服务名称的可能来源:
names.directory_path=(tnsnames,ldap)
Run Code Online (Sandbox Code Playgroud)
我相信我正在使用的机器可以使用 LDAP 访问服务,因为我能够使用 SQL Developer(它允许我直接输入 LDAP 信息)来访问该服务。假设它们是正确的,如何让 Instant Client 识别此配置并使用 LDAP 进行名称查找?
我已尝试将TNS_ADMIN
环境变量设置为包含所提供文件的目录,虽然这对于使 Instant Client 识别tnsnames.ora
文件很有效,但似乎不足以让它开始查看 LDAP。以下是结果(更改了路径、用户名和密码):
(以下命令恰好是 Windows 命令提示符,但我想在 Linux 上也可以执行类似的操作。这里sqlplus
看到的也是 Instant 版本,在同一目录中附带了 Instant Client 二进制文件。)
C:\TEMP>SET TNS_ADMIN=C:\path\to\sqlnet\ldap\and\tnsnames\ora\files
C:\TEMP>echo %TNS_ADMIN%
C:\path\to\sqlnet\ldap\and\tnsnames\ora\files
C:\TEMP>sqlplus.exe USERNAME/PASSWORD@LOCALTNSNAME
SQL*Plus: Release 11.2.0.2.0 Production on Mon Jul 7 10:22:25 2014
Copyright (c) …
Run Code Online (Sandbox Code Playgroud) 我有一个表格,其中的行可以相互关联,从逻辑上讲,两行之间的关系是双向的(基本上是无方向的)。(如果您想知道,是的,这确实应该是一张表。它是完全相同的逻辑实体/类型的两个事物。)我可以想到几种方法来表示这一点:
这些方式有哪些主要的优缺点,当然,还有什么我没有想到的方式?
这是一个可以玩的 SQLFiddle:http ://sqlfiddle.com/#!12/7ee1a/1/0 。(碰巧是 PostgreSQL,因为那是我正在使用的,但我认为这个问题不是 PostgreSQL 特有的。)它目前存储关系及其反向仅作为示例。
我需要对表中的所有行执行简单的更新。该表有 40-50 百万行。在此期间删除索引和约束会UPDATE
导致巨大的性能改进。
但是自动吸尘器呢?autovacuum 可以启动 aVACUUM
还是ANALYZE
在 a 的中间UPDATE
?如果是这样,那会消耗机器资源的无用工作。我可以先在桌子上禁用它UPDATE
,然后再重新启用它:
ALTER TABLE my_table
SET (autovacuum_enabled = false, toast.autovacuum_enabled = false);
-- Drop constraints, drop indexes, and disable unnecessary triggers
UPDATE my_table SET ....;
-- Restore constraints, indexes, and triggers
ALTER TABLE my_table
SET (autovacuum_enabled = true, toast.autovacuum_enabled = true);
Run Code Online (Sandbox Code Playgroud)
如果我在第一个之后不提交,这甚至有效ALTER
吗?
另外,如果我在禁用它UPDATE
,将它触发后的更新,还是会因为它是他们中禁用它忽略这些更新?(我怀疑它会运行,但我宁愿确定。)
我现在正在使用 PG 9.3,但应该很快就会升级。因此,任何提及新版本更改的内容都值得赞赏。
考虑函数内的以下(不完整的)PL/pgSQL 块:
CREATE OR REPLACE FUNCTION my_calc(myvar1 NUMERIC, myvar2 NUMERIC)
RETURNS NUMERIC
RETURNS NULL ON NULL INPUT
IMMUTABLE
LANGUAGE plpgsql
AS $$
BEGIN
RETURN some_third_party_function(myvar1, myvar2);
EXCEPTION WHEN internal_error THEN
IF SQLERRM LIKE 'KnownErrorPrefix:%' THEN
RETURN 0;
ELSE
-- Reraise the original exception here
RAISE EXCEPTION '%', SQLERRM;
END IF;
END
$$
Run Code Online (Sandbox Code Playgroud)
当发生意外错误时,此代码将引发具有相同消息的新异常。但是,它不会保留原始类型或上下文。
如何重新引发或重新抛出未修改的原始异常?
考虑下表:
ID | GROUP_ID | ORDER_VAL | RESET_VAL | VAL
---+----------+-----------+-----------+-----
1 | 1 | 1 | (null) | 3
2 | 1 | 2 | (null) | 2
3 | 1 | 3 | (null) | 1
4 | 1 | 4 | 4 | 2
5 | 1 | 5 | (null) | 1
6 | 2 | 1 | (null) | 4
7 | 2 | 2 | 2 | 3
8 | 2 | 3 | …
Run Code Online (Sandbox Code Playgroud) Oracle有用于编码的二进制值,特别是一个功能RAW
类型,成BASE64: BASE64_ENCODE
。这是有道理的。我想把二进制文件变成我可以更轻松地跨系统移植的东西。
但是,除了接受二进制RAW
作为其输入之外,它还RAW
为其输出返回一个二进制。我觉得这非常令人困惑,因为 base64 的目的是以文本格式对字节进行编码。
那么这个输出RAW
实际上包含什么?将其转换为实际文本类型(例如,VARCHAR2
)的正确方法是什么?
我还假设BASE64_DECODE
它的输入与 的输出格式相同BASE64_ENCODE
,但请注意,如果不是这种情况。
我专门使用 Oracle 11.2,但我怀疑自从它被引入以来这已经改变了。如果我错了,请随时纠正我的错误。
我有一个表,其中包含一些基于其他表的预先计算的数据。(考虑到我必须处理的数据大小,动态计算的计算成本太高。)随着源数据的添加,我将逐步生成。(UPDATE
在正常使用中我永远不需要它;部分可能会被删除和重新生成。)该表将相当大。它目前大约有 5000 万行,并且每年都会增长。
对该表的大多数查询都将通过外键 ID 列进行过滤。因此,如果该 ID 的所有行都分组到相同的页面中,它们的性能会更好。我可以通过创建索引和CLUSTER
定期调用来保证磁盘上的这种排序,但这显然不太理想,因为它需要某种计划任务,根据使用情况和其他计划任务进行协调等。
但是,由于我以与我想要使用的外键相关的块的形式生成这些数据CLUSTER
,因此我可以轻松地ORDER BY
在INSERT
命令中添加一个子句:
INSERT INTO big_table (source_table1_id,a,b,c)
SELECT
source_table1_id,
5 /* some formula */,
/* ... */
FROM source_table1
JOIN source_table2 ON ...
...
WHERE ... /* some condition indicating what needs to be generated */
ORDER BY source_table1_id
Run Code Online (Sandbox Code Playgroud)
这是否会影响磁盘存储顺序,将行分组为接近最小页数?如果确实如此,是否还有其他进程可能会在以后弄乱磁盘顺序?
我目前正在使用 PostgreSQL 9.3,但我想了解更新的版本以及升级。
似乎我误解了“订购”的概念。
我有一个包含这种结构和数据的表:
CREATE TABLE TestTest (Value1 Int, Value2 Int);
INSERT INTO TestTest VALUES
(1, 10),
(2, 9),
(3, 8),
(4, 7),
(5, 6),
(6, 5),
(7, 4),
(8, 3),
(9, 2),
(10, 1)
;
Run Code Online (Sandbox Code Playgroud)
使用以下查询:
Select Value1 , Value2
from TestTest
order by Value1 desc,Value2 desc
Run Code Online (Sandbox Code Playgroud)
我期望两列Value1
和Value2
从 10 到 1,因为我DESC
用于两列。
但我看到这个输出:
为什么不是Value2
降序排列?
search_path
假设我像这样永久更改我的数据库:
ALTER DATABASE my_db SET search_path TO "$user",public,other_schema;
Run Code Online (Sandbox Code Playgroud)
如何将其重置回该集群上原始的、未更改的数据库所具有的默认值?
这通常是这样"$user",public
,但可以通过配置文件进行更改。有一种方法可以读取来自配置文件的参数值(因此我可以在最坏的情况下构建动态查询),但我没有找到任何类似的东西。
Oracle 允许使用几种不同的语法来指定在哪里可以找到您的数据库服务。我最常看到的(在我专业开发软件的短短几年里)看起来像这样:
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=myserver)(PORT=1521))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=myservice)))
Run Code Online (Sandbox Code Playgroud)
我不认为这种语法有任何特定的名称,但如果您使用图形工具对其进行修改,它就是 Oracle 在其 TNS 文件中生成的。但是 Oracle 还允许使用以下更紧凑的语法,至少对于 SQL*Plus 和 application divers 之类的工具是这样:
myserver:1521/myservice
Run Code Online (Sandbox Code Playgroud)
这称为Easy Connect,我读到它是由 Oracle 10g 引入的。这使它大约有 10 年的历史。我不确定这是否可以在 TNS 文件中使用,尽管如此简短,但我认为没有必要将其放入 TNS 文件中。在我看来,它的好处是:您可以直接在您的应用程序中使用它,而无需维护 TNS 文件。
但是,从我所做的工作和与我合作过的客户来看,它的使用似乎并不常见。我什至知道它的唯一原因是因为 ESRI 开始推荐使用它在较新版本的 ArcGIS 中建立连接。这让我想知道为什么它不常见,那么使用 Easy Connect 有什么缺点吗?
(如果有人可以添加更多标签,我将不胜感激。我想不出/找到更多有意义的标签。)
考虑下表:
T_ID | T_START | T_END
-----+---------+------
1 | 0.25 | 0.5
2 | 0.8 | 1
3 | 0.4 | 0.6
4 | 0.2 | 0.3
5 | 0.7 | 0.8
Run Code Online (Sandbox Code Playgroud)
T_ID
是独特的。每行代表一个连续范围的数字,是 0 到 1 的子集。T_START
小于T_END
。
我需要确定未包含在 0 和 1 之间的任何范围。请注意,某些范围确实重叠。端点的排他性与我的用例无关;我只需要确定差距的端点是什么。(因此,不考虑单点差距。)
对于这个特定的数据集,我希望结果是
GAP_START | GAP_END
----------+--------
0 | 0.2
0.6 | 0.7
Run Code Online (Sandbox Code Playgroud)
实际数据集很大,并且将聚合到其他一些数据上(数十万行,每个聚合组可能有 100 行),因此性能很重要。(不过,性能不佳但可能会改进的答案是受欢迎的。)
我曾考虑尝试首先确定覆盖范围是什么,然后尝试反转它,但我什至无法弄清楚如何计算覆盖范围。简单GROUP BY
是不够的,因为我们有重叠范围链,它们会合并为一个范围,即使并非所有范围都相互重叠。我认为递归查询可能会有所帮助,但我还没有弄清楚它的逻辑。
我用这个示例数据集创建了一个 SQLFiddle 。
可悲的是(而且毫无成效),我不能随意修改底层表示。
oracle ×5
postgresql ×4
autovacuum ×1
bulk ×1
exception ×1
foreign-key ×1
order-by ×1
performance ×1
plpgsql ×1
sql-server ×1
t-sql ×1