0

鉴于我仍在学习编写查询并且目前无法查看数据库,这可能有点难以回答,但我会试一试。

我试图从中获取信息的数据库包含一个大表 (TransactionLineItems),它本质上用作存储事务日志。该表当前包含大约 500 万行和几列描述每个交易中包含的产品(TLI_ReceiptAlias、TLI_ScanCode、TLI_Quantity 和 TLI_UnitPrice)。这个表有一个外键,它与另一个表(事务)中的主键配对,这个表包含事务号(TRN_ReceiptNumber)。当我加入这两个表时,查询为我们售出的每一件商品返回一行,每一行都有一个收据编号。16 行可能具有相同的收据编号,这意味着所有这些物品都在一次交易中售出。在此之下可能还有 12 行,每行共享另一个收据编号。

我正在尝试构建一个查询,该查询返回共享一个收据编号的所有行,其中至少有一行具有该收据编号的行满足另一列中的某些条件。例如,三种不同类型的礼品卡都在 TLI_ScanCode 列中具有以“740000”开头的值。我希望查询在 TLI_ScanCode 列中返回值以这六位数字开头的行,但我还想返回与任何满足给定扫描码条件的行共享收据编号的所有行。本质上,我需要查询返回每个收据编号的所有行,该收据编号也至少在一行中与礼品卡相关的扫描码配对。

我尝试使用子查询返回与礼品卡扫描码配对的所有收据编号的列,使用“WHERE A.TRN_ReceiptAlias IN(子查询...”仅返回收据编号与其中一个收据编号匹配的行由子查询返回。这似乎运行了五分钟,然后服务器在处理查询时又停止了二十二十分钟。查询似乎成功完成,但考虑到我正在与 IT 部门合作以恢复正常的存储操作在此期间,我未能获得查询的结果(除了相关的羞耻和尴尬)。

我想知道是否有办法编写查询来获取此信息而不会导致服务器挂起。我假设:a) 在如此大的表上以这种方式使用子查询不是很聪明,或者 b) 我对 SQL 的了解不够,无法获得我需要的信息。我假设答案是 A 和 B,但我非常想学习如何以正确的方式做到这一点。任何帮助将不胜感激。谢谢!

4

2 回答 2

0
SELECT *
  FROM a as a1
  JOIN b
    ON b.id = a.id
  JOIN a as a2
    ON a2.id = b.id
 WHERE b.some_criteria = 'something';

在 (b.id,b.some_criteria) 上包含索引

于 2013-08-06T08:43:10.127 回答
0

您不是第一个,也不会是最后一个因查询效率低下而导致系统瘫痪的人。

最重要的教训是“决策支持”和“分析”确实不能与交易系统共存。您确实希望将数据提取到数据集市或数据仓库或其他不是您的事务数据库的数据库中,这样您就不会使业务脱机。

在理解为什么您的初始查询如此低效方面,您需要熟悉返回您计划信息的 EXPLAIN EXTENDED 语法,这些信息应该可以帮助您调试您的查询并努力使其能够以可接受的方式执行。如果您使用实际的解释计划输出更新您的问题,这将有助于确定问题所在。

仅从您提供的大纲来看,听起来确实像自联接而不是子查询更有意义。

于 2013-08-06T09:05:49.973 回答