SQL (DB2) Оптимизация предложения WHERE - PullRequest
0 голосов
/ 03 августа 2011

Я собираю большой список продуктов в массив, который называет уникальный продукт по строке и номенклатуре.Затем я передаю это в предложение WHERE моего оператора SQL.Когда этот список продуктов становится достаточно большим, мое предложение WHERE также превращается в ужасный беспорядок.Вот пример того, как может выглядеть мое предложение WHERE:

 WHERE FOO = 'Y'
 AND ((iline = ? AND iitem = ? )
 OR (iline = ? AND iitem = ? ) 
 OR ... 
 OR (iline = ? AND iitem = ? ))

И так далее, где каждый "iline =? AND iitem =?"являются уникальным продуктом.Очевидно, я не эксперт в этом, но кажется, что случайные 100+ ИЛИ в моем предложении WHERE не очень эффективны, и я мог бы как-то лучше это делать.

Ответы [ 2 ]

1 голос
/ 03 августа 2011

Вы можете использовать что-то вроде этого:

Presuming, iline has values like A,B,C,D,E.... and iitem posses 1,2,3,4,5... Now, you need combinations to be satisfied like 
(iline = 'A' AND iitem = '2'), 
(iline = 'E' AND iitem = '2'), 
(iline = 'B' AND iitem = '3'), 
(iline = 'A' AND iitem = '3'), 
(iline = 'E' AND iitem = '2'),
(iline = 'B' AND iitem = '4')

Это, вероятно, может сжать до

WHERE FOO = 'Y'
AND (iline = 'A' and iitem IN ('2','3'))
AND (iline = 'B' and iitem IN ('3','4'))
AND (iline = 'E' and iitem IN ('2','3'))

В идеале вам нужно добавить:

  • И когда у вас есть условие на iline
  • еще один литерал IN существующего состояния. Скажем, если вам нужно добавить новое условие (iline = 'B' and iitem = '5') вместо добавления нового ИЛИ, вы можете просто добавить литерал '5' к существующему условию iline = 'B', например (iline = 'B' and iitem IN ('3','4','5'))

Надеюсь, я разъяснил свою концепцию, пожалуйста, дай мне знать твои вопросы.

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

Я сомневаюсь, что это более эффективно, но вместо этого вы можете использовать оператор case:

WHERE 
  FOO = 'Y'
  AND iline = CASE iitem
                WHEN ? THEN ?
                WHEN ? THEN ?
                ...
              END
...