Ограничьте количество строк, возвращенных на стороне сервера (вызванный предел)

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

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

Заранее спасибо.

Править

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

6
задан tplaner 20 May 2010 в 13:41
поделиться

5 ответов

Одним из возможных решений может быть

  • переименование вызывающей ошибки таблицы
  • , создание обновляемого представления с исходным именем таблицы
  • , выполнение SELECT TOP x * FROM OffendingTable в качестве определения вашего представления

Таким образом, клиент не знает об изменении при выборе данных.


Используйте регулятор запросов.

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

2
ответ дан 17 December 2019 в 04:43
поделиться

Для этого должна быть команда.

Я знаю, что в MYSQL это «LIMIT (firstindex, lastindex)» в конце оператора sql.

Мне кажется, я слышал, что в MSSQL можно написать:

Select TOP 10,20 ... или что-то вроде этого

Это будет означать, что вы выбрали 20 строк с 10 началом, я думаю

1
ответ дан 17 December 2019 в 04:43
поделиться

Вы можете использовать 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
1
ответ дан 17 December 2019 в 04:43
поделиться

Если клиент использует TCP для подключения к базе данных, вы можете вставить в основном прозрачный TCP прокси-сервер между клиентом и сервером базы данных на стороне сервера. Затем вы можете переписать все оскорбительные запросы, которые приходят от клиента (используя TOP или другие средства улучшения запроса).

Затем вы настраиваете SQL Server для работы на другом порту, запускаете прокси-сервер для работы на оригинальном порту и подключаетесь к SQL-серверу на новом порту. Если вы знаете IP-адрес клиента, вы можете использовать переадресацию портов, чтобы направлять их только на прокси-сервер, а сервер базы данных оставить как есть.

Я могу написать и протестировать это за час, но это требует некоторых знаний в программировании сокетов.

1
ответ дан 17 December 2019 в 04:43
поделиться

Вы можете удалить из таблицы все записи, кроме X, и сохранить их в другом месте

0
ответ дан 17 December 2019 в 04:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: