小编Jas*_*son的帖子

使用Join和Window函数获取超前和滞后值的性能比较

我有20M行的表,每一行有3列:timeid,和value。对于每个idtimevalue状态都有一个。我想知道time特定id.

我使用了两种方法来实现这一点。一种方法是使用加入和另一种方法是使用功能导致的窗口/滞后与聚簇索引timeid

我通过执行时间比较了这两种方法的性能。join方法需要16.3秒,窗口函数方法需要20秒,不包括创建索引的时间。这让我感到惊讶,因为窗口函数似乎是先进的,而连接方法是蛮力的。

下面是这两种方法的代码:

创建索引

create clustered index id_time
 on tab1 (id,time)
Run Code Online (Sandbox Code Playgroud)

加入方式

select a1.id,a1.time
   a1.value as value, 
   b1.value as value_lag,
   c1.value as value_lead
into tab2
from tab1 a1
left join tab1 b1
on a1.id = b1.id
and a1.time-1= b1.time
left join tab1 c1
on a1.id = c1.id
and a1.time+1 = c1.time
Run Code Online (Sandbox Code Playgroud)

使用SET STATISTICS TIME, IO ON以下方法生成的 IO …

performance join sql-server window-functions sql-server-2016 query-performance

14
推荐指数
1
解决办法
1万
查看次数

“和”与“&”的区别

我试图了解逻辑运算的优先顺序并具有以下代码:

declare @T bit ='TRUE'
declare @F bit ='False'

print @T and @F
Run Code Online (Sandbox Code Playgroud)

它返回一个错误

关键字“and”附近的语法不正确。

我用“&”替换了“and”,代码再次运行。为什么以前的代码不起作用?我正在使用 SQL 服务器。

sql-server t-sql

13
推荐指数
1
解决办法
3086
查看次数

创建聚集列存储索引同时保持行顺序的代码

我想通过创建聚集列存储索引将行存储表转换为列存储表。表中有三列:id、time 和 value。

该表在创建列存储索引之前按 id 和时间排序;但是,在创建列存储索引后,行顺序混乱了。我认为这可能是由于并行性并添加了maxdop = 1选项,但这并没有解决问题。谁能帮我这个?

这是创建表和索引的代码:

-- creating rowstore table
drop table if exists tab1_rstore
select id, time, value
into tab1_rstore
from tab0
order by id_loan, period
option(maxdop 1)

-- creating clustered index on rowstore table
create clustered index idx on tab1_rstore (id,time)

-- creating columnstore table 
select * 
into tab1_cstore
from tab1_rstore
    option(maxdop 1)

-- comparing the first two rows from these two tables
    select top 2 *
from tab1_rstore

    select top 2 * …
Run Code Online (Sandbox Code Playgroud)

sql-server columnstore sql-server-2016

9
推荐指数
1
解决办法
2670
查看次数

选择代码块的快捷方式/片段

我在 Windows 10 上使用 SQL Server Management Studio 2016。我厌倦了使用 shift/ctrl+up/down/right/left 键来选择我想要运行的代码。我想知道是否有快捷方式/片段来选择由空行与其他代码分隔的代码块?

这是一个代码示例:

select *
from tab1

select *
from tab2

select *
from tab3
Run Code Online (Sandbox Code Playgroud)

说,我的光标在中间块内,选择中间块的最佳方法是什么?

ssms

8
推荐指数
1
解决办法
1670
查看次数

类似于比较两个集合的“in”的运算符

我想比较两组值,看看是否有交集。第一组值在运行时指定,第二组值存储在数据库的一行中。

下面是一些示例代码:

CREATE TABLE #tab1 (var1 INT, var2 INT , var3 INT)

INSERT INTO #tab1 
VALUES (1,2,3),(0,0,0),(0,4,0)

Select
a = (case when 1 IN (var1,var2,var3) OR
               2 IN (var1,var2,var3) OR
               3 IN (var1,var2,var3)
    THEN 1 else 0 end) 
from #tab1
Run Code Online (Sandbox Code Playgroud)

感觉代码太繁琐了,不知道有没有什么简单的方法可以搞定。谢谢!

sql-server

7
推荐指数
2
解决办法
293
查看次数

寻找连续时间段并生成id的优雅代码

我有一个包含两个字段的表:时间和值,它们都是整数,我想找到值大于 0 的连续周期,然后用连续整数标记“值> 0”周期。

例如,如果我有这样的输入表:

输入表

我想要这样的输出表:

输出表

使用三个 CTE 和两个 row_number() 函数,我能够做到这一点。但是我觉得查询太麻烦了。有没有人有更优雅的代码来做到这一点?

我正在使用 sql server 2016 开发人员版。

这是我的代码:

CREATE TABLE #test1(
    [time] [int] NULL,
    [value] [int] NULL
)

insert into #test1
values(1,0),(2,0),(3,1),(4,0)
    ,(5,1),(6,2),(7,0),(8,0)
,(9,1),(10,2),(11,3),(12,0)
,(13,0),(14,0),(15,1),(16,0);

;with a1 as
(select *, [time] -  row_number() over (order by [time]) as group_num
    from #test1
where value>0),
a2 as 
(select distinct group_num from a1
),
a3 as
(select group_num, row_number() over (order by group_num) as group_id
from a2)
select a1.*, a3.group_id
    from a1 left join …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql window-functions

2
推荐指数
1
解决办法
579
查看次数

大数据库的高效价值更新

我有一个 8GB 大的表,有 20M 条记录。有一个名为 mth 的 int 字段。第 m 个字段以 YYYYMM 的形式存储日期信息,我想将第 m 个字段转换为连续整数。所以我使用一个公式从字段mth中获取年份和月份并计算月份顺序,具体来说,我使用以下代码:

create function mth_to_num(@month int)
returns int
as 
begin
   return(round(@month/100,0)*12+@month-100*round(@month/100,0))
end
Run Code Online (Sandbox Code Playgroud)

然后我用下面的代码来更新大表中的值

update full_orig_month_Q1_1999 
set mth_order = dbo.mth_to_num(period)
Go 
Run Code Online (Sandbox Code Playgroud)

但是,代码执行时间很长,大约 2-3 分钟。我的系统是带有 SQL Server 2016 的 Windows 10 64 位。有什么办法可以加快速度吗?

另一个问题是,执行上述查询后,我发现SQL server 在数据库中占用了多达8GB 的​​空间。需要那么多内存吗?我怎样才能释放它们?

提前感谢您的帮助!

杰森

performance sql-server optimization query-performance

0
推荐指数
1
解决办法
175
查看次数