Проблемы с производительностью при поиске строк в ETL - PullRequest
1 голос
/ 14 сентября 2009

У меня проблема с производительностью ETL-процесса. У меня есть таблица с 4+ миллиардов строк в нем. Структура:

  • id bigint identity (1,1)
  • raw_url varchar (2000) не равно нулю
  • md5hash char (32) не нуль
  • job_control_number int not null

Кластерный уникальный индекс по идентификатору и некластерный уникальный индекс по md5hash

SQL Server 2008 Enterprise Сжатие на уровне страницы включено

Мы должны хранить необработанные URL-адреса из журналов нашего веб-сервера в качестве измерения. Поскольку необработанная строка> 900 символов, мы не можем поместить уникальный индекс в этот столбец. Мы используем хеш-функцию md5 для создания уникальной 32-символьной строки для целей индексации. Мы не можем разрешить дублирование строк raw_url в таблице.

Проблема в низкой производительности. Конечно, md5hash по своей природе случайен, поэтому фрагментация индекса достигает 50%, что приводит к неэффективному вводу-выводу.

Ищите советы о том, как структурировать это, чтобы обеспечить лучшую производительность вставки и поиска, а также меньшую фрагментацию индекса.

Ответы [ 2 ]

1 голос
/ 05 ноября 2009

Я бы сказал, что это должно быть вырожденное измерение в таблице фактов.

И придумайте способ разделения данных. Может быть, взять первые ххх символы и сохранить их как отдельное поле, и разделить этим. Затем, когда вы выполняете поиск, вы пропускаете короткие и длинные столбцы, поэтому он сначала просматривает раздел.

1 голос
/ 14 сентября 2009

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

Редактировать (из комментария) : И хотя я думаю об этом, если вы выключите сжатие на уровне страниц, это также улучшит ввод-вывод.

...