这个SQL语句瓶颈在哪里?

时间:2012-11-20 12:17:59

标签: sql optimization sybase sql-execution-plan

我正在尝试编写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

提前致谢!

2 个答案:

答案 0 :(得分:0)

您正在创建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

答案 1 :(得分:0)

它产生了一个笛卡尔因为你没有加入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