Быстрый поиск данных без индексов в таблице с вставками данных каждые 10 секунд (короткий промежуток времени)

#sql-server #performance #data-retrieval

#sql-сервер #Производительность #поиск данных

Вопрос:

Я извлекаю данные из таблицы, имеющей 20 тысяч строк, из стороннего источника, где способ заполнения таблицы не может быть изменен таблицей.

На третьей стороне таблица заполняется следующим образом

  1. Новые данные поступают каждые 15 секунд примерно в 7 тыс. строк.
  2. В любой момент времени будут доступны только последние три временные метки, остальные данные будут удалены.
  3. В таблице нет индекса. Ни один из них не может быть запрошен по неизбежным причинам и может быть медленным при вставке.

Я знаю о следующем

  1. Блокировки строк и вверх по иерархии другие блокировки выполняются во время вставки данных.
  2. Проблема сохраняется при выборе без БЛОКИРОВКИ.
  3. При извлечении не происходит соединения с какой-либо другой таблицей, поскольку мы объединяем таблицы, когда данные находятся у нас локально во временной таблице.
  4. Когда вставка данных прекращается у третьей стороны, данные поступают от 100 мс до 122 мс.
  5. Когда служба включена, это занимает от 3 до 5 секунд.

Любая помощь / предложение / подход приветствуется заранее.

Комментарии:

1. Если вы исключаете все это, то аппаратное обеспечение является единственным гибким решением Или не запрашивает данные из ЭТОЙ таблицы — добавьте триггер и запишите изменения в таблицу ведения журнала, затем интегрируйте его оттуда в НОРМАЛЬНУЮ таблицу, которая позволяет, например, настраивать индекс. Без индекса вы застряли в поиске по таблице, независимо от того, что вы хотите.

2. Если вы не можете добавить индекс, это означает, что вы не можете изменить структуру таблицы или что-либо, связанное с DDL. Какие изменения вам разрешено вносить?

3. @PhilipKelley у нас есть только права выбора, но мы можем давать им предложения, отличные от индексов, поскольку предложение индексов уже отброшено

4. @PhilipKelley пожалуйста, также есть идеи, почему ОТСУТСТВИЕ блокировки не помогает. Если я прав, без блокировки есть только блокировки схемы. итак, почему это влияет на выборку данных

5. Что касается NO LOCK, я никогда не использовал его и сомневаюсь, что когда-либо буду. Я бы предположил, что это как-то связано со средствами, с помощью которых они фактически загружают данные.

Ответ №1:

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

Кратко: разделы таблицы.

  • Настройте схему разделов в этой таблице
  • Основываясь на статье, которую я недавно прочитал, это МОЖНО сделать с неиндексированными кучами
  • Данные загружаются каждые 15 секунд? Тогда разделы должны основываться на этих 15-секундных интервалах

Для заданной загрузки данных (т. е. один раз в 15 секунд):

  • Создайте «следующий» раздел
  • Загрузите данные
  • ПЕРЕКЛЮЧИТЕ новый раздел (новые данные) в основную таблицу
  • ОТКЛЮЧИТЕ самый старый раздел (данные одновременно присутствуют только за три периода времени, верно?
  • Удалите этот «удаленный» раздел

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

Другой подобный трюк заключается в настройке секционированных представлений, что по сути является «созданием собственного секционирования». Это будет выглядеть примерно так:

  • Иметь набор идентично структурированных таблиц
  • Создайте объединение всех таблиц в виде
  • При загрузке данных создайте новую таблицу, загрузите данные в эту таблицу, затем ИЗМЕНИТЕ ПРЕДСТАВЛЕНИЕ, чтобы включить эту самую новую таблицу и удалить самую старую таблицу.

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