SQL Сервер периодически возвращает данные за недели - PullRequest
0 голосов
/ 21 апреля 2020

SQL сервер время от времени возвращает данные от часов до недель, используя как SSMS, так и соединения приложений. Проблема сохраняется достаточно долго, чтобы я мог проверить ее как в приложениях, так и в SSMS, а также выполнить слегка измененные запросы, которые возвращают последние данные. Это происходит по нескольким таблицам в базе данных. Но, кажется, изолирован в несколько рядов одновременно. ПРИМЕЧАНИЕ. Для номера элемента ie в некластеризованном индексе имеется 1 строка.

SELECT tableA.itemnumber, tableA.location, tableB.itemtype 
from tableA left join tableB on tableA.itemnumber=tableB.itemnumber 
where tableA.warehouse = @warehouse and tableA.itemnumber in (@item1, @item2, ...)

, но если я выберу из tableA напрямую или с другим запросом, присоединенным к большему количеству таблиц, то и SSMS, и приложения вернут 1 Ряд текущих данных. Также я подтвердил это поведение, используя изоляцию моментальных снимков, отсутствие изоляции и даже nolock, работающий под разными пользователями.

Я хотел бы понять, как это может произойти и возможные пути решения этой проблемы.

База данных изначально принадлежит нашей ERP.
Все таблицы являются кучами (без кластеризованного индекса).
Работает на 2012 SQL Сервер.
Реализует снимок, но не RCSI.
Индексы якобы перестраиваются каждую неделю (но не могу подтвердить, я видел фрагментацию индекса на уровне 90).

Ошибки возникают, может быть, 10 раз / 10000 в день, но их трудно отследить, поскольку данные постоянно меняются в этих таблицах в течение дня. На данный момент я делаю перекрестные ссылки на 2 запроса, и когда они не совпадают, я выдаю ошибку и говорю попробовать позже.

1 Ответ

0 голосов
/ 21 апреля 2020

(Я надеюсь, что tableA, tableB не являются реальными именами таблиц, или я хотел бы встретиться с разработчиками ERP, чтобы просто посмотреть, как они выглядят).

Но без данных трудно сказать , У вас есть данные, так что вы находитесь в лучшем положении, чем мы, чтобы отследить проблему. Я бы принял к сведению идентификаторы для некоторых нежелательных строк и посмотреть, вернутся ли они. Они должны быть возвращены вашим запросом по уважительной причине. В этом запросе у вас все равно нет фильтра по дате. Сделайте select * и посмотрите внимательно.

Может ли быть, что таблица регенерируется с регулярными интервалами, а вы выполняете запросы в неправильное время?

Возможно, вы могли бы добавить столбец отметки времени в проблемная таблица c, поэтому при обнаружении неверных записей у вас будет время вставки / обновления. И тогда, возможно, вы сможете соотнести эти ошибки с активностью в ERP (о которой мы ничего не знаем).

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

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

...