所以我们有一个软件,它的SQL语句编写得很糟糕,导致表中的每一行都被返回。表中有几百万行,因此这会导致严重的内存问题和客户端计算机崩溃。供应商正在为该问题创建补丁,但仍需要几周时间。与此同时,我们试图找出一种限制服务器端返回结果数量的方法,只是作为临时修复。
我没有真正的希望有一个解决方案,我环顾四周,并没有真正看到任何方法这样做,但我希望有人可能有一个想法。
提前谢谢。
修改的
我忘记了一条重要的信息,我们无法访问源代码,因此我们无法在形成SQL语句的客户端更改此信息。没有真正的服务器端组件,客户端只是直接访问数据库。任何解决方案基本上都需要一个过程,触发器或某种SQL-Server 2008设置/命令。
答案 0 :(得分:2)
一种可能的解决方案可能是
SELECT TOP x * FROM OffendingTable
视图定义因此,客户端在选择数据时不知道更改。
如果您不介意根本不为有问题的查询返回任何数据,则查询调控器允许您这样做。
答案 1 :(得分:1)
必须有一个命令。
我知道在MYSQL中,在sql语句的末尾是“LIMIT(firstindex,lastindex)”。
我想我在MSSQL中听说过你可以写:
选择TOP 10,20 ......或类似的东西
这意味着你选择20行,其中10开始我认为
答案 2 :(得分:1)
你可以使用select top
从人群中选择前50%*(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
答案 3 :(得分:1)
如果客户端使用TCP连接到数据库,则可以在服务器端的客户端和数据库服务器之间插入大部分透明的TCP代理服务器。然后,您可以重写来自客户端的任何有问题的查询(使用TOP或某些改进查询的方法)。
然后,将SQL Server配置为在其他端口上运行,启动代理以在原始端口上提供服务,并使其连接到新端口上的SQL Server。如果您知道客户端的原始IP地址,则可以使用端口转发,以便可以将它们直接指向代理,并保持数据库服务器配置为原样。
我可以在一小时内编写并测试它,但它确实需要一些socket编程知识。
答案 4 :(得分:0)
你可以从表中删除除X记录以外的所有记录并将它们存储在其他地方