我似乎记得(在 Oracle 上) utteringselect count(*) from any_table
和select count(any_non_null_column) from any_table
.
如果有的话,这两个陈述之间有什么区别?
概念性问题:单个查询是否比连接更快,或者:我应该尝试将客户端所需的所有信息都压缩到一个SELECT 语句中,还是只使用看起来方便的尽可能多的信息?
TL;DR:如果我的联合查询比运行单个查询花费的时间更长,这是我的错还是可以预料的?
首先,我不是很精通数据库,所以可能只是我,但我注意到当我必须从多个表中获取信息时,通过对单个表的多个查询来获取这些信息“通常”更快(也许包含一个简单的内部连接)并在客户端将数据拼凑在一起,以尝试编写一个(复杂的)连接查询,我可以在一个查询中获取所有数据。
我试图把一个非常简单的例子放在一起:
架构设置:
CREATE TABLE MASTER
( ID INT NOT NULL
, NAME VARCHAR2(42 CHAR) NOT NULL
, CONSTRAINT PK_MASTER PRIMARY KEY (ID)
);
CREATE TABLE DATA
( ID INT NOT NULL
, MASTER_ID INT NOT NULL
, VALUE NUMBER
, CONSTRAINT PK_DATA PRIMARY KEY (ID)
, CONSTRAINT FK_DATA_MASTER FOREIGN KEY (MASTER_ID) REFERENCES MASTER (ID)
);
INSERT INTO MASTER values (1, 'One');
INSERT INTO MASTER values (2, 'Two');
INSERT …
Run Code Online (Sandbox Code Playgroud) 免责声明:作为一个只使用数据库一小部分工作时间的人,请耐心等待。(大部分时间我在工作中进行 C++ 编程,但每个奇数月我都需要在 Oracle 数据库中搜索/修复/添加一些内容。)
我一再需要编写复杂的 SQL 查询,包括临时查询和内置于应用程序的查询,其中大部分查询只是重复“代码”。
用传统的编程语言编写这种可憎的东西会让你陷入困境,但我(我)还没有找到任何像样的技术来防止 SQL 查询代码重复。
编辑:第一,我要感谢对我的原始示例提供出色改进的回答者。但是,这个问题与我的示例无关。这是关于 SQL 查询中的重复性。因此,到目前为止的答案(JackP、Leigh)都很好地表明您可以通过编写更好的查询来减少重复性。然而,即便如此,您仍面临一些显然无法消除的重复性:这总是用 SQL 烦扰我。在“传统”编程语言中,我可以进行大量重构以最大程度地减少代码中的重复性,但是对于 SQL,似乎没有(?)工具可以实现这一点,除非开始编写重复性较低的语句。
请注意,我再次删除了 Oracle 标记,因为我真的很想知道是否没有允许更多内容的数据库或脚本语言。
这是我今天拼凑起来的一颗这样的宝石。它基本上报告了单个表的一组列中的差异。请浏览以下代码,尤其是。最后的大查询。下面我继续说。
--
-- Create Table to test queries
--
CREATE TABLE TEST_ATTRIBS (
id NUMBER PRIMARY KEY,
name VARCHAR2(300) UNIQUE,
attr1 VARCHAR2(2000),
attr2 VARCHAR2(2000),
attr3 INTEGER,
attr4 NUMBER,
attr5 VARCHAR2(2000)
);
--
-- insert some test data
--
insert into TEST_ATTRIBS values ( 1, 'Alfred', 'a', 'Foobar', …
Run Code Online (Sandbox Code Playgroud) 搜索VARCHAR2
Oracle 中列的大小是否会影响性能的报告似乎不一。
我想VARCHAR
稍微解释一下大小的问题,并希望对此有所了解:
给定(多行)自由文本字段(不是名称之类的简短内容)要存储在(Oracle)数据库中,是否有任何意义(性能或其他)不最大化VARCHAR
容量(VARCHAR2(4000)
在 Oracle 上)而是选择较小的值,例如 1024 或 512,因为无论如何这在 98% 的情况下可能就足够了。
我们的一款产品同时支持 Oracle 和 SQL Server 作为数据库后端。我们有一位客户希望从 Oracle 后端切换到 Microsoft SQL Server,这对我们来说不是典型的过渡。
将整个 Oracle Schema 中的所有数据获取到 SQL Server 数据库中的最简单方法是什么?
模式只包含普通的旧表,没有什么花哨的。可能有一两个存储过程,我们手动迁移不会有问题。
我可以使用 Oracle 的 SQLDeveloper 将表数据导出为CREATE
和INSERT
语句,但这些与 SQL Server 上使用的语法不匹配,我不希望手动修复语法错误。
鉴于 Oracle 的许可处理[a](以及在较小程度上的成本),我一直想知道选择 Oracle 而不是 PostgreSQL 或 MySQL 的决定因素是什么。
我的公司几乎总是选择 Oracle(在可能的情况下使用 XE),即使对于只有一个简单的 Windows 服务器盒运行数据库而没有任何专门的数据库管理的小型项目也是如此。(请注意,小的也并不意味着数据将总是适合的Oracle XE的相当小尺寸的限制。)
我一直质疑这个选择,但它的好处是我们至少只接触一种数据库产品。
尽管如此,对于一个新项目,您需要一个 RDBMS,但数据库的项目和范围非常小,基于在简单的 Windows 服务器上运行的 Oracle 的哪些独特特性(没有太多的专用管理),您会选择 Oracle 而不是另一个关系数据库?
附加上下文:我们的许多数据库部署都在客户站点运行,我们称之为“低管理”模式。也就是说,数据库设置一次。在现场对其正确行为和性能进行了一些初步测试。在此之后,数据库就在其上运行。没有进行常规管理。只有当出现问题时,技术人员(不是专门的 DBA)才会检查数据库,试图找出发生了什么。备份主要是作为离线备份完成的。在某些项目中,客户甚至不关心是否涉及 RDBMS。他们只是将他们的应用程序视为一个有效(或无效)的黑匣子。
[a] :在我工作的地方,几个项目经理需要反复几个月才能为小项目获得适当的许可,因为如果收入很小,当地的 Oracle 代表对销售他们的产品并不十分感兴趣。
我知道数据库字符集(NLS_CHARACTERSET
in select * from v$nls_parameters;
)和客户端字符集(客户端环境设置NLS_LANG
)是如何交互的。
然而,我不知道的是,我如何或是否可以确定, 对于已建立的会话,Oracle 认为当前客户端字符集是什么。
这可能吗?
注意:SELECT * FROM NLS_SESSION_PARAMETERS;
确实不包含字符集(上10G2)。
完全清楚我想完成什么:
GERMAN_GERMANY.WE8MSWIN1252
)[*]:如果db应用程序是sqlplus,示例如下:
...
sqlplus /nolog
connect user/pass@example
*magic command*;
CLIENT CHARACTERSET = ...
Run Code Online (Sandbox Code Playgroud)
杰克在他的回答中的注释提出了两个要点:
多个测试床生成各种复杂性的测量数据。
在最基本的形式中,不考虑任何元数据,测试台上的一次测量将是一个小的(1 - 几千个样本)时间序列,每个样本有几十个通道/信号/属性。
跨时间和测试台的测量将具有一组相似的信号,但并不总是与为测试设置添加和移除传感器相同。
目前我们估计我们的数据速率为 6 testbeds x 4 test per hour x 12 hours a day x 4000 samples per test == 1,152,000 samples per day x 365 == 420,480,000 samples per year
_ x 48 columns per sample (currently 32 bit floats, mostly) ~~~ 75 GB per year
(本例中的列指的是通道/信号)
如果/当添加更多测试平台时,数据量可能会相应增加。
测试台在本地生成数据,然后将数据异步导入数据库。(可能在一秒钟内生成几千个样本,然后在本地进行审查,然后进行刮擦或导入。)
我们希望查询主要针对单个测量的聚合。即,您希望找到所有测量值(每个测量值都有 4k 个样本),例如 channel_output_voltage 的平均值在某个范围内。
为此设置表格的好方法是什么?必须考虑哪些因素?
从理论上讲,每次测量我可以使用一张桌子,每年生成 100,000 张桌子,但这对我来说并不是一个好主意。
或者我可以将所有内容都放在一个大表中(有数百列),该表为所有通道留出空间,并根据需要添加通道:每个样本一行。未使用的通道保持 NULL。
MEASUREMENTS
------------
measurement_id } PK
time_stamp }
channel_1 (may be …
Run Code Online (Sandbox Code Playgroud) 我偶然发现了一个关于 SO的算法/数据结构问题,我将简短引用:
(...) 关于用于索引时间序列的最佳数据结构的意见(又名列数据,又名扁平线性)。
需要的查询:
Run Code Online (Sandbox Code Playgroud)All values in the time range [t0,t1] All values in the time range [t0,t1] that are greater/less than v0 All values in the time range [t0,t1] that are in the value range[v0,v1]
数据集由汇总的时间序列组成 (...) 所讨论的数据集大小约为 15-20TB,因此以分布式方式进行处理 - 因为上述某些查询将产生数据集大于任何一个系统上可用的物理内存量。
在这种情况下,分布式处理还意味着将所需的数据特定计算与时间序列查询一起分派,以便计算可以尽可能靠近数据发生 - 从而减少节点到节点的通信(有点类似于 map/减少范式)-简而言之,计算和数据的接近度非常关键。
我很容易承认这种规模的问题超出了我的头脑,但是我的第一个预感(即使提到了数据大小)考虑到这个问题,我会问他们是否检查了大型 RDBMS(好吧,我猜是 Oracle ,或 Oracle,对吗?)可以以理智的方式处理这个问题。
所以这里的问题是:今天,(企业?)RDBMS 能否以可接受的性能与“手工编码”解决方案处理此类问题。
注意:希望这不是太模糊,并随时根据需要重新标记:-)
对于自动化任务,我非常想运行一些 SQL 脚本并确保sqlplus
在任何情况下都不会挂起,即:
set define off
,因为其中一些脚本需要接受命令行参数解决了&1
当脚本exit;
末尾不包含 an 时,它不能“挂起” 。
已解决:我认为现在我可以通过将 sql-script 包装在辅助“调用者脚本”中来实现这一点。即,调用者脚本调用另一个脚本,@
然后有一个固定的exit;
。另一个脚本不需要那样退出。
我怎样才能用 Oracle(和sqlplus
或其他东西)做到这一点?
oracle ×7
performance ×3
sql-server ×2
aggregate ×1
count ×1
dynamic-sql ×1
join ×1
migration ×1
null ×1
query ×1
scalability ×1
schema ×1
scripting ×1
sqlplus ×1
syntax ×1
tuning ×1
varchar ×1