问题标签 [rdbms]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
optimization - PostgreSQL 查询优化和 Postmaster 进程'
我目前正在使用更大的 wikipedia-dump 派生 PostgreSQL 数据库;它包含大约 40 GB 的数据。该数据库在装有 Suse Linux Enterprise Server 10 的 HP Proliant ML370 G5 服务器上运行;我通过一个简单的 D-Link 路由器管理的专用网络从我的笔记本电脑查询它。我为笔记本电脑和服务器分配了静态 DHCP(私有)IP。
无论如何,从我的笔记本电脑上,使用 pgAdmin III,我发送了一些 SQL 命令/查询;其中一些是 CREATE INDEX、DROP INDEX、DELETE、SELECT 等。有时我发送一个命令(如 CREATE INDEX),它返回,告诉我查询已完美执行等。但是,分配给这样一个命令似乎仍然在服务器上休眠。现在,我真的不介意这一点,因为我对自己说 PostgreSQL 维护着一个准备处理查询的 postmaster 池。然而,如果这个过程占用了 6 GB 的 9.4 GB 分配的 RAM,我会担心(目前确实如此)。现在也许这是保存在[共享]内存中的数据缓存,以防另一个查询碰巧需要使用相同的数据,但我不知道。
另一件事困扰着我。
我有 2 张桌子。一是页表;我在其page_id列上有一个索引。另一个是具有 pl_from 列的pagelinks表,该列在page.page_id列中没有引用任何内容或变量;与page_id列不同,pl_from还没有索引。为了让您了解表的规模以及我找到可行解决方案的必要性,页表有 1340 万行(在我删除了我不需要的行之后),而pagelinks表有 2.93 亿行。
我需要执行以下命令来清理pagelinks表中一些无用的行:
所以基本上,我希望摆脱来自不在页表中的页面的所有链接的pagelinks表。即使在禁用嵌套循环和/或顺序扫描之后,查询优化器也总是给我以下“解决方案”:
似乎这样的任务需要几个星期才能完成;显然,这是不可接受的。在我看来,我宁愿它使用page_id索引来做它的事情......但它是一个顽固的优化器,我可能错了。
database - 有人告诉我为什么我的数据库设计很愚蠢,以及如何修复它
所以我有这些车辆,它们有很多不同的类型。每种类型都有自己的表,具有许多属性。然后我有一个“车辆”表,其中包含每个表中所有车辆的 ID 和类型。车辆可以有照片,所以我有一个“照片”表,带有一个 vehicle_id,将照片链接到它所属的车辆。
现在每辆车都有一个设备列表,我将其作为 JSON 数组存储在单个“设备”列中。
像这样的东西:http: //pastie.org/353195
我怎样才能更好地做到这一点,尤其是设备栏?
datetime - 不同 RDBMS 中日期时间的一致处理
我正在计划一个分布式应用程序系统,它将与不同类型的 RDBMS 进行通信。要求之一是对所有 RDBMS 类型的 DateTimes 进行一致处理。所有 DateTime 值必须以毫秒为精度,包括 TimeZone 信息并存储在单个列中。
由于不同的 RDBMS 处理日期和时间的方式不同,我担心在这种情况下我不能依赖它们的原生列类型,所以我必须想出一个不同的解决方案。(如果我在这里错了,欢迎你给我指路。)
无论是什么解决方案,理想情况下都应该允许在 SQL 级别上轻松排序和比较。其他方面,例如可读性和使用 SQL 日期时间函数的能力,并不重要,因为这些都将由网关服务处理。
我正在考虑将我的 DateTime 值存储在无符号 largeint 列类型(8 个字节)中。我还不确定是否所有有问题的 RDBMS(MSSQL、Oracle、DB2、PostgreSQL、MySQL,也许还有其他一些)实际上/拥有/这样的类型,但在这一点上,我只是假设他们有。
至于存储格式...例如,2009-01-01T12:00:00.999+01:00 可以存储类似于?20090101120000999??,在 8 个字节以下。
我能够以这种方式存储的最小日期时间为 0001-01-01T00:00:00.000+xx:xx,最大值为 8000-12-31T23:59:59.999+xx:xx,这给了我一个跨度绰绰有余。
由于最大无符号 largeint 值是 18446744073709551615,这给我留下了以下 3 位数字(由 A 和 BB 标记)来存储时区信息:AxxxxxxxxxxxxxxxxxBB。
考虑到 0001..8000 的最大年份跨度,A 可以是 0 或 1,BB 可以是 00 到 99 之间的任何值。
现在的问题是:
您如何看待我提出的解决方案?它有优点还是只是愚蠢?
如果没有更好的方法,您如何建议将剩余的三个数字最好地用于时区信息?
sql - 垂直到水平?
我有一个如下所示的 PostgreSQL 表:
其中“->”分隔两列,第一列指向第二列(超链接)。现在我想在第一列中获取所有不同的值,并为它们分配一个 ARRAY,其中包含它们在第二列中指向的所有值,从而减少索引大小并帮助我更接近我希望到达的位置。
因此,我希望排列 [many] 行的单列结果集。如果我可以调用像arrayify(SELECT column2 FROM table WHERE column1 = 'A'
) 这样的函数,那会让我的生活变得如此轻松。
任何人或任何人都知道吗?
谢谢
postgresql - PostgreSQL 长真空
我目前正在清理一个具有 2 个索引和 2.5 亿个活动行以及大约相同数量(或更多)的死行的表。我从我的客户端计算机(笔记本电脑)向我的服务器发出了命令 VACCUM FULL ANALYZE。它在过去 3-4 天左右一直在开展业务;我想知道它是否会很快结束,因为我还有很多工作要做!
该服务器有一个四码 Xeon 2.66 GHz 处理器、12 GB 或 RAM 和一个 RAID 控制器,该控制器连接到 RAID 1 配置中的 2 个 10K rpm 146 GB SAS HD;它正在运行 Suse Linux。我想知道...
现在,首先 VACUUM postmaster 进程似乎只使用一个核心。其次,我没有看到非常高的 I/O 写入与 I/O 空闲时间的比率。第三,通过调用procinfo
,我可以推断 VACUUM 进程大部分时间(88%)都在等待 I/0。
那么为什么不通过线程利用更多内核来使 RAID 控制器过载(获得高 I/O 写入空闲比)?如果 I/O 负载不高,为什么还要等待 I/O?为什么所有这些权力/资源都在它的手指上,但速度却没有更快?在我看来,VACUUM 可以而且应该是多线程的,特别是如果它在一张巨大的桌子上工作并且它是唯一一个工作的!
此外,他们是否可以配置 postgresql.conf 以使其多线程这样的 VACUUM?我可以杀死它并仍然从它的部分清理中受益吗?我需要在那张桌子上工作。
[我使用的是 PostgreSQL 8.1]
再次感谢
sql - 如何显示 DB2 SQL UDF 的源代码
有什么方法可以在 DB2 控制中心查看 SQL UDF 正文?
python - 游标在 Python 的 DB-API 中是如何工作的?
我一直在使用带有 RDBMS(MySQL 和 PostgreSQL)的 python,我注意到我真的不明白如何使用游标。
通常,他的脚本通过客户端 DB-API(如 psycopg2 或 MySQLdb)连接到数据库:
然后创建一个游标:
然后可以发出查询和命令:
现在查询的结果在哪里,我想知道?它在服务器上吗?还是在我的客户端上一点点在我的服务器上一点点?然后,如果我们需要访问一些结果,我们获取它们:
或者
现在让我们说,我没有检索所有行,并决定执行另一个查询,以前的结果会发生什么?是他们的开销。
另外,我是否应该为每种形式的命令创建一个游标并以某种方式不断地将其重用于相同的命令?我负责 psycopg2 可以以某种方式优化执行多次但具有不同值的命令,它是如何以及值得的?
谢谢
mysql - 如何设计电影数据库?
我试图弄清楚这个令人难以置信的东西,他们称之为数据库设计,但没有取得多大成功,所以我将尝试用一个例子来说明我的问题。
我正在使用 MySQL,这是我的问题:
假设我想创建一个数据库来保存我的 DVD 收藏。我有以下信息要包括在内:
- 电影片名
- 演员
- 运行时间
- 类型
- 描述
- 年
- 导向器
我想在这些之间建立关系以提高效率,但不知道如何。
这是我对数据库设计的想法:
电影表 => 电影ID、电影标题、运行时间、描述
年表 => 年
流派表 => 流派
导演表 => 导演
演员表 => actor_name
但是,我将如何在这些表之间创建关系?
另外,我为 Films 表创建了一个唯一 ID,主键会自动递增,我是否需要为每个表创建一个唯一 ID?
最后,如果我要通过 PHP 表单将新电影更新到数据库中,我将如何将所有这些数据插入(包括关系和所有?)
感谢您提供的任何帮助,基思
database - DBMS 中使用的数据结构
像 Oracle、MySQL 和 Sqlite 等 DBMS 中用于存储和检索记录的数据结构是什么?
database - 表修订/历史?
我试图找出在关系数据库中保留表的历史记录/修订的最佳方法。
我做了一些研究和阅读,但不确定跟踪变化的最佳方法是什么。对于我的主表,我很确定我已经确定了一个修订表,以跟踪(见图),但我不确定的是关系表。也许只是一个包含更改的审计跟踪表?
movies_has_actors
查看下面的示例图片,保存表格历史的最佳方式是什么?我不能简单地对两个主要表(电影、演员)进行处理,因为我需要知道在建立关系时哪个 MOVIE revision_id 是活动的。如果我想跟踪哪个 USER 添加了关系(示例图片中没有 USER 表)怎么办?我不想将所有内容都保留在关系表本身中,因为这只会增长巨大并减慢查询速度......![alt text][1]
总而言之,保存关系表历史的最佳方法是什么?
图片链接:img115.imageshack.us/my.php?image=44623598nv1.jpg
[1]:图片