5

我们有一个包含产品属性的 1700 万行的表,假设它们是:

品牌 ID、尺寸 ID、颜色 ID、价格、形状 ID

我们需要按品牌和尺寸查询聚合。目前我们通过执行以下操作来查询和过滤这些数据:

select brandID, sizeID, count(*) 
from table where colorID in (1,2,3) and price=10 and shapeID=17
--"additional complex where clause here"
group by brandID, sizeID
order by brandID, sizeID

我们报告这些数据。问题是,运行此查询需要 10 秒左右(这是一个非常简单的示例),尽管返回的实际数据只有几百行。

我认为我们已经达到了索引该表的能力,因此我认为任何数量的索引都不会让我们获得近乎即时的结果。

我对 OLAP 或其他分析服务知之甚少,但是 SQL Server 有什么可以预过滤或预聚合此表以便可以执行上述查询(或类似返回等效数据)?或者在一个非常大的表上处理任意 where 子句的最佳方法是什么?

4

4 回答 4

4

我认为这是 olap 立方体的完美候选者。我有数百万行的事实数据。我正在做您上面描述的那种查询,并且查询会在几分钟内返回。我把它移到了一个 OLAP 多维数据集中,现在查询几乎是即时的。olap 有一些学习曲线。我强烈建议您找到有关一些简单立方体构建的教程,以了解它。多年来,DBA 的同事一直在告诉我有关多维数据集的内容,但我一直没有完全理解。现在我不知道为什么我走了这么久没有它。

除了 OLAP,您可能还想研究索引视图,但如果您以多种方式对数据进行切片,那可能不可行。

于 2009-10-02T20:21:13.437 回答
0

如果没有详细说明您的表结构和物理环境以及(非)聚集索引等。我首先要寻找的瓶颈是查询的“显示执行计划”,还有数据库引擎优化顾问和 SQL 探查器。希望这可以帮助。

于 2009-10-02T20:19:24.000 回答
0

取决于您的索引和架构

无论如何,这个查询的索引应该是其中之一

CREATE INDEX IX_foo ON table (shapeID, price, colorID) INCLUDE (brandID, sizeID)
CREATE INDEX IX_foo ON table (shapeID, price, colorID, brandID, sizeID)

但是,您在此处添加了“附加的复杂 where 子句”,这可以缓解一个好的答案

我的想法:

  • WHERE 子句很重要,因为这会减少行数
  • ORDER BY 不如聚合/WHERE 重要
  • 覆盖查询以删除键查找

额外的东西:

  • (1,2,3) 中的 colorID 不好,因为它是 OR
  • 确保参数数据类型与列数据类型完全匹配以避免隐式转换
  • 您可以稍微交换 shapeID、Price 和 colorID 以查看最好的(或创建一些索引并查看它使用哪个索引)
  • 您是否有服务器瓶颈(例如在 SQL Express 上运行等)?
于 2009-10-02T20:21:36.103 回答
0

如果您使用的是 SQL 2008 并且有一些特定的常用过滤,请考虑使用过滤索引(可能与 gbn 建议的 INCLUDE 索引结合使用)。

假设您只有五个 sizeID 值。您可以将当前索引分解为多个过滤索引(例如,“WHERE sizeID = 1”)。

将过滤与 INCLUDE 结合使用可以使您的查询返回更快。

参考:探索 SQL Server 2008 的过滤索引

于 2009-10-02T21:56:54.487 回答