Таким образом, у нас есть часть программного обеспечения, которое имеет плохо записанный SQL-оператор, который заставляет каждую строку от таблицы быть возвращенной. Существует несколько миллионов строк в таблице, таким образом, это вызывает серьезные проблемы памяти и катастрофические отказы на нашей клиентской машине. Поставщик находится в процессе создания патча для проблемы, однако это - все еще несколько недель. Тем временем мы пытались выяснить метод ограничения количества результатов, возвращенных на стороне сервера так же, как временное приспособление.
У меня нет реальной надежды на то, чтобы там быть решением, я озирался и действительно не вижу способов сделать это, однако я надеюсь, что у кого-то могла бы быть идея.
Заранее спасибо.
Править
Я забыл важную информацию, у нас нет доступа к исходному коду, таким образом, мы не можем изменить это на стороне клиента, где SQL-оператор формируется. Нет никакого реального серверного компонента, клиент просто получает доступ к базе данных непосредственно. Любое решение в основном потребовало бы процедуры, триггера или своего рода установки/команды SQL-Server 2008.
Одним из возможных решений может быть
SELECT TOP x * FROM OffendingTable
в качестве определения вашего представления Таким образом, клиент не знает об изменении при выборе данных.
Используйте регулятор запросов.
Если вы не возражаете, чтобы не возвращать никаких данных для ошибочного запроса, регулятор запросов позволяет вам это сделать.
Для этого должна быть команда.
Я знаю, что в MYSQL это «LIMIT (firstindex, lastindex)» в конце оператора sql.
Мне кажется, я слышал, что в MSSQL можно написать:
Select TOP 10,20 ... или что-то вроде этого
Это будет означать, что вы выбрали 20 строк с 10 началом, я думаю
Вы можете использовать select top
SELECT TOP 50 PERCENT * FROM Persons(http://www.w3schools.com/sql/sql_top.asp)
или
Сделайте пагинацию, как это поможет вам
CREATE PROCEDURE [dbo].[GetRequestedRecordByPage]
@FromList nvarchar(200) -- Table Name
,@SortingCol nvarchar(200) -- Sorting column Name
,@SelectList nvarchar(200) = '*' -- Select columns list
,@WhereClause nvarchar(200) = '' -- Where clause i.e condition
,@PageNum int = 1 -- Requested page number
,@PageSize int = 5 -- No of record in page
,@TotalNoOfRecord int output -- Total no of selected records
AS
Begin
SET NOCOUNT ON
DECLARE @Query nvarchar(max) -- query going to be execute
IF rtrim(ltrim(@WhereClause)) <> ''
BEGIN
SET @Query ='SELECT @TotalNoOfRecord = COUNT(*)
FROM ' + @FromList + '
WHERE ' + @WhereClause
END
ELSE
BEGIN
SET @Query ='SELECT @TotalNoOfRecord = COUNT(*)
FROM ' + @FromList
END
/* Count no. of record */
EXEC sp_executeSQL
@Query,
@params = N'@TotalNoOfRecord INT OUTPUT',
= @TotalNoOfRecord OUTPUT
DECLARE @lbound int, @ubound int
/* Calculating upper and lower bound */
SET @lbound = ((@PageNum - 1) * @PageSize)
SET @ubound = @lbound + @PageSize + 1
/* Get list of record(s) */
SELECT @Query = ''
SELECT @Query = 'SELECT *
FROM (
SELECT ROW_NUMBER() OVER(ORDER BY ' + @SortingCol + ') AS rownumber,' +@SelectList +
' FROM ' + @FromList
IF rtrim(ltrim(@WhereClause)) <> ''
BEGIN
SELECT @Query = @Query + ' WHERE ' + @WhereClause
END
SELECT @Query = @Query + ' ) AS tbl
WHERE rownumber > ' + CONVERT(varchar(9), @lbound) +
' AND rownumber < ' + CONVERT(varchar(9), @ubound)
EXEC (@Query)
End
Если клиент использует TCP для подключения к базе данных, вы можете вставить в основном прозрачный TCP прокси-сервер между клиентом и сервером базы данных на стороне сервера. Затем вы можете переписать все оскорбительные запросы, которые приходят от клиента (используя TOP или другие средства улучшения запроса).
Затем вы настраиваете SQL Server для работы на другом порту, запускаете прокси-сервер для работы на оригинальном порту и подключаетесь к SQL-серверу на новом порту. Если вы знаете IP-адрес клиента, вы можете использовать переадресацию портов, чтобы направлять их только на прокси-сервер, а сервер базы данных оставить как есть.
Я могу написать и протестировать это за час, но это требует некоторых знаний в программировании сокетов.
Вы можете удалить из таблицы все записи, кроме X, и сохранить их в другом месте