Data Vault 2.0 в SQL Server
В хранилище данных 2.0 хешируется бизнес-ключ и этот хеш-код берется в качестве первичного ключа таблицы. Таблицы ссылок также используют первичный ключ хеша для создания отношений.
Моя проблема с хэшами, которые в основном случайные, оптимизатор запросов не может применить какую-либо хорошую оценку, поскольку статистика - конечно - не может использоваться для случайных распределенных данных.
Таким образом, оптимизатор запросов использует странные плоскости, где он хочет часто сортировать (потому что считает, что сортировать нужно только 4 строки). Так как я, конечно, не первый, кто имеет дело с хранилищем данных на сервере SQL, как это можно исправить?
Когда оптимизатор запросов использует поиск по индексу или оператор соединения, он полностью пропускает оценку строки, поэтому выбирает нелепые планы.
Я должен прокачать их подсказками соединения и подсказками запроса, такими как (FORCE ORDER), чтобы получить что-нибудь из этого.
Какой общий подход к этому?
2 ответа
Я твердо согласен с вашим выводом, что хеширование сделает все данные, имеющие структуру / порядок, абсолютно случайными, что сделает невозможной любую форму полезной статистики базы данных.
На самом деле я сам экспериментировал на SQL-сервере и пришел к тому же выводу, что и вы, при поддержке планов объяснения
Вот почему я твердо верю, что вы / мы должны рассмотреть возможность использования связанного бизнес-ключа в качестве первичного ключа ВМЕСТО его хеширования.
Аргументы, которые приводятся для хеширования, относятся к области:
- Объединение в Char (32) (символьная строка хеша MD5) более производительно по сравнению с объединением в переменных символьных полях
- Хеширование уменьшает количество горячих точек в вашем кластере MPP при записи данных
Но я до сих пор не вижу доказательства для аргумента 1: поскольку вы упоминаете, вы теряете любую полезную статистику при присоединении! Более того: я знаю, что многие натуральные бизнес-ключи на самом деле намного меньше 32 символов... Я на самом деле задал вопрос, связанный с этой темой несколько дней назад...
Затем к аргументу 2: В большинстве баз данных MPP NoSQL (Key-value, Document, Column Family) рекомендуется использовать хороший NATURAL (сцепленный) ключ в качестве ключа сегментирования, а не хеш. Пример: см. Этот совет для Кассандры.
Вот почему я не согласен с теорией хеширования Data Vault 2: я не видел ни одного доказательства, подтверждающего это... Это одна из причин, по которой я предлагаю новый подход к моделированию ансамблей @ DMZone Berlin в октябре.
Лично я бы не хэшировал BK, но включил бы все поля в HUB, если бы это был составной ключ. Почему таблица LINK использует хеш-значения, она должна использовать HUB_ID, который я всегда устанавливал бы в качестве возрастающего значения
Однако я бы создал и сохранил HASH в таблице SAT, так как это самый быстрый способ проверить изменения в процессе ETL: хэшировать входящие значения и сравнивать их с хэшем текущей записи SAT - нет смысла повторно вычислять хэш на существующая запись.