当前位置:  数据库>sqlserver
本页文章导读:
    ▪SQL语句练习实例之十——SQL SERVER 行转列的性能测试      在数据库设计时,有时候为了实现数据规范化的目的,会将属于同一个人的属性记录值改用多条记录的方式来存储,显示时又希望将多个属性数据合并成一行来显示,这就是行转列。例如:下.........
    ▪真正高效的SQLSERVER分页查询      Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID、YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询每页30条,查询第1500页(即第4.........
    ▪sql记录2013-04-01      SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。查询和更新指令构成了 SQL 的 DML 部分:SELECT - 从数据库表中获取数据UPDATE - 更新数据库表.........

[1]SQL语句练习实例之十——SQL SERVER 行转列的性能测试
    来源:    发布时间: 2013-10-25

在数据库设计时,有时候为了实现数据规范化的目的,会将属于同一个人的属性记录值改用多条记录的方式来存储,显示时又希望将多个属性数据合并成一行来显示,这就是行转列。

例如:下图的成绩记录表。

 

那么行转列的效率又将如何呢?我试了以下三种方式进行行转列的测试。测试数据表中的记录数量为120万条,字段为10个,测试下来感觉性能还不错。

一、第一种方式(SQL 2000以后的版本)

 

--总计120万记录
SELECT wbook_no
, MAX(CASE WHEN [COP_G_NO] ='60174257' THEN AR END) "60174257"
, MAX(CASE WHEN [COP_G_NO] ='50165814' THEN AR END) "50165814"
, MAX(CASE WHEN [COP_G_NO] ='10221553' THEN AR END) "10221553"
FROM
(
SELECT [COP_G_NO]
, wbook_no
, SUM(G_QTY * decl_Price) AR
FROM WBK_PDE_LIST
WHERE [COP_G_NO] in('60174257','50165814','10221553')
GROUP BY [COP_G_NO]
, wbook_no
) A
GROUP BY wbook_no

 

二、第二种方式(SQL 2000以后的版本)

SELECT wbook_no
, SUM(
CASE WHEN [COP_G_NO] ='60174257' THEN G_QTY * decl_Price END) "60174257"
, SUM(
CASE WHEN [COP_G_NO] ='50165814' THEN G_QTY * decl_Price END) "50165814"
, SUM(
CASE WHEN [COP_G_NO] ='10221553' THEN G_QTY * decl_Price END) "10221553"
FROM WBK_PDE_LIST
WHERE 1=1
and [COP_G_NO] in('60174257','50165814','10221553')
GROUP BY wbook_no

 

三、第三种方式:使用PIVOT命令来实现(SQL 2005以后的版本才提供以命令)

SELECT WBOOK_NO
, "60174257"
, "50165814"
, "10221553"
FROM
(
SELECT [COP_G_NO]
, WBOOK_NO
, G_QTY * decl_Price AR
FROM WBK_PDE_LIST
WHERE 1=1
AND [COP_G_NO] in('60174257','50165814','10221553')
)AS D
PIVOT
(
SUM(AR)
FOR [COP_G_NO] in([60174257],[50165814],"10221553")
) AS P

 

 

四、以上三种方式的查询结果都如下:

 

五、最后我们来比对一下各自性能损耗。从比对结果表来看三者的差别不大,总的来说都在2-3秒之间。

 

IO

CPU

逻辑读取

物理读取

预读

CPU 时间

占用时间

  

表扫描

计算标题

排序

表扫描

计算标题

排序

ms

ms

 

第一种方式

17.652

0

0.0112513

1.33851

0.121668

0.0131525

23827

370

23827

635

2216

 

第二种方式

17.652

0

0.0112513

1.33851

0.121668

0.0131525

23827

374

23827

618

2171

 

第三种方式

17.652

0

0.0112513

1.33851

0.121668

0.0131525

23827

370

23827

563

1960


    
[2]真正高效的SQLSERVER分页查询
    来源:    发布时间: 2013-10-25

Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID、YEAR...(其他省略),数据53210条(客户真实数据,量不大),分页查询每页30条,查询第1500页(即第45001-45030条数据),字段ID聚集索引,YEAR无索引,Sqlserver版本:2008R2

第一种方案、最简单、普通的方法:

SELECT TOP 30 * FROM ARTICLE WHERE ID NOT IN(SELECT TOP 45000 ID FROM ARTICLE ORDER BY YEAR DESC, ID DESC) ORDER BY YEAR DESC,ID DESC

     平均查询100次所需时间:45s

第二种方案:

SELECT * FROM
(
  SELECT TOP 30 * FROM (SELECT TOP 45030 * FROM ARTICLE ORDER BY YEAR DESC, ID DESC) f ORDER BY f.YEAR ASC, f.ID DESC
) s ORDER BY s.YEAR DESC,s.ID DESC

     平均查询100次所需时间:138S

第三种方案:

SELECT * FROM ARTICLE w1,
(
SELECT TOP 30 ID FROM
(
SELECT TOP 50030 ID, YEAR FROM ARTICLE ORDER BY YEAR DESC, ID DESC
) w ORDER BY w.YEAR ASC, w.ID ASC
) w2 WHERE w1.ID = w2.ID ORDER BY w1.YEAR DESC, w1.ID DESC

     平均查询100次所需时间:21S

第四种方案:

SELECT * FROM ARTICLE w1
WHERE ID in
(
SELECT top 30 ID FROM
(
SELECT top 45030 ID, YEAR FROM ARTICLE ORDER BY YEAR DESC, ID DESC
) w ORDER BY w.YEAR ASC, w.ID ASC
)
ORDER BY w1.YEAR DESC, w1.ID DESC

     平均查询100次所需时间:20S

第五种方案:

SELECT w2.n, w1.* FROM ARTICLE w1,
(
  SELECT TOP 50030 row_number() OVER (ORDER BY YEAR DESC, ID DESC) n, ID FROM ARTICLE
) w2 WHERE w1.ID = w2.ID AND w2.n > 50000 ORDER BY w2.n ASC

     平均查询100次所需时间:15S

 

 

查询第1000-1030条记录

第一种方案:

SELECT TOP 30 * FROM ARTICLE WHERE ID NOT IN(SELECT TOP 1000 ID FROM ARTICLE ORDER BY YEAR DESC, ID DESC) ORDER BY YEAR DESC,ID DESC

     平均查询100次所需时间:80s

第二种方案:

SELECT * FROM
(
  SELECT TOP 30 * FROM (SELECT TOP 1030 * FROM ARTICLE ORDER BY YEAR DESC, ID DESC) f ORDER BY f.YEAR ASC, f.ID
    
[3]sql记录2013-04-01
    来源:    发布时间: 2013-10-25

SQL (结构化查询语言)是用于执行查询的语法。但是 SQL 语言也包含用于更新、插入和删除记录的语法。

查询和更新指令构成了 SQL 的 DML 部分:

  • SELECT - 从数据库表中获取数据
  • UPDATE - 更新数据库表中的数据
  • DELETE - 从数据库表中删除数据
  • INSERT INTO - 向数据库表中插入数

SQL 的数据定义语言 (DDL) 部分使我们有能力创建或删除表格。我们也可以定义索引(键),规定表之间的链接,以及施加表间的约束。

SQL 中最重要的 DDL 语句:

  • CREATE DATABASE - 创建新数据库
  • ALTER DATABASE - 修改数据库
  • CREATE TABLE - 创建新表
  • ALTER TABLE - 变更(改变)数据库表
  • DROP TABLE - 删除表
  • CREATE INDEX - 创建索引(搜索键)
  • DROP INDEX - 删除索引

SQL SELECT 语法

SELECT 列名称 FROM 表名称

以及:

SELECT * FROM 表名称

 

SELECT 列名称 FROM 表名称 WHERE 列 运算符 值

下面的运算符可在 WHERE 子句中使用:

操作符描述=等于<>不等于>大于<小于>=大于等于<=小于等于BETWEEN在某个范围内LIKE搜索某种模式

 AND (并且) or (和)

desc (倒着) asc(正着)

 

INSERT INTO 语句

INSERT INTO 语句用于向表格中插入新的行。

语法

INSERT INTO 表名称 VALUES (值1, 值2,....)

我们也可以指定所要插入数据的列:

INSERT INTO table_name (列1, 列2,...) VALUES (值1, 值2,....)

 

Update 语句

Update 语句用于修改表中的数据。

语法:

UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值

DELETE 语句

DELETE 语句用于删除表中的行。

语法

DELETE FROM 表名称 WHERE 列名称 = 值

TOP 指针从最上面开始(顶上、上端)

 

LIKE '%字段%' (百分号在前表示查找末尾、在后面表示查找前端、否则。包含)

%替代一个或多个字符_未知的可用_来代替[charlist]字符列中的任何单一字符

[^charlist]

或者

[!charlist]

 不在字符列中的任何单一字符

 

IN 操作符

WHERE column_name IN (value1,value2,...)

 

 

 

本文链接


    
最新技术文章:
 




特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3