【发布时间】:2010-11-09 05:39:20
【问题描述】:
我已经在 Sql 2008(之前是 05 年)上生产了近 3 年的数据库。一直很好,但性能不是很好。所以我正在调整架构和查询以帮助加快一些事情。此外,一些主表包含大约 1-3 行,每个表(给你一个大小的估计)。
这是一个示例数据库图(Soz,在 NDA 下,所以我无法显示原件):-
alt text http://img11.imageshack.us/img11/4608/dbschemaexample.png
注意事项(与我的问题直接相关):-
- 车辆可以有 0 个(NULL)或 1 个无线电。 (左外连接)
- 车辆可以有 0 个(NULL)或 1 个杯托(左外连接)
- 车辆有 1 种轮胎类型(内连接)。
首先,这看起来像normalised database schema。我很烂和 DB 理论,所以我猜这是 3NF(至少)...著名的遗言 :)
现在,这正在扼杀我的数据库性能,因为这两个外连接和内连接被调用了很多,而且在许多语句中还有一些连接。
为了尝试解决这个问题,我想我可以尝试索引视图。创建视图是小菜一碟。但是索引它不起作用->无法使用连接或自引用表创建索引视图(也是另一个问题:()。
所以,我已经哭了好几个小时(以及 /wrists、dyed hair 和 wrote an emo song 关于它并把它放在 myfailspace 上)并做了以下......
- 在每个“可选”外部连接表(在本例中为 Radios 和 CupHolders)中添加了一个新行。 ID = 0,其余数据 = 'Unknown Blah' 或 0。
- 更新父表,使任何 NULL 数据现在都有一个 0。
- 更新从外连接到内连接的关系。
现在,这行得通。我什至可以制作索引视图,现在速度非常快。
所以……我很痛苦。这与我所学的一切背道而驰。我觉得脏。独自的。被感染了。
这是一件坏事吗?这是为了性能而对数据库进行非规范化的常见场景吗?
我很想对此有一些想法,请:)
PS。谷歌随机找到的那些图片——所以不是我。
【问题讨论】:
-
你是说内连接比外连接快吗?不应该——你能举个例子来说明什么是慢的吗?
-
顺便说一句:您并没有影响您的规范化 - 关于在表格中使用 null 存在很多争论,有些人会将您的更改视为一种改进。
-
您现有的 Vehicles 表上有哪些索引。一个运行缓慢的查询示例也很有用。
-
@TonyLee - 我通常发现内部联接总是比外部联接快。 ?? @EvilRyry - 我会在 PK 和每个 FK 上有索引,有各种排列。
-
一般来说,outer 会返回更多的行(那些为空的),但在你的情况下,我猜你已经以其他方式修改了 select 以改进性能。
标签: sql-server database-design normalization denormalization