Оптимизатор Teradata, равно как и в SQL - PullRequest
0 голосов
/ 14 сентября 2010

В настоящее время я пытаюсь оптимизировать некоторые отчеты bobj, где наш бэкэнд - Teradata. Оптимизатор Teradata кажется очень привередливым, и мне было интересно, если бы кто-нибудь придумал решение или обходной путь , чтобы заставить оптимизатор обрабатывать лайки в аналогичных отношениях с равными .

My issue is that we allow the user to input one of two methods:
 1. Enter the Number:
    or
 2. Enter a Number like:

Первый вариант работает как сон, в то время как второй вариант тянет время нашего запроса с 6 секунд до 2 минут.

В дополнение к этому;Кто-нибудь знает какие-нибудь хорошие статьи, обсуждения, видео и т. д. об оптимизации операторов SQL для оптимизатора teradata?

Ответы [ 4 ]

1 голос
/ 30 сентября 2010

Поскольку столбец определен как VARCHAR, и вы используете оператор LIKE, вы исключаете возможность использования PI для доступа с одним AMP. Помните, что первичной задачей первичных индексов является распределение данных между AMP в системе. Поскольку вы используете оператор LIKE против PI, оптимизатор должен выполнить операцию «все AMP», чтобы удовлетворить оператор LIKE.

WHERE MyPIColumn LIKE '123%'

Хэширование значений, начинающихся с 123, может завершиться на нескольких AMP.

WHERE MyPIColum = '123'

Хеширование 123 поместит каждую запись в один и тот же AMP. Запрос '123' всегда будет одной операцией AMP.

Статистические данные об этом могут помочь с оценками строк, но, скорее всего, не устранят операцию «все AMP».

  1. Это уникальный ПИ или неуникальный ПИ?
  2. Почему тип данных был выбран символьным, а не числовым? Хотя GT (E) или LT (E) могут привести к одной и той же операции «All-AMP».
  3. Этот PI является общим для других таблиц в модель для облегчения AMP местных объединить стратегии?
1 голос
/ 15 сентября 2010

Вам понадобится полнотекстовый индекс / предварительно токенизированный индекс, например, lucene, а также поиск с двумя синтаксическими анализами.

Например, при вставке «12345» в вашу базу данных создайте ссылку из «1», «12 "," 123 "," 234 "... и т. Д. До" 12345 ".

Затем при использовании найдите что-то вроде" 123 ** ", найдите" 123 "из таблицы поиска и ищитезапись "12345"

1 голос
/ 15 сентября 2010

Если вы проводите прямое сравнение с VARCHAR, например,

Column LIKE 'VALUE'

, тогда вы можете попробовать использовать NUSI для этого столбца.Убедитесь, что вы собираете статистику для первичного индекса таблицы и для индекса

1 голос
/ 15 сентября 2010

Я бы взял, что номер проиндексирован?Teradata использует хеширование для индексации, поэтому при равенстве это приведет к использованию индекса, в то время как like приведет к полному сканированию таблицы.

Если у вас есть реальная потребность в использовании like, вы не сможете ничего сделать,Вы можете попробовать использовать Substr(Number, 1, 3) = '123' вместо Number LIKE '123%'.В прошлом я получал небольшие улучшения производительности, но не ожидайте ничего впечатляющего.

...