Корпоративные базы данных - статьи


Состояние и перспективы Microsoft SQL Server - часть 4


над одной таблицей)
  • пересечение двух множеств RID по каждому индексу для получения результирующего множества (например, SELECT * FROM orders WHERE cust_id = 987 and order_value >= 10000- индексы по cust_id и order_value)
  • создание covering index из нескольких имеющихся, которые в отдельности не являются covering для данного запроса (covering index позволяет читать значения колонок с leaf-уровня, не залезая в саму таблицу)
  • Merge Join
  • Получить row из outer table
  • Получить row с таким же ключом из inner table
  • Если найден, далее- по inner table, если нет- по внешней
  • Выглядит как обычная nested iteration, но проходится за один шаг и потому выполняется быстрее
  • Hash Join
  • Хэш-функция - свертка ключа, на выходе- значение меньшего размера, основное требование- равномерное распределение, главное преимущество- доступ к записи за одно обращение к таблице
  • Пример - алфавитная записная книжка, первая буква- хэш-функция, буквенные секции - букеты
  • Применяется, когда не задан порядок сортировки или нет подходящих индексов
  • Прочитать меньшую таблицу, нарезать ключи и RID в букеты хэш-таблицы
  • Читать большую таблицу. Хэшировать ключ, проверить хэш-таблицу, повторить.
  • Hash aggregation (sum, ...)
  • Из входной таблицы хэшировать ключ в букет
  • Если он там уже лежит, вычислить агрегат
  • Зациклить, в конце выдать окончательный агрегат

    Оптимизация запросов

    • Запросы оптимизируются по условной стоимости
    • Учитываются факторы количества операций чтения/записи и времени работы процессора
    • А также целевые записи (напр., построить оптимальный план для выбора первых 10 записей)
    • При этом используются
    • Статистика по хранимым данным (плотности и гистограммы)
    • Индексы (например, наличие уникального индекса о чем-то говорит?)
    • Ограничения (DRI, сonstraints, nulls)
    • Constraints и разбиение данных
    • Имеем несколько таблиц: январь, февраль, март
    • Построили совокупный view- union
    • Делаем из него select за один месяц, QP ищет только в одной таблице (при условии, что на нее был определен месячный constraint)
    • Auto partitioning при вводе by value между несколькими таблицами - в следующей версии
    • Обработка массивных обновлений- QP поддерживает индексы
    • При массовых insert, update, delete изменения сортируются по индексу и применяются за один проход (на один индекс)