2013-11-08 4 views
-3

У меня есть запрос, который истекает из-за большого размера таблицы (более 10 миллионов записей).sql server, return resultset before sql timeout

Создание новых индексов - это не вариант. Запрос выполняется на сервере sql и вызывается веб-узлом .net.

Есть ли способ вернуть результат до истечения таймаута.

select count(XYZ.A) from XYZ where XYZ.B = 'abc'; 

Что-то на линиях измерения прошедшего времени и возвращения результата непосредственно перед истечением времени запроса.

Thanks

+0

Какие СУБД вы используете? Покажите нам свою структуру таблицы? – Kermit

+1

У вас есть индексы на этих таблицах? Если у вас есть указатель на небольшом столбце с недействительным значением (например, 'INT' или' BIGINT'), тогда 'COUNT (*)' будет использовать этот столбец и, вполне возможно, ему придется читать ** намного меньше страницы данных ** для определения количества –

+0

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

ответ

1

Попробуйте добавить указатели в таблицу.

Но затем проверьте свой план выполнения, перейдя в Query> Display Estimated Execution Plan. Прокрутите список вниз по плану, ищите самую большую стоимость запроса. Нажмите зеленый текст. Вероятно, это говорит «Отсутствующий индекс». Щелкните правой кнопкой мыши и выберите «Отсутствует указатель». Он будет генерировать общий код для создания ваших индексов. Отредактируйте шаблон и запустите его.

Надеюсь, это поможет.

+0

Добавление индексов не является вариантом. –

+0

Возвращение данных во время выполнения запроса не является вариантом. SQL не оценивает время запроса. Он может оценить стоимость запроса, но это не связано с временем выполнения. Вам нужно будет найти работу, например, выполнить запрос в патронах (получить все записи за 2012 год, затем «11», затем «10» и т. Д.). В моей строке подключения мне пришлось увеличить тайм-аут по умолчанию для соединений SSRS из От 30 секунд до 600. – BClaydon