你知道多少关于sql select top N?
背景:
sql select top N 语句是一个非常重要的语句, 在实现分页查询中是不可或缺的. 由于分页查询通常涉及含有大量记录的表, 并且是为大量用户分享的任务,因此,对其进行优化是很有意义的。
实现sql top N 的功能有几种变种:
1. set rowcount @n; select ... order by somefields
2. select top (@n) .... order by somefields
3. select top (xx) .... order by somefields
-- 其中 xx是一个常数, 比如10
在上述的查询中引用的somefields, 如果涉及的表在其上有索引是一种情况, 没有索引又是一种情况。
有索引的话,即使表含有很多记录,也不会对性能造成太大问题。
没有索引的情况也是会有实际需求的,比如实时的找出销售最好的前100个产品。在没有索引时的查找Top N, 如果不进行细致的优化,会对性能造成很大的影响,甚至会使得整个系统瘫痪。
如果要对top n进行优化,那么了解sql server 是如何处理上述的top n 的几种变形就是很有必要的. 下面的文章是我在MS的论坛上发的, 我自己懒得翻译成中文了,和大家共享一下吧。
原文(是我在http://social.msdn.microsoft.com/Forums/en/transactsql/thread/944ad896-b34c-4dea-af55-cfbae79251f6上的一个回贴)
Question:
--fast
1. select top 100 * from test where c1 < 30000 order by c2
--slow
2. select top 101 * from test where c1 < 30000 order by c2
1. is more than two times faster than 2.
Why?
What a coinccident! I am on the same issue just at the time.
I was considering implementing an algorithm like this:
First populate the N rows to a table variable (with index on the sort column), then iterate through all left rows, adding one row to the table variable if bigger than min of the table, else discard it. This could be either done in sql or clr aggregate function.
Then I thought maybe MS had already done it in the Top N stuff, so started to run a test against it.
CREATE TABLE [dbo].[NUM]
([n] int NOT NULL, s varchar(128) NULL, PRIMARY KEY CLUSTERED([n] ASC))
go
-- populate data
set nocount on
declare @n int, @i int
set @n=1000000
set @i = 0
while @n>0 begin
if @i = 0 begin tran
insert
相关文档:
SQL UNION 操作符
UNION 操作符用于合并两个或多个 SELECT 语句的结果集。
请注意,UNION 内部的 SELECT 语句必须拥有相同数量的列。列也必须拥有相似的数据类型。同时,每条 SELECT 语句中的列的顺序必须相同。
SQL UNION 语法
SELECT column_name(s) from table_name1
UNION
SELECT column_name(s) from table_na ......
SQL中文问排序
首先把这些信息在editplus中,转换为一列,拷贝到excel中,拷贝后记着在第一行前插入一行,作为列标头,例如为name,然后在sql中表中,导入数据,生成一个新表,例如fenlei,打开sql语句行,执行:
SELECT *
from Fenlei
ORDER BY name COLLATE Chinese_PRC_CS_AS_KS_WS
......
首先配置SQLSERVER2005:
打开”Microsoft SQL Server Management Studio“直接用Windows 用户连接进入,再在“安全性”中的“登录名”内的“新建登录名”,你就对应的添好“确定”就可以了。
再在你对应的“数据库”里“安全性&r ......
之前使用PLSQL,都是以写入内容为主,写入中文内容偶有乱码,但是只在显示上并未影响存取,所以没有在意。
今天在修改一个视图时,需要将修改内容记录下来,so,想写个修改记录,就把视图内容拷贝了出现,发现拷贝出现的中文内容出现乱码。
并未完全在意,以为只要原样放回plsql就会好的,但是保存再取出放到plsql中发现仍 ......
情景一:
表中数据
name score
aaa 11
aaa 19
bbb 12
bbb 18
ccc 19
ddd 21
期望查询结果如下
name score
aaa 30
bbb   ......