【问题标题】:Where is this SQL statement bottlenecking?这个 SQL 语句的瓶颈在哪里?
【发布时间】:2012-11-08 12:16:54
【问题描述】:

我正在尝试编写 SQL (Sybase) 查询以从数据库中获取电影院信息。当我运行下面的查询时,查询只会继续运行。最终,大约 5 分钟后,我放弃了它。没有错误/非法的 SQL,它只是

SELECT
    TM.type_prefix +
        right('00000000' + convert(varchar, TM.showing_id), 8) +
        right('0000' + convert(varchar, TM.theatre_id), 4) as data_id
FROM
    theatre_times..theatre_mappings TM,
    theatres..region_codes RC,
    title_summaries..movie_summary MS
WHERE
    TM.scheme_id = 512 AND
    RC.region_code_id = MS.region_code_id

不要担心查询中使用的表名或逻辑,我只是​​想知道是否有什么明显我做错了或效率低下。以下是所有三个表的计数:

  • theatre_mappings = 2,094,163
  • region_codes = 11,140,​​348
  • movie_summary = 6,437,782

提前致谢!

【问题讨论】:

  • 你有这个...tm CROSS JOIN (rc INNER JOIN ms ON RC.region_code_id = MS.region_code_id)这真的正确吗?或者是否应该使用一个字段将tm 连接到rc,或将tm 连接到ms?另外,请注意,如果您使用显式的JOIN 语法,那么犯这些错误会变得更加困难。 (如果确实一个错误。)

标签: sql optimization sybase sql-execution-plan


【解决方案1】:

它会产生笛卡尔坐标,因为您没有将 theatre_mappings 表加入其他两个表。如果没有看到您的架构,我不能肯定地说,但我怀疑您需要类似的东西:

SELECT
    TM.type_prefix +
        right('00000000' + convert(varchar, TM.showing_id), 8) +
        right('0000' + convert(varchar, TM.theatre_id), 4) as data_id
FROM
    theatre_times..theatre_mappings TM,
    theatres..region_codes RC,
    title_summaries..movie_summary MS
WHERE
    TM.scheme_id = 512 AND
    TM.region_code_id = RC.region_code_id  -- Extra join
    RC.region_code_id = MS.region_code_id

【讨论】:

  • 谢谢@StevieG - 你成功了。
  • @orionTurtle - 我强烈建议您使用明确的JOIN sysntax 来避免这些类型的问题。 ANSI-92 已经有 20 年的采用了,我认为这已经足够长了......
【解决方案2】:

您正在创建 TM 条目到 (RC/MS) 条目的笛卡尔积。你想成为?

我认为 Sybase 支持 ANSI 92 SQL 语法,所以你的 SQL 相当于

FROM
    theatre_times..theatre_mappings TM,

    theatres..region_codes RC
          inner join title_summaries..movie_summary MS
          on RC.region_code_id = MS.region_code_id
WHERE
    TM.scheme_id = 512

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-03
    • 2017-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-05-25
    • 2016-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多