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-66300

Artashes Khachatryan's questions

Martin Hope
Artashes Khachatryan
Asked: 2024-06-07 14:29:23 +0800 CST

当表按计算列分区时按分区号过滤

  • 12

我创建了 2 个相同的表,由整数列分区。在其中一个表中,计算列,在另一个表中,不计算列。

当我使用计算列查询表并使用聚集索引对单个分区进行排序(假设输出数据已经排序,因此不需要额外的排序)时,它会扫描整个表。

CREATE PARTITION FUNCTION pf_test(int) AS RANGE RIGHT FOR VALUES(1, 2, 3, 4)
GO
CREATE PARTITION SCHEME ps_test AS PARTITION pf_test ALL TO([PRIMARY])
GO
CREATE TABLE test_computed
(
    ID BIGINT NOT NULL, 
    ID_C AS CAST(ID % 4 AS INT) PERSISTED, 
    PRIMARY KEY CLUSTERED (ID, ID_C) ON ps_test(ID_C)
) ON ps_test(ID_C)
GO
    
CREATE TABLE test_not_computed
(
    ID BIGINT NOT NULL, 
    ID_C INT NOT NULL, 
    PRIMARY KEY CLUSTERED (ID, ID_C) ON ps_test(ID_C)
) ON ps_test(ID_C)
GO
    
INSERT INTO test_computed(ID)
SELECT TOP 1000000 ROW_NUMBER() OVER(ORDER BY GETDATE())
FROM sys.all_columns a
CROSS JOIN sys.all_columns b
GO
    
INSERT INTO test_not_computed(ID, ID_C)
SELECT TOP 1000000 
    ROW_NUMBER() OVER(ORDER BY GETDATE()), 
    ROW_NUMBER() OVER(ORDER BY GETDATE()) % 4
FROM sys.all_columns a
CROSS JOIN sys.all_columns b
GO

数据相同,但每个查询的执行计划不同。

SELECT TOP 100 *
FROM test_computed
WHERE $partition.pf_test(ID_C) = 1
ORDER BY ID DESC
    
SELECT TOP 100 *
FROM test_not_computed
WHERE $partition.pf_test(ID_C) = 1
ORDER BY ID desc

计划

真实的表有数十亿行;我们使用分区来避免扫描整个表。

SQL Server 版本是

Microsoft SQL Server 2019 (RTM-CU26) (KB5035123) - 15.0.4365.2 (X64)
2024 年 3 月 29 日 23:02:47 版权所有 (C) 2019 Microsoft Corporation
Developer Edition(64 位),Windows Server 2022 Standard 10.0(内部版本 20348) :)

sql-server
  • 1 个回答
  • 210 Views
Martin Hope
Artashes Khachatryan
Asked: 2023-08-24 21:02:51 +0800 CST

SQL 编译\秒

  • 8

我尝试加载测试一个简单的插入存储过程

CREATE TABLE _test(ID BIGINT)

CREATE OR alter PROCEDURE dbo.test_sp
AS
BEGIN
    SET NOCOUNT ON;
    BEGIN
        INSERT INTO _test
        SELECT CAST(RAND() * 10000 AS BIGINT)
    END
END

当我使用 SQLStress 工具运行此 sp 时,我得到的结果不SQL Compilation\sec等于Batch Request\sec.

有趣的事实是SQL Re-Compilations\sec0。性能计数器

optimized for ad-hoc和均已Forced parametrization启用。即使我将 sp 更改为简单的SELECT 1. 任何帮助将不胜感激。我使用 Microsoft SQL Server 2016 (SP3) (KB5003279)。

sql-server-2016
  • 1 个回答
  • 97 Views
Martin Hope
Artashes Khachatryan
Asked: 2021-11-10 07:59:50 +0800 CST

datetime 和 datetime2 的比较不正确

  • 14

我知道进行隐式类型转换不是一个好习惯。但是,当较低的值突然变得更高时,这确实是出乎意料的行为。

declare @LastSelectedDate DATETIME = '2021-11-09 13:52:29.187'
declare @LastSelectedDate_1 DATETIME2(7) = '2021-11-09 13:52:29.1866667'


SELECT IIF(@LastSelectedDate_1 > CAST(@LastSelectedDate AS DATETIME2), 1, 0)
SELECT IIF(@LastSelectedDate_1 > @LastSelectedDate, 1, 0)

这是一个错误还是我错过了什么?我正在使用 sql server 2016。

sql-server sql-server-2016
  • 1 个回答
  • 1194 Views
Martin Hope
Artashes Khachatryan
Asked: 2019-12-06 03:20:54 +0800 CST

SQL Server 选择非选择性索引

  • 4

我正在测试 SQL Server 索引并发现非常奇怪的行为。这是我的代码:

DROP TABLE IF EXISTS  dbo._Test
DROP TABLE IF EXISTS  dbo._Newtest
GO
CREATE TABLE _Test(
ID INT NOT NULL, 
UserSystemID INT NOT NULL, 
Age INT
)
GO
INSERT INTO dbo._Test
        ( ID, UserSystemID, Age )

SELECT TOP 10000000 ABS(CHECKSUM(NEWID())) % 5000000, ABS(CHECKSUM(NEWID())) % 2, ABS(CHECKSUM(NEWID())) % 100
FROM sys.all_columns
CROSS JOIN sys.all_objects a
CROSS JOIN sys.all_objects b
CROSS JOIN sys.all_objects c

; WITH cte AS (
SELECT ID, UserSystemID,  age, ROW_NUMBER() OVER(PARTITION BY ID, UserSystemID ORDER BY GETDATE()) rn
FROM dbo._Test
)

SELECT cte.ID ,
       cte.UserSystemID ,
       cte.Age
INTO _newTest
FROM cte
WHERE cte.rn = 1

CREATE UNIQUE NONCLUSTERED INDEX  IX_test ON dbo._NewTest(ID, UserSystemID) INCLUDE(age)
GO
ALTER TABLE dbo._NewTest ADD CONSTRAINT PK_NewTest PRIMARY KEY CLUSTERED(UserSystemID, ID)
GO

此时,我在同一张表和同一列上有两个索引。第一个是非集群的,第二个是集群的。该Id列更具选择性(大约 5000000 个唯一值)而UserSystemID不是(两个唯一值)。

然后我运行以下查询来测试使用了哪个索引:

SELECT id,  UserSystemID, age   
FROM _NewTest
WHERE id = 1502945
AND UserSystemID = 1

它寻找聚集索引。你可以在这里看到计划。

问题是为什么 SQL Server 更喜欢聚集索引而不是唯一的非聚集索引。


我的聚集索引的前导列比其他唯一非聚集索引的选择性要低得多。所以我希望聚集索引的性能一定会更差,但实际上并非如此。

sql-server index
  • 1 个回答
  • 272 Views
Martin Hope
Artashes Khachatryan
Asked: 2018-12-13 04:58:48 +0800 CST

在表中查找相关名称

  • 0

我有一个包含 2 列的表,name 和 related_name。

CREATE TABLE _test(
[name] NVARCHAR(50),
related_name NVARCHAR(50)
)
GO

INSERT INTO dbo._test
([name], related_name)
VALUES

('a', 'b'),
('b', 'c'),
('c', 'd'),
('e', 'f'),
('f', 'g')

我想写一个 UDF,它将获取一个名称并将返回所有相关的名称。如果a与b相关,b与c相关,这意味着a与c相关。

因此参数 'a'、'b'、'c'、'd' 的预期结果必须相同。

select * from my_func('a')

结果必须是

result
------
a
b
c
d

结果是

select * from my_func('e')

一定是

result
------
e
f
g
sql-server
  • 2 个回答
  • 52 Views
Martin Hope
Artashes Khachatryan
Asked: 2017-11-09 06:50:27 +0800 CST

以最佳方式生成报告

  • -1

我有一个具有以下结构的 SQL Server 数据库

CREATE TABLE users (
userid INT IDENTITY PRIMARY KEY CLUSTERED, 
age INT
)
GO
CREATE TABLE userstatus(
userstatusID INT IDENTITY PRIMARY KEY CLUSTERED, 
statusid INT, 
userid INT FOREIGN KEY REFERENCES dbo.users(userid)
)
GO

一些示例数据:

INSERT  INTO dbo.users
        ( age )
VALUES  ( 15  -- age - int
          ),
        ( 20 ),
        ( 25 );

INSERT  INTO dbo.userstatus
        ( statusid, userid )
VALUES  ( 1, 1 ),
        ( 1, 2 ),
        ( 1, 3 ),
        ( 2, 1 ),
        ( 3, 1 ),
        ( 2, 2 );

现在我想获得用户年龄的总和,以及状态为 2 的用户年龄的总和。

就像是:

状态年龄 = 2: 35
总年龄:60
sql-server
  • 1 个回答
  • 83 Views
Martin Hope
Artashes Khachatryan
Asked: 2016-04-20 05:37:29 +0800 CST

在 case 子句中使用默认值更新

  • 5

我有一个像

CREATE TABLE Mytable (ID int identity, Name nvarchar(10)); 
GO 
INSERT INTO MyTable (Name) VALUES ('test1'); 
INSERT INTO MyTable (Name) VALUES ('test2'); 
GO 
ALTER TABLE MyTable ADD CONSTRAINT DF_Name DEFAULT('test') FOR Name;

现在我想像这样更新我的名称列:

Update MyTable
set name = case ID when 1 then DEFAULT END;

但我收到此错误:

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

如何在子句中使用UPDATEwith语句?DEFAULTCASE

sql-server sql-server-2014
  • 1 个回答
  • 6898 Views
Martin Hope
Artashes Khachatryan
Asked: 2016-03-10 02:28:20 +0800 CST

执行计划和 where 中的子句

  • 1

我有这个 SQL 语句:

select * 
from _my_table1 
where 1 = 0 
      and (exists (select 1 from _my_table2 where id =7))

执行计划是:

|--Constant Scan

现在,当我将查询更改为

Declare @i int = 1
SELECT *
FROM dbo._my_table1 
WHERE @i = 0 AND (EXISTS (SELECT 1 FROM dbo._my_table2 WHERE id = 7))

我得到以下计划:

  |--Nested Loops(Left Semi Join)
       |--Filter(WHERE:(STARTUP EXPR([@i]=(0))))
       |    |--Clustered Index Scan(OBJECT:([DEV-RWA_IECMS-DE_Staging_20160301].[dbo].[_my_table1].[PK___my_tabl__3213E83FEF434214]))
       |--Clustered Index Seek(OBJECT:([DEV-RWA_IECMS-DE_Staging_20160301].[dbo].[_my_table2].[PK___my_tabl__3213E83F4D4FA6E2]), SEEK:([DEV-RWA_IECMS-DE_Staging_20160301].[dbo].[_my_table2].[id]=(7)) ORDERED FORWARD)

WHERE问题是如果第一部分返回 false,为什么 SQL Server 检查子句的第二部分。如果第一部分返回 false,是否有任何解决方法强制 SQL 引擎不检查 where 的第二部分。

sql-server execution-plan
  • 1 个回答
  • 199 Views
Martin Hope
Artashes Khachatryan
Asked: 2016-01-20 05:48:20 +0800 CST

关于隐式转换的警告

  • 8

我有 2 个名称列的表:

CREATE TABLE Test
(
  TestID int identity primary key clustered
  , Name_Eng nvarchar(50)
  , Name_Nat nvarchar(50)
)

现在我需要一个查询来使该Name列用 分隔,,如下所示:

    DECLARE @NameColumns NVARCHAR(1024)

            SET @NameColumns = STUFF(
      (SELECT   ',' + 'Test.' + name AS [text()]
       FROM     ( SELECT    c.name
                  FROM      sys.columns c 
                            INNER JOIN sys.tables t ON t.object_id = c.object_id
                  WHERE     t.name = 'Test'
                            AND c.name LIKE 'Name_%'
                ) AS D
                FOR                  XML PATH('') ,
                                         TYPE).value('.[1]', 'VARCHAR(MAX)'), 1, 1,
                                     N'')

select  @NameColumns

但是这个查询在执行计划中有一个警告:

隐式转换警告

有什么办法可以消除这个警告吗?

sql-server performance
  • 3 个回答
  • 3749 Views
Martin Hope
Artashes Khachatryan
Asked: 2015-10-01 01:50:53 +0800 CST

使用输入参数在 SP 中排序

  • -3

我有一个包含 2 列的表:

CREATE TABLE test(
id int, 
name nvarchar(50)
)
go 

insert INTO Test(id, name)
VALUES (1, 'aa')
insert INTO Test(id, name)
VALUES (2, 'bb')
insert INTO Test(id, name)
VALUES (3, 'aa')

我需要一个存储过程,以不同的顺序从我的表中选择数据。

    CREATE PROCEDURE testSelect(
@OrderColumnID int
)    
AS 
BEGIN
    SELECT *
    FROM test
    ORDER BY CASE @OrderColumnID WHEN 1 THEN 1 WHEN 2 THEN 2 END ASC
END

WHEN 1 THEN 1 WHEN 2 THEN 2意味着,如果输入参数 = 1,则表必须按“id”列排序,如果输入参数 = 2,表必须按“名称”列排序。

当我像这样执行 SP 时:

EXEC dbo.testSelect @OrderColumnID = 2

我得到一个不正确的结果。

我不想重写我的 SP 以使用动态 SQL,或者将它分成 if ..... else if .... 块

CREATE PROCEDURE testSelect(
@OrderColumnID int
)    
AS 
BEGIN
    IF @OrderColumnID = 1
    SELECT *
    FROM test
    ORDER BY 1
    ELSE IF @OrderColumnID = 2 
    SELECT *
    FROM test
    ORDER BY 2
END
sql-server sql-server-2014
  • 1 个回答
  • 76 Views
Martin Hope
Artashes Khachatryan
Asked: 2015-08-21 07:20:05 +0800 CST

选择基于树的结构

  • 0

我的 SQL Server 数据库中有一个表,其中包含如下数据:

ID  ParentID
--- ---------
1   NULL
2   1
3   1
5   1
5   4
5   6
8   6
7   9
9   10

我需要一个select语句来返回它们之间有某种关系的所有行(无论是父项还是子项)。例如 for id= 1 我需要获取除最后两行之外的所有行。对于id= 2, 3, 4, 5, 6 ,8 必须得到相同的结果。对于id= 7 或 9,语句必须只返回最后两行。我试图用递归 CTE 解决这个问题,但我失败了。

sql-server recursive
  • 1 个回答
  • 1380 Views
Martin Hope
Artashes Khachatryan
Asked: 2015-05-30 04:11:40 +0800 CST

触发器性能 - 1 或 2 个触发器?

  • 2

我有一个关于触发器性能的问题。

CREATE TABLE [dbo].[_test](
[ID] [INT] IDENTITY(1,1) NOT NULL,
[Date] [DATETIME] NULL,
[DateYearID] [INT] NULL,
[DateQuarterID] [INT] NULL,
[Date1] [DATETIME] NULL,
[Date1YearID] [INT] NULL,
[Date1QuarterID] [INT] NULL)

现在,如果我更新 Date 列(或插入新行),我想让触发器必须更新 DateYearID 和 DateQuarterID 列,并且如果我更新 Date1 列(或插入新行),则必须更新 Date1YearID 和 Date1QuarterID 列。更好的是,只有一个触发器

IF UPDATE(DATE)
   UPDATE _test SET DateYearID = ... , DateQuarterID = ...
IF UPDATE (DATE1)
   UPDATE _test SET Date1YearID = ... , Date1QuarterID = ...

或者有两个不同的触发器,第一个更新 DateYearID,DateQuarterID 列,第二个更新 DateYear1ID,DateQuarter1ID 列。

我正在使用 SQL Server 2014。

非常感谢您的帮助。

sql-server sql-server-2014
  • 1 个回答
  • 312 Views
Martin Hope
Artashes Khachatryan
Asked: 2015-05-13 08:19:09 +0800 CST

何时从版本存储中删除不必要的行版本

  • 3

对不起,我的英语不好 :)

我需要了解版本存储清理的帮助。我有以下情况。

  1. 12:00 在快照隔离级别下启动一条 select 语句,不提交。
  2. 12:01 在读已提交隔离级别下启动更新语句(更新单行)并提交。
  3. 12:02 在快照隔离级别下启动一个 select 语句并且不提交。
  4. 12:03 在read committed隔离级别下启动更新语句(更新单行)并提交。

现在,如果我们查看版本存储,例如

从 sys.dm_tran_version_store 选择 *

我们将看到 2 行(每个更新语句一行)。

现在,如果我们提交从 12:00 开始的第一个事务,则不会从版本存储中删除任何行(甚至过了一分钟)。

问题是为什么???.

在我看来,必须从版本存储中删除行,因为没有任何活动事务必须访问该版本。

我也尝试更新没有 1 行,但是 100 行(总计超过 100 KB)但我有同样的情况,版本存储没有被删除。

请帮助我了解版本存储何时清理。非常感谢您的帮助。

sql-server tempdb
  • 1 个回答
  • 228 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