#sql-server #performance #data-retrieval
#sql-сервер #Производительность #поиск данных
Вопрос:
Я извлекаю данные из таблицы, имеющей 20 тысяч строк, из стороннего источника, где способ заполнения таблицы не может быть изменен таблицей.
На третьей стороне таблица заполняется следующим образом
- Новые данные поступают каждые 15 секунд примерно в 7 тыс. строк.
- В любой момент времени будут доступны только последние три временные метки, остальные данные будут удалены.
- В таблице нет индекса. Ни один из них не может быть запрошен по неизбежным причинам и может быть медленным при вставке.
Я знаю о следующем
- Блокировки строк и вверх по иерархии другие блокировки выполняются во время вставки данных.
- Проблема сохраняется при выборе без БЛОКИРОВКИ.
- При извлечении не происходит соединения с какой-либо другой таблицей, поскольку мы объединяем таблицы, когда данные находятся у нас локально во временной таблице.
- Когда вставка данных прекращается у третьей стороны, данные поступают от 100 мс до 122 мс.
- Когда служба включена, это занимает от 3 до 5 секунд.
Любая помощь / предложение / подход приветствуется заранее.
Комментарии:
1. Если вы исключаете все это, то аппаратное обеспечение является единственным гибким решением Или не запрашивает данные из ЭТОЙ таблицы — добавьте триггер и запишите изменения в таблицу ведения журнала, затем интегрируйте его оттуда в НОРМАЛЬНУЮ таблицу, которая позволяет, например, настраивать индекс. Без индекса вы застряли в поиске по таблице, независимо от того, что вы хотите.
2. Если вы не можете добавить индекс, это означает, что вы не можете изменить структуру таблицы или что-либо, связанное с DDL. Какие изменения вам разрешено вносить?
3. @PhilipKelley у нас есть только права выбора, но мы можем давать им предложения, отличные от индексов, поскольку предложение индексов уже отброшено
4. @PhilipKelley пожалуйста, также есть идеи, почему ОТСУТСТВИЕ блокировки не помогает. Если я прав, без блокировки есть только блокировки схемы. итак, почему это влияет на выборку данных
5. Что касается NO LOCK, я никогда не использовал его и сомневаюсь, что когда-либо буду. Я бы предположил, что это как-то связано со средствами, с помощью которых они фактически загружают данные.
Ответ №1:
Следующее является довольно высокопроизводительным решением. Основываясь на том, что вы сказали, я считаю, что это сработает, но потребуется проработать много деталей.
Кратко: разделы таблицы.
- Настройте схему разделов в этой таблице
- Основываясь на статье, которую я недавно прочитал, это МОЖНО сделать с неиндексированными кучами
- Данные загружаются каждые 15 секунд? Тогда разделы должны основываться на этих 15-секундных интервалах
Для заданной загрузки данных (т. е. один раз в 15 секунд):
- Создайте «следующий» раздел
- Загрузите данные
- ПЕРЕКЛЮЧИТЕ новый раздел (новые данные) в основную таблицу
- ОТКЛЮЧИТЕ самый старый раздел (данные одновременно присутствуют только за три периода времени, верно?
- Удалите этот «удаленный» раздел
Хотя это потенциально эффективно, это было бы очень грязно. Большая проблема, которую я вижу, заключается в том, что если они не могут добавить простой индекс, я не понимаю, как они могли бы настроить разделение таблицы.
Другой подобный трюк заключается в настройке секционированных представлений, что по сути является «созданием собственного секционирования». Это будет выглядеть примерно так:
- Иметь набор идентично структурированных таблиц
- Создайте объединение всех таблиц в виде
- При загрузке данных создайте новую таблицу, загрузите данные в эту таблицу, затем ИЗМЕНИТЕ ПРЕДСТАВЛЕНИЕ, чтобы включить эту самую новую таблицу и удалить самую старую таблицу.
Это может привести к худшим проблемам с блокировкой, чем решение для разделения, хотя многое зависит от того, насколько интенсивна ваша активность чтения. И, конечно, это намного сложнее, чем просто добавление индекса.