0

我在对 mssql 2008 数据库运行查询的程序中遇到问题。我在查询分析器中做了一些研究。以下两个查询存在一个奇怪的问题:

SELECT  BOLD_ID ,
        BOLD_TYPE
FROM    ZusatzKlasseBase
WHERE   ( bold_id IN ( SELECT   usereintrag
                       FROM     zusatzfeld
                       WHERE    metazusatzfeld = 5211309
                                AND wertobject = 1298369 )
          AND bold_id IN ( SELECT   usereintrag
                           FROM     zusatzfeld
                           WHERE    metazusatzfeld = 5207783
                                    AND wertdatum = '20130415' )
        )

此查询的运行时间约为一秒

SELECT  BOLD_ID ,
        BOLD_TYPE
FROM    ZusatzKlasseBase
WHERE   ( BOLD_TYPE IN ( 336 ) )
        AND ( bold_id IN ( SELECT   usereintrag
                           FROM     zusatzfeld
                           WHERE    metazusatzfeld = 5211309
                                    AND wertobject = 1298369 )
              AND bold_id IN ( SELECT   usereintrag
                               FROM     zusatzfeld
                               WHERE    metazusatzfeld = 5207783
                                        AND wertdatum = '20130415' )
            )

此查询的运行时间为一分钟。

我对此没有任何解释,字段 BOLD_TYPE 已编入索引。谁能猜出为什么更具体的查询更慢?

提前感谢所有答案。

4

1 回答 1

2

我会将上的索引bold_id(我假设上的索引bold_id)更改为:

CREATE INDEX whatever ON dbo.ZusatzKlasseBase(bold_id, bold_type)
  WITH (DROP_EXISTING = ON);

然后我会稍微重写查询:

SELECT  BOLD_ID,
        BOLD_TYPE
FROM dbo.ZusatzKlasseBase AS b -- always use schema prefix
WHERE
    ( BOLD_TYPE IN ( 336 ) )
    AND EXISTS 
    (
      SELECT 1 FROM dbo.zusatzfeld
      WHERE    metazusatzfeld = 5211309
               AND wertobject = 1298369 
               AND usereintrag = b.bold_id
    )
    AND EXISTS
    ( 
       SELECT 1 FROM dbo.zusatzfeld
       WHERE    metazusatzfeld = 5207783
                AND wertdatum = '20130415' 
                AND usereintrag = b.bold_id
    );
于 2013-04-16T15:22:45.210 回答