AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-109669

Jason's questions

Martin Hope
Jason
Asked: 2017-06-17 08:08:24 +0800 CST

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

  • 7

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

下面是一些示例代码:

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

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

sql-server
  • 4 个回答
  • 310 Views
Martin Hope
Jason
Asked: 2017-03-11 12:27:49 +0800 CST

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

  • 8

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

这是一个代码示例:

select *
from tab1

select *
from tab2

select *
from tab3

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

ssms
  • 5 个回答
  • 2041 Views
Martin Hope
Jason
Asked: 2017-03-08 17:55:08 +0800 CST

由于代码创建列存储索引,Intellisense 不工作

  • 3

我在 Windows 10 64 位上使用 SQL Server 2016 Developer Edition。所有数据库都在我的笔记本电脑上。

我有一个 SQL 脚本文件,但 Intellisense 对其不起作用。我启用了 Intellisense 并尝试了这篇文章中建议的各种修复方法:

IntelliSense 不工作但已启用

这些修复都不适合我;但是,Intellisense 适用于所有其他文件。这个文件唯一特别的是它的长度:它有 600 多行代码。

看来问题是由创建列存储索引的命令引起的。这是一个示例代码:

SELECT TOP 100 *
INTO #test1
FROM tab1

CREATE CLUSTERED COLUMNSTORE INDEX idx ON #test1

SELECT TOP 100 *
INTO #test2
FROM tab1

我发现插入中间的代码块后,Intellisense 停止工作了!插入中间代码块后,大纲也会消失。

一旦我删除了中间的代码块,大纲和 Intellisense 将再次工作。

谁能帮我测试这个示例案例?

--

我尝试添加分号和 GO 来分隔代码,但它们都不适合我。现在看来,唯一可行的解​​决方案是将中间的块注释掉。

ssms intellisense
  • 3 个回答
  • 350 Views
Martin Hope
Jason
Asked: 2017-01-03 12:57:40 +0800 CST

用于查找连续时间段并生成 id 的优雅代码

  • 2

我有一个包含两个字段的表:时间和值,它们都是整数,我想找到值大于 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 a3
on a1.group_num = a3.group_num
sql-server t-sql
  • 1 个回答
  • 654 Views
Martin Hope
Jason
Asked: 2017-01-02 09:36:39 +0800 CST

“和”与“&”的区别

  • 13

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

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

print @T and @F

它返回一个错误

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

我将 'and' 替换为 '&',代码又可以工作了。为什么以前的代码不起作用?我正在使用 SQL 服务器。

sql-server t-sql
  • 1 个回答
  • 3359 Views
Martin Hope
Jason
Asked: 2016-12-20 18:44:53 +0800 CST

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

  • 9

我想通过创建聚集列存储索引将行存储表转换为列存储表。表中有三列: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 *
from tab1_cstore

查询结果截图:

c-index 前的前两行

-- creating clustered columnstore index
create clustered columnstore index idx on tab1_cstore 
with (maxdop = 1) 

-- comparing the top two rows again
select top 2 *
from tab1_rstore

select top 2 *
from tab1_cstore

使用列存储索引的查询结果截图:

在此处输入图像描述

我的理解是行的顺序是由压缩算法决定的,我们对此无能为力,请参阅此处文档中的限制和限制,并引用以下引用:

不能包含用于对索引进行排序的 ASC 或 DESC 关键字。列存储索引根据压缩算法进行排序。排序会消除许多性能优势。

我在 Windows 10 64 位上使用 SQL Server 2016 开发人员版。

sql-server sql-server-2016
  • 2 个回答
  • 2854 Views
Martin Hope
Jason
Asked: 2016-12-17 06:54:09 +0800 CST

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

  • 19

我有一个有 20M 行的表,每行有 3 列:time、id和value. 对于每个idand time,都有一个valuefor 状态。我想知道某个特定的领先和滞后time值id。

我使用了两种方法来实现这一点。一种方法是使用连接,另一种方法是使用窗口函数超前/滞后和聚集time索引id。

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

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

创建索引

create clustered index id_time
 on tab1 (id,time)

加入方式

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

使用以下命令生成的 IO 统计信息SET STATISTICS TIME, IO ON:

连接方法的统计信息

这是join方法的执行计划

窗函数法

select id, time, value, 
   lag(value,1) over(partition by id order by id,time) as value_lag,
   lead(value,1) over(partition by id order by id,time) as value_lead
into tab2
from tab1

(仅订购可time节省 0.5 秒。)

这是Window函数方法的执行计划

IO统计

[窗口函数方法4的统计]


我检查了数据,sample_orig_month_1999似乎原始数据按idand排序良好time。这是性能差异的原因吗?

看起来join方法比window function方法有更多的逻辑读取,而前者的执行时间实际上更少。是不是因为前者有更好的并行性?

由于代码简洁,我喜欢窗口函数方法,有没有办法加快这个特定问题的速度?

我在 Windows 10 64 位上使用 SQL Server 2016。

sql-server performance
  • 1 个回答
  • 15341 Views
Martin Hope
Jason
Asked: 2016-12-15 11:46:20 +0800 CST

加入大表的最有效方法

  • 2

我有一个有 20M 行的表,每行有 3 列:time、id和value. 对于每个idand time,都有一个valuefor 状态。我想知道特定timeand的最后一个周期和下一个周期的值id,并使用以下查询来获取这些值:

update a1
set  a1.value_last = b1.value,   
     a1.value_next = c1.value
from tab1 a1
left join tab1 b1
on a1.id = b1.id
and a1.period = b1.period + 1
left join tab1 c1
on a1.id = c1.id
and a1.period = c1.period - 1

似乎查询需要永远并且日志文件增加了 10 GB 以上。我想知道编写此查询的最有效方法是什么?我知道使用索引会加快加入过程,但是如何减少日志记录?

我在 Win10 64 位上使用 SQL Server 2016。

sql-server performance
  • 3 个回答
  • 2004 Views
Martin Hope
Jason
Asked: 2016-12-07 06:33:41 +0800 CST

为什么导入的txt表格占用空间那么大

  • 7

我有一个.txt存储大小为 1253 MB 的文件。将其导入 SQL Server 2016 后,该表占用磁盘空间 1680 MB。为什么存储空间会增长这么多?

我没有做任何数据转换,使用纯char格式存储数据。我读取txt文件的数据字典,如果变量的长度最多n,那么我使用varchar(3). 如果文件是固定长度的n,那么我使用char(n).

大约有 4 到 5 列是密集填充的,而所有其他列都非常稀疏。对于稀疏列,只有 1% 的行不为空。

这是创建表和导入数据的代码:

CREATE TABLE table1 (
var1 char(12),      var2 char(6),      var3 varchar(12),       var4 varchar(3),
var5 varchar(3),    var6 varchar(4),   var7 char(1),           var8 char(1),
var9 char(2),       var10 char(6),     var11     varchar(8),   var12 varchar(12),
var13 char(6),      var14 varchar(12), var15 varchar(14),var16 varchar(12),
var17 varchar(12),  var18 varchar(12), var19 varchar(12),var20 varchar(12),
var21 varchar(12),  var22 varchar(12));

如何减少存储空间?

这是来自命令的存储信息sp_spaced:

名称表 1
行 22260960
保留 1721240 KB
数据 1721128 KB
index_size 24 KB
未使用 88 KB
sql-server
  • 3 个回答
  • 116 Views
Martin Hope
Jason
Asked: 2016-11-26 20:07:19 +0800 CST

SQL Server 可以并行执行两个 BULK INSERT 吗?

  • 3

我有两个繁重的查询要运行,它们都需要大约 1 分钟才能运行。这两个查询都使用批量插入命令将文本文件中的数据插入到数据库中的表中。

对于导入数据的两个表,没有索引/触发器/约束,只有两个空表可以加载数据。

对于要加载的两个文本文件,每个文件都有大约 20M 行。

查询一:

Bulk insert table1
FROM 'table1.txt'  WITH
        (FIELDTERMINATOR ='|',
         ROWTERMINATOR = '0x0a',
         TABLOCK)

查询 2:

Bulk insert table2
FROM 'table2.txt'  WITH
        (FIELDTERMINATOR ='|',
         ROWTERMINATOR = '0x0a',
         TABLOCK)

我想比较不同场景下的运行时间。

场景 1:两个查询在一个编辑器中串行运行:

  • 查询 1:1 m 18 s
  • 查询 2:1 m 2 s
  • 总运行时间为2m 20s。

场景 2:同一Studio 实例的单独编辑器中的每个查询,同时运行:

  • 查询 1:2 m 36 s
  • 查询 2:2 m 09 d
  • 总运行时间为2m 40s

场景 3:每个查询在一个单独的Studio 实例中,同时运行:

  • 查询 1:2 m 29 s
  • 查询 2:2 m 19 s
  • 总运行时间为2m 29s

虽然场景 2 和 3 似乎同时运行查询,但为什么运行时间没有太大变化?对于所有场景,CPU 使用率在 17% 到 21% 之间,磁盘使用率在 50MB 到 70MB 每秒。没有观察到 CPU 和磁盘使用率之间的显着差异。

我想知道引擎盖下发生了什么?SQL Server 如何执行这些查询?为什么所有三种场景的运行时间几乎相同?有什么办法可以加快速度吗?

我在 Windows 10 64 位上使用 SQL Server 2016 Developer Edition。我的笔记本电脑中有四核 i7 和 SSD。

在测试了 4 个查询一起运行的更多场景后,我认为 CPU 和磁盘使用率低的可能原因是我的 Core i7 的超线程:

  • 两个编辑器同时运行两个查询,最多的 CPU 使用率为 25%。

  • 4 个编辑器同时运行 4 个查询,最多 CPU 使用率为 50%。

你们知道让一个查询专门使用一个核心的方法吗?关闭超线程对我来说不是一个选项,因为我的 ThinkPad T460p 在 BIOS 中不支持这样的选项。

sql-server performance
  • 1 个回答
  • 3259 Views
Martin Hope
Jason
Asked: 2016-11-26 10:18:55 +0800 CST

格式文件中的字段终止符问题

  • 0

我有一个 txt 格式的数据文件,我曾经在以下命令中使用 Bulk Insert 加载它:

Bulk insert [table1]
FROM 'data.txt'  
WITH   
  ( 
     FIELDTERMINATOR ='|',
     ROWTERMINATOR ='0x0a',
  )

代码运行良好。但是,当我尝试使用带有批量插入的格式文件来加载文件时,在为最后一行指定字段终止符时遇到了一些问题。

这是格式文件中最后一行的规范:

21  SQLCHAR  0  20  "0x0a"  21  misc_costs       SQL_Latin1_General_CP1_CI_AS

使用“0x0a”作为终止符,我收到以下错误:

第 2 行第 1 列 (var1) 的批量加载数据转换错误(截断)。

用“\n”可以加载数据,但是用“|” 也加载到最后一列。例如,我得到“0.5|” 而不是“0.5”。

"|\n","0x0a","|0x0a",'\r\n' 返回与 "|" 相同的错误

第 2 行第 1 列 (var1) 的批量加载数据转换错误(截断)。

我正在使用 sql-server 2016,Windows 10 64 位。

有人能帮忙吗?在此先感谢您的帮助!

杰森

sql-server import
  • 1 个回答
  • 2387 Views
Martin Hope
Jason
Asked: 2016-11-25 15:36:20 +0800 CST

创建格式文件以将txt文件导入sql server的命令

  • 0

我正在尝试按照此页面上的说明使用 bcp 实用程序创建格式文件:

使用格式文件批量导入数据

https://technet.microsoft.com/en-us/library/ms178129(v=sql.105).aspx

但是,此页面仅讨论如何为数据库中的表创建格式文件。我的目标是在我的磁盘上为一个 txt 文件创建一个格式文件,然后使用该格式文件将文本文件中的原始数据导入数据库。我尝试了以下命令:

bcp C:\data.txt format nul -c -f txt1.fmt -T

并得到以下错误:

输入、输出或格式选项需要有效的表名。

我正在使用 sql server 2016,我的系统是 windows 10 64 位。

任何人都可以帮助我,提前感谢您的帮助!

杰森

sql-server import
  • 2 个回答
  • 2800 Views
Martin Hope
Jason
Asked: 2016-11-23 09:29:19 +0800 CST

在 SQL Server 中并行导入数据

  • 0

我有 100 多个文件要导入 sql 服务器,其中大部分是 500 MB。我想利用 SQL Server 的并行导入实用程序并阅读了许多网页,例如以下网页:

如何在 30 分钟内加载 1 TB 数据

https://technet.microsoft.com/en-us/library/dd537533(v=sql.100).aspx

使用表级锁定并行导入数据

https://technet.microsoft.com/en-us/library/ms186341(v=sql.105).aspx

以及stackoverflow中的答案

并行插入单个表的最快方法

但是,他们都没有给出一个简单的代码示例。我知道如何使用批量插入/bcp,但我不知道从哪里开始并行导入?有人可以帮我吗?

我的系统是 Windows,我使用的是 SQL server 2016。源数据文件是 txt 格式。

在此先感谢您的帮助!

杰森

sql-server parameter
  • 1 个回答
  • 1900 Views
Martin Hope
Jason
Asked: 2016-11-04 13:33:56 +0800 CST

大型数据库的高效价值更新

  • 0

我有一个 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

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

update full_orig_month_Q1_1999 
set mth_order = dbo.mth_to_num(period)
Go 

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

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

提前感谢您的帮助!

杰森

sql-server performance
  • 2 个回答
  • 229 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve