2012-06-21 105 views
1

我想知道是否有限制或方法来限制执行查询中没有顶部子句时表返回的行数。我们无法轻松修改正在执行的SQL,因此解决方案需要位于db级别。SQL Server TOP约束

我们有很多疑问的我们的系统盲目建立的是像

select * from table where email = 'john' 

,当我们有小桌子这个工作得很好,但现在我们的表有+10000行,这正成为低效。

感谢您的任何建议。

+1

首先:一'TOP'没有'ORDER BY'是毫无意义的 - 你想前五名行 - 但下令*** *什么?!?! **你需要总是定义一个'ORDER BY'。一旦你这样做了,你可以使用索引来加速这个ORDER BY子句(但是如果你使用SELECT * ......则停止这样做 - 选择你真正需要的那些列) –

+6

如果破坏的代码是,代码修复你应该。换句话说,没有多少服务器修补可以修复错误的代码。 –

+0

嗯,一个服务器设置,这意味着没有'WHERE'子句*的'SELECT'不会*返回所有行?我永远不会看到造成问题:) – AakashM

回答

4

答案是“是”。一种方法是使用“set rowcount”。另一种方法是使用内置于查询连接中的任何设施来实现此目的。

例如:

SET ROWCOUNT 10 
select * from INFORMATION_SCHEMA.COLUMNS 

这将最大返回行至10对任何后续查询。但是,为了将其应用于您的应用程序,我们需要更多信息,例如应用程序如何访问数据库。

1

这是一个有点令人费解:

CREATE TABLE temp 
(
y char(9) PRIMARY KEY, 
x char(9) 
); 

insert into temp (x, y) values ('j', 'hello'); 
insert into temp (x, y) values ('j', 'world'); 
insert into temp (x, y) values ('q', 'foo'); 
insert into temp (x, y) values ('q', 'bar'); 


with myCTE(x,y,r) as 
(
select 
    x 
    ,y 
    , r = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) 
from temp 
) 
select * from myCTE where r <= 3;