是否有特定术语来描述与基数为 1 的关系?
我特别想到 RDBMS“特殊”单行表,例如DUAL(Oracle)、SYSIBM.SYSDUMMY1(DB2、Derby) 和RDB$DATABASE(Interbase、Firebird)。
我正在优化工作票的 Firebird 2.5 数据库。它们存储在一个声明如下的表中:
CREATE TABLE TICKETS (
TICKET_ID id PRIMARY KEY,
JOB_ID id,
ACTION_ID id,
STATUS str256 DEFAULT 'Pending'
);
Run Code Online (Sandbox Code Playgroud)
我通常想找到第一张尚未处理且处于Pending状态的票证。
我的处理循环是:
PendingComplete没有什么太花哨的。如果我在这个循环运行时观察数据库,我会看到每次迭代的索引读取次数增加。据我所知,性能似乎并没有严重下降,但是我正在测试的机器非常快。但是,我从我的一些用户那里收到了性能随时间下降的报告。
我在 上有一个索引Status,但它似乎仍然在Ticket_Id每次迭代时向下扫描列。好像我忽略了一些东西,但我不确定是什么。像这种预期的索引读取次数是否会不断攀升,还是索引在某些方面表现不佳?
-- 编辑评论 --
在 Firebird 中,您可以限制行检索,例如:
Select First 1
Job_ID, Ticket_Id
From
Tickets
Where
Status = 'Pending'
Run Code Online (Sandbox Code Playgroud)
因此,当我说“第一”时,我只是要求它提供一个有限的记录集,其中Status = 'Pending'.
在过去的几周里,我一直在对旧的 Firebird 数据库发火。由于各种原因,这个数据库很糟糕,但我注意到的一件事是每个表的每个字段都有两个索引;每一个都有一个片段,一个按顺序,一个按顺序。ascdesc
除了为每个表中的每个字段都有一个索引的重要性之外,它让我思考 - 单段索引有两个具有相同索引段但一个 indesc一个 in 的索引有什么优势asc吗?有什么可以得到的,或者现代 DBMS 是否会简单地使用asc索引并从头开始并在需要时向后工作?
我有一个 200 GB 的 Firebird 数据库(使用 Firebird 2.1.3 创建,目前运行的是 2.1.5),它似乎已损坏。当我尝试进行备份时,我得到:
数据库文件出现损坏 <>
错误的页面类型
页面 0 是错误的类型(预期 0 发现 1)
gds_get_segment 失败
gfix 以一个结尾
僵局
我该如何解决?
更新
虽然这个特定的数据库不是固定的,但我想解决方案是尝试 IB FirstAID。
推荐阅读:
我正在使用 Firebird 2.1.1 数据库,并开始阅读有关监控表的信息。
我试图以某种方式实时查看每个客户端在数据库中执行的查询。
我看了看MON$STATEMENTS表格,但没有提供太多信息。我本来希望表格中有更多内容。

我是不是找错地方了,还是我不明白 Firebird 监控表的目的/用途?
今天,我虽然想尝试一下 Firebird 3.0,但由于某种原因,我似乎无法安装它 - 至少不能以一种可以从 JDBC 应用程序连接的方式。
我所做的就是关注这篇文章。这是发生的事情:
c:\etc\Firebird30>gsec -add sysdba -pass masterkey c:\etc\Firebird30>启动 firebird.exe -a -m c:\etc\Firebird30>isql 使用 CONNECT 或 CREATE DATABASE 指定数据库 SQL> 创建数据库 "localhost:c:\temp\mydbfb3.fdb" 用户 "sysdba" 密码 "masterkey"; 语句失败,SQLSTATE = 08006 从连接读取数据时出错。 查询>
现在“本地”创建数据库的工作原理是:
SQL> 创建数据库 "c:\temp\mydbfb3.fdb" 用户 "sysdba" 密码 "masterkey"; SQL> 提交; 查询>
但在这种情况下,当我从 JDBC 应用程序(仍然是“本地主机”)连接时,我收到错误消息(使用 sysdba/masterkey 登录)
GDS 异常。335544472. 您的用户名和密码未定义。请您的数据库管理员设置 Firebird 登录。 原因:您的用户名和密码未定义。请您的数据库管理员设置 Firebird 登录。
我仔细检查(不止一次)JDBC 应用程序中的用户名和密码是 sysdba/masterkey。
从命令行我确实可以访问新创建的数据库:
SQL> 连接 'c:\temp\mydbfb3.fdb'; 数据库:'c:\temp\mydbfb3.fdb' SQL> 创建表 foo (bar 整数); SQL> 插入 foo 值 (1); …
例如,一些等价于
CREATE INDEX Listing_Date_Idx ON ACTIVITY(Listing,Date_ DESC,Time_ DESC);
Run Code Online (Sandbox Code Playgroud) 我即将发布一个脚本,它将一次更新许多 Firebird 数据库。有些没有这个约束,所以我想在我尝试删除它之前检查约束是否存在。
ALTER TABLE PROCESS_CATEGORY DROP CONSTRAINT INTEG_669;
Run Code Online (Sandbox Code Playgroud) 在以下查询中,我必须为每个客户计算交易。但是,我必须从结果集中完全排除交易时间超过一年的客户。
查询优化器不应该足够聪明,只为每个客户评估一次存在吗?
--Count transactions on customers that are less than 1 year old
SELECT t1.CUSTID, COUNT(*)
FROM CUST_TRX t1
WHERE NOT EXISTS (
SELECT FIRST 1 1
FROM CUST_TRX t2
WHERE
t2.CUSTID = t1.CUSTID AND
t2.DATED < CURRENT_DATE - 365
GROUP BY t2.CUSTID
)
GROUP BY t1.CUSTID
Run Code Online (Sandbox Code Playgroud)
我的查询计划中没有自然。此查询的执行就像数据库为每个事务运行存在子句,而不是为每个客户运行它。如果我删除GROUP BY子查询中的,则性能相同。
有没有更好的方法来做到这一点,以便我可以从数据库中获得更好的性能?SELECT如果可能的话,希望一个简单的查询能够避免 CTE(这会带来其他挑战)。
由于其他GROUP BY条件(此处未显示),我无法简单地检查MIN(DATED),我确实需要执行另一个查询。
performance execution-plan subquery firebird query-performance
过去几个月我一直在使用 Firebird,今天一位客户抱怨性能问题。
我检查了客户的数据库,他们在一张表中有 167,77,216 行。因此,我将该表克隆到另一个空数据库中,并加载虚拟记录并使用简单的查询进行测试
select count(journal_id) from acc_journal
Run Code Online (Sandbox Code Playgroud)
花了14.28秒。
之后我创建了一个 SQLite 数据库并加载了这些数据,花了 2.216 秒。
这是 Firebid 的本质还是我错过了什么?
火鸟表结构:
CREATE TABLE ACC_JOURNAL (
JOURNAL_ID INTEGER GENERATED BY DEFAULT AS IDENTITY NOT NULL,
ACCOUNT_HEAD_ID INTEGER,
REF_ID INTEGER,
REF_TYPE VARCHAR(20),
DESCRIPTION VARCHAR(512),
DEBIT DECIMAL(18,4),
DEBIT_EX DECIMAL(18,4),
CREDIT DECIMAL(18,4),
CREDIT_EX DECIMAL(18,4),
CURRENCY_ID INTEGER,
STATUS VARCHAR(20),
EX_RATE DECIMAL(18,4),
ENTRY_DATE VARCHAR(20),
ENTRY_TIME VARCHAR(20),
BRANCH_CODE VARCHAR(20),
LAST_SYNCED VARCHAR(20),
LAST_UPDATED DECIMAL(18,4),
ENTRY_DATE2 VARCHAR(20),
/* Keys */
PRIMARY KEY (JOURNAL_ID)
);
Run Code Online (Sandbox Code Playgroud)
SQLite表结构:
CREATE TABLE ACC_JOURNAL (
ACCOUNT_HEAD_ID INTEGER, …Run Code Online (Sandbox Code Playgroud) 嗨,我有一个名为 datenow 的示例表,并使用以下内容在弗拉罗宾上创建我的表,以便在添加条目时自动获取今天的日期。
CREATE TABLE "DATENOW"
(
ID Char(8) NOT NULL,
"Start_Date" Char(10),
"Client_Name" Varchar(30),
BALANCE Integer,
select cast('Now' as date) from rdb$database
CONSTRAINT PK_datenow PRIMARY KEY (ID)
);
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
ON "datenow" TO SYSDBA WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)
还尝试插入这些 sql 语句
select date 'Now' from rdb$database
select time 'now' from rdb$database
select timestamp 'NOW' from rdb$database
Run Code Online (Sandbox Code Playgroud)
但我无法生成表,也无法确定将 sql 语句放在哪里或要做什么才能获得今天自动获取日期的列
我正在尝试使用 FireBird 数据库引擎。
操作系统:Windows 8.1 x64(启用SmartScreen,启用UAC,安装自定义防病毒软件(带防火墙))
FireBird:版本 2.5,作为 SuperServer 安装,作为没有监护人的应用程序。
我正在尝试使用许多应用程序来管理这个引擎,例如 FlameRobin 或 FireBird Maestro。
首先:
安装db后说,当我尝试检索服务器版本时,在windows目录中找不到“firebird.msg”。
好的。我将它从程序文件复制到系统目录。
第二个(致命):
我无法连接到我的数据库!
Firebird Maestro 说,当我尝试连接到创建的数据库时:

或 FlameRobin(为“localhost”选择上下文菜单“检索服务器版本”):

我什么都没变 从未安装过 firebird 数据库。使用默认用户 (SYSDBA) 和密码 (masterkey),以任何敏感度进行尝试。
今天,我尝试在 Windows Server 2003 上安装 FireBird,并在 FlameRobin 中执行一些操作,一切正常!
为什么数据库在 Windows 8.1 下不起作用?
我想使用 SQL 语句获取日期。例如,如果日期是“2018-08-07”输出,则应返回:“2018-08-14”(一周后)。然后我将获取这些日期之间的总行数。
SELECT count(*) FROM orders WHERE dates BETWEEN '2018-08-07' AND
DATEADD(day,7,'2018-08-07');
Run Code Online (Sandbox Code Playgroud)
但是,由于 dateadd() 函数,我收到此错误:
SQL Error [335544634] [42000]: Dynamic SQL Error; SQL error code = -104; Token unknown - line 1, column 1; DATEADD [SQLState:42000, ISC error code:335544634]
Run Code Online (Sandbox Code Playgroud) firebird ×13
index ×3
performance ×2
corruption ×1
date ×1
db2 ×1
installation ×1
oracle ×1
select ×1
subquery ×1
terminology ×1
windows-8 ×1