【问题标题】:How to optimize query like select * from table where field in (a,b,c,d,e,f....)?如何优化查询,如 select * from table where field in (a,b,c,d,e,f ....)?
【发布时间】:2014-09-23 13:20:34
【问题描述】:

我有一个这样的 sql 查询:

SELECT * FROM table WHERE field IN (a,b,c,d,e,f,g,h....)

这里 in() 子句中的列表大小可能高达 2000,并且该表是在 SybaseIQ 中创建的视图。据我所知,我无法在视图中创建索引。 那么还有其他可能的方法来优化这个查询吗?

我现在通过谷歌找到的:

  1. 使用 union all 而不是 in,这需要很长的 union all 列表(最多 2000 个)
  2. 将in 子句中的列表插入表中并尝试加入,我还不能这样做,因为sybase IQ 数据库不属于我,我只能进行查询。

提前致谢。

【问题讨论】:

  • 还有,是mysql还是sybase?
  • 如果您确实需要这样做以提高效率并且您受到限制,您可能需要将视图复制到可以创建表的本地数据库中。联合不会更快,但带有索引的单独表会。视图上的索引无济于事,无论如何,您需要它在列表中。

标签: mysql sql optimization sybase


【解决方案1】:

如果您有足够的权限,请尝试在您正在使用的视图之上创建实体化视图,或将现有视图修改为实体化视图本身。简而言之,物化视图是表和视图的混合体。使用物化视图,您可以在列上创建索引,缓存结果而不是每次都计算。您可能想要检查物化视图对普通视图/表的限制。

Sybase Documentation for Materialized View

【讨论】:

    【解决方案2】:

    假设它是 Sybase 并且您可以创建临时表,那么这些方面的内容应该有助于提高性能:

    CREATE TABLE #In_List
        ([Code] varchar(1))
    ;
    
    INSERT INTO #In_List
        ([Code])
    VALUES
        ('d'),
        ('e'),
        ('k'),
        ('p'),
        ('r')
    ;
    
    CREATE CLUSTERED INDEX IDX_In_List_Code ON  #In_List([Code])
    ;
    
    select
    *
    from My_Table
    inner join #In_List on my_table.code = #in_list.code
    ;
    

    注意:这仅在 SQL Server 2008 上试用过 (using this SQLFiddle)

    【讨论】:

      猜你喜欢
      • 2011-04-06
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 2021-07-21
      • 1970-01-01
      • 2011-04-13
      • 2013-06-23
      相关资源
      最近更新 更多