如何在(a,b,c,d,e,f ......)中的字段中优化查询,如select *?

时间:2014-09-23 03:48:24

标签: mysql sql optimization sybase

我有一个像这样的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数据库不归我所有,我只能进行查询。
  3. 提前致谢。

2 个答案:

答案 0 :(得分:0)

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

Sybase Documentation for Materialized View

答案 1 :(得分:0)

假设它是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

上试用过