sql: вопрос относительно оптимизации запросов - PullRequest
0 голосов
/ 20 августа 2011

У меня есть следующие две таблицы:

CREATE TABLE Test_Main
    (
      [ID] INT IDENTITY ,
      [TypeID] INT ,
      [BookID] INT
    )

CREATE TABLE Test_Second
    (
      [TypeID] INT ,
      [BookID] INT ,
      [Value] INT,

    )

INSERT  INTO Test_Main(TypeID, BookID)
   SELECT 1, 10
   UNION
   SELECT 2, 31
   UNION
   SELECT 3, 51
   UNION
   SELECT 4, 81

INSERT INTO Test_Second(TypeID, BookID, Value)
   SELECT  1, 0, 30
   UNION
   SELECT  2, 31, 45
   UNION
   SELECT  3, 51, 66
   UNION
   SELECT  4, 0, 22 

и у меня есть следующий запрос:

SELECT  
    ID ,
    Test_Main.TypeID ,
    Test_Main.BookID
FROM
    Test_Main
INNER JOIN 
    Test_Second ON Test_Main.[TypeID] = Test_Second.[TypeID]
WHERE   
    Test_Main.BookID = CASE WHEN (Test_Main.BookID = 2 OR Test_Main.BookID = 3) 
                                THEN Test_Second.BookID
                            ELSE Test_Main.BookID
                       END 

Этот запрос дает следующий вывод:

ID          TypeID      BookID
----------- ----------- -----------
1           1           10
2           2           31
3           3           51
4           4           81

Теперь, когда моя таблица содержит миллион строк, я подозреваю, что мое предложение case вызовет проблему с производительностью. Как я могу оптимизировать запрос для использования поиска по индексу. Каким должен быть индекс для вышеуказанного запроса?

Ответы [ 2 ]

2 голосов
/ 20 августа 2011

Вы должны иметь соответствующие индексы на месте:

  • Столбец TypeID должен быть проиндексирован в обеих таблицах (поскольку он используется в условии JOIN)
  • Столбец Test_Main.BookID необходимо проиндексировать, поскольку он используется в предложении WHERE

С этими тремя индексами я считаю, что ваш запрос должен работать очень хорошо, даже с большим количеством строк в таблицах!

0 голосов
/ 20 августа 2011

(Вопрос: Вы уверены, что не имеете в виду TypeID вместо BookID в этой части?):

... WHEN (Test_Main.TypeID = 2 OR Test_Main.TypeID = 3)

Ваш запрос эквивалентен:

SELECT  
    ID ,
    Test_Main.TypeID ,
    Test_Main.BookID
FROM
    Test_Main
INNER JOIN 
    Test_Second ON Test_Main.[TypeID] = Test_Second.[TypeID]
WHERE   
    ( Test_Main.BookID IN (2,3) 
      AND Test_Main.BookID = Test_Second.BookID
    )
  OR Test_Main.BookID NOT IN (2,3)

Помимо индексов, вы также можете проверить планы выполнения этой версии (на всякий случай, я не уверен, насколько хорошо можно оптимизировать предложения CASE).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...