【发布时间】:2010-08-12 20:48:24
【问题描述】:
多年来,我阅读了很多人关于如何从他们的 SQL(Microsoft SQL Server,只是为了让我们都在同一个页面上......)查询中获得更好性能的意见。但是,它们似乎都与高性能 OLTP 设置或数据仓库 OLAP 设置(cubes-galore...)紧密相关。但是,我今天的情况有点在 2 的中间,因此我犹豫不决。
我有 [Contacts]、[Sites]、[SiteContacts]([Sites] 和 [Contacts] 的联结表)、[SiteTraits] 和 [ContractTraits] 的一般数据库结构。我有近 300 万个联系人,其中大约 50 个字段(在 [Contacts] 和 [ContactTraits] 之间)仅与联系人相关,并且约有 60 万个站点与大约 150 个字段(在 [Sites] 和 [SiteTraits] 之间)仅与站点相关.基本上它是一个相当大的扁平化表格或视图……大多数列是 int、bit、char(3) 或短 varchar(s)。我的问题是这些列中有很大一部分可供用户在即席查询中使用,并且可以尽快使用,因为主要的 UI 将是一个网站。我知道最常见的过滤器,但即使对它们进行大量索引,我认为这仍然是一个野兽……这些数据是只读的;数据在白天完全没有变化,数据库只会在计划的停机时间内用最新信息刷新。所以我认为这种情况就像一个具有 OLTP 数据库读取要求的 OLAP 数据库。
我看到 3 个选项; 1. 将表分解成更小的可分割单元,对所有内容进行子查询, 2. 制作一个平面表,然后在索引上真正进入城镇 3. 创建一个 OLAP 多维数据集并根据我没有放置的过滤器值对其余部分进行子查询作为立方体尺寸,和。我对 OLAP 多维数据集做的不多,所以坦率地说,我什至不知道这是否是一种选择,但从我过去对它们所做的事情来看,我认为这可能是一种选择。另外,为了澄清我所说的“子查询所有内容”的意思,而不是在外部选择上有一个 WHERE 子句,每个表都会有一个(如果适用)被带入查询,然后表是INNER JOINed,消除一个非常大的笛卡尔积。至于一个大表的第二个选项,我听说并看到了与该方法相冲突的结果,因为它可以节省连接,但同时表扫描需要更长的时间。
有什么想法吗?我需要分享我正在吸烟的东西吗?我认为如果每个人都投入 2 美分,这可能会变成一个很好的讨论。哦,如果是这种情况,请随时告诉我,如果我对 OLAP 多维数据集的想法不满意,我也是新手。
在此先感谢所有的意见和帮助,以解决我遇到的这个困境。
【问题讨论】:
标签: sql sql-server database tsql database-design