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

ToC's questions

Martin Hope
ToC
Asked: 2024-11-20 03:53:40 +0800 CST

Sql Server:查询以解析和验证代码

  • 6

我们有一个#ValidCode表,其中列出了有效代码,例如:“A”、“B”、“C”等。另一个名为#SourceData的表包含输入数据——它是有效和无效标记的组合(有时是重复的)。

前任:

  • ‘A;B;C’ (有效)
  • ‘A;A;A;A;A;B’ (有效)
  • 'ad;df;A;B'(无效)

尝试找到一种最佳查询方法来处理这些字符串以在#SourceData中找到有效行。请参阅以下示例:

DROP TABLE IF EXISTS #ValidCode
GO
CREATE TABLE #ValidCode
(
      ID        INT             IDENTITY(1,1)
    , Code      CHAR(1)
)
INSERT INTO #ValidCode (Code) VALUES ('A'), ('B'), ('C')
GO
DROP TABLE IF EXISTS #SourceData 
GO
CREATE TABLE #SourceData 
(
      ID        INT             IDENTITY(1,1)
    , Codes     VARCHAR(500)
    , Is_Valid  BIT
    , Is_Split  BIT
)

INSERT INTO #SourceData (Codes) 
VALUES    ('A;B;C')
        , ('B;A')
        , ('B;B;B;C;C;A;A;B')
        , ('B;Z;1')
        , ('B;ss;asd')


SELECT * FROM #ValidCode
SELECT * FROM #SourceData

查询将处理#SourceData表中的数据并更新Is_Valid标志,以便它们可以在后续过程中被使用。

规则:

  • 每个标记都必须对整个列行有效(第 1 行至第 3 行)
  • 即使一个标记无效,整个行值也无效(第 4 行和第 5 行)

因此,这是首选的输出:

ID 代码 是否有效
1 A;B;C 1
2 B;A 1
3 B;B;B;C;C;A;A;B 1
4 B;Z;1 0
5 B;ss;asd 0

当前方法:循环遍历#SourceData中的每一行,并根据分隔符“;”将它们拆分,然后将它们与#ValidCode表进行比较。如果所有标记单独有效,则将#SourceData中的行标记为有效(Is_Valid标志)。否则标记为无效。WHILE循环方法有效,但速度很慢。

#SourceData最多可以有 300 万行。每行都有多个重复的有效值('A;A;A;A')和无效值组合('A;as;sdf;B')

有没有更好的方法?

谢谢!

query-performance
  • 2 个回答
  • 53 Views
Martin Hope
ToC
Asked: 2024-08-15 05:44:04 +0800 CST

两个 MERGE 查询插入同一张表时发生阻塞

  • 13

设想

我有一个按列分区的大表INT。当我MERGE在该表的两个不同分区上运行两个不同的语句时,它们似乎互相阻塞。

重现该场景的示例代码:

1. 准备工作。创建表和一些虚拟数据

SET NOCOUNT ON
GO
--
--  Create parition function and partition scheme
--
    DROP FUNCTION IF EXISTS PF_Site_ID 
    GO
    CREATE PARTITION FUNCTION PF_Site_ID (INT)  
        AS RANGE RIGHT FOR VALUES   (
                                        0,
                                        1, 2, 3, 4, 5, 6, 7, 8, 9, 10
                                    )
    GO  
    DROP PARTITION SCHEME PS_Site_ID
    GO
    CREATE PARTITION SCHEME PS_Site_ID
        AS PARTITION PF_Site_ID
        ALL TO ('PRIMARY')
    GO

--
-- Large table partitioned on Site_ID. Two STG tables. And some dummy data
--
    DROP TABLE IF EXISTS dbo.PartitionedLargeTable
    GO
    CREATE TABLE dbo.PartitionedLargeTable
    (
          ID       INT          NOT NULL IDENTITY(1,1)
        , Site_ID  INT          NOT NULL
        , Name     VARCHAR(50)
    ) ON PS_Site_ID (Site_ID)
    GO
    ALTER TABLE dbo.PartitionedLargeTable SET (LOCK_ESCALATION = AUTO)
    GO

--
--  STG tables
--
    DROP TABLE IF EXISTS dbo.STG_Test1
    GO
    CREATE TABLE dbo.STG_Test1
    (
          ID       INT          NOT NULL IDENTITY(1,1)
        , Site_ID  INT          NOT NULL
        , Name     VARCHAR(50)
    ) ON [PRIMARY]
    GO
    DROP TABLE IF EXISTS dbo.STG_Test2
    GO
    CREATE TABLE dbo.STG_Test2
    (
          ID       INT          NOT NULL IDENTITY(1,1)
        , Site_ID  INT          NOT NULL
        , Name     VARCHAR(50)
    ) ON [PRIMARY]
    GO

--
--  Dummy data
--
    INSERT INTO dbo.PartitionedLargeTable (Site_ID, Name) SELECT 1, NEWID()
    INSERT INTO dbo.PartitionedLargeTable (Site_ID, Name) SELECT 2, NEWID()
    GO 10000

    INSERT INTO dbo.PartitionedLargeTable (Site_ID, Name)
    SELECT Site_ID, Name FROM dbo.PartitionedLargeTable
    GO 5

    INSERT INTO dbo.STG_Test1(Site_ID, Name) SELECT 1, NEWID()
    GO 10000
    INSERT INTO dbo.STG_Test2(Site_ID, Name) SELECT 2, NEWID()
    GO 10000

    INSERT INTO dbo.STG_Test1 (Site_ID, Name)
    SELECT Site_ID, Name FROM dbo.STG_Test1
    GO 7

    INSERT INTO dbo.STG_Test2 (Site_ID, Name)
    SELECT Site_ID, Name FROM dbo.STG_Test2
    GO 7

2. 合并 1

在一个 SSMS 窗口中,运行此MERGE语句:

MERGE dbo.PartitionedLargeTable AS TGT

USING (SELECT ID, Site_ID, Name FROM dbo.STG_Test1) AS SRC
    ON  SRC.Site_ID = TGT.Site_ID
    AND SRC.ID      = TGT.ID

WHEN MATCHED THEN
    UPDATE 
        SET TGT.Name = SRC.Name

WHEN NOT MATCHED THEN
    INSERT (Site_ID, Name)
    VALUES (SRC.Site_ID, SRC.Name);

3. 合并 2

在第二个 SSMS 窗口中,运行此MERGE语句:

MERGE dbo.PartitionedLargeTable AS TGT

USING (SELECT ID, Site_ID, Name FROM dbo.STG_Test2) AS SRC
    ON  SRC.Site_ID = TGT.Site_ID
    AND SRC.ID      = TGT.ID

WHEN MATCHED THEN
    UPDATE 
        SET TGT.Name = SRC.Name

WHEN NOT MATCHED THEN
    INSERT (Site_ID, Name)
    VALUES (SRC.Site_ID, SRC.Name);

这两个语句在不同的Site_IDMERGE上运行(因此是两个不同的分区)。

分区表的一个性能优势是我们可以独立地操作分区(在合理范围内)。因此,在一个分区上执行类似INSERT或 的UPDATE操作不会阻止在其他分区上执行类似操作。

与未分区表相比,如果我们执行两个大型INSERT操作(或两个大型UPDATE操作),一旦操作的行数超过一定数量(例如 3k 或 5k 行),一个操作就会阻塞另一个操作,然后锁PAGE将升级为TABLOCK。因此INSERT阻塞INSERT(或UPDATE阻塞UPDATE)

为了避免将锁升级到TABLOCK,此表使用 LOCK_ESCALATION = AUTO 进行分区,这将锁限制在 HOBT 级别(而不是表)。但是使用MERGE,阻塞仍然会发生。

关于如何防止这种阻塞,您有什么想法吗?我们MERGE在这个大表的 10 个不同分区上运行了 10 个并行语句(它们相互阻塞)。

下图显示了阻塞的本质。当表被分区时,锁升级应该只升级到分区(而不是整个表)。当这些MERGE语句运行时,我看到每个语句MERGE正在查询(锁定)的 HOBT ID。在某些情况下,HOBT ID 与此表的分区 ID 不匹配。

在此处输入图片描述

我实际使用的表COLUMNSTORE CLUSTERED在分区方案上有一个索引。

sql-server
  • 2 个回答
  • 518 Views
Martin Hope
ToC
Asked: 2016-05-26 09:08:16 +0800 CST

Powershell:Powershell 中的 System.Data.SqlClient.SqlDataAdapter 使用是否需要一些 ADO.Net 安装?

  • 1

在 PowerShell 中,目标是从 Sql Server 查询一些数据并将其放入预先格式化的 Excel 文件中。为此,以下 PowerShell 脚本片段会引发错误,提示“缺少程序集”。

从我可以在线收集的内容来看,它SqlClient.SqlDataAdapter是 的一部分ADO.Net,它不需要包含任何程序集(因为它始终存在于 OS .Net 框架安装中)。这个对吗?我该如何纠正这个问题?

...
... other connection code
...
$SqlCmd = New-Object System.Data.SqlClient.SqlCommand;
$SqlCmd.Connection = $SqlConnection;
$SqlCmd.CommandText = $ActiveTransactions_Count_Query;

$SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter;
$SqlAdapter.SelectCommand = $SqlCmd;

$DataSet_ActiveTransaction = New-Object System.Data.DataSet;
$SqlAdapter.Fill($DataSet_ActiveTransaction);
$DataSetTable = $DataSet_ActiveTransaction.Tables[0];
$DataSetTable

错误:

New-Object : Cannot find type [Sql.Data.SqlClient.SqlDataAdapter]: make sure
the assembly containing this type is loaded.
At M:\Build.ps1:21 char:25 + $SqlAdapter = New-Object <<<< 
Sql.Data.SqlClient.SqlDataAdapter;
    + CategoryInfo          : InvalidType: (:) [New-Object],
    PSArgumentException
    + FullyQualifiedErrorId :     TypeNotFound,Microsoft.PowerShell.Commands.NewObjectCommand
sql-server-2008-r2 scripting
  • 1 个回答
  • 1438 Views
Martin Hope
ToC
Asked: 2015-07-24 07:23:53 +0800 CST

可用性组的 SQL Server 许可和群集

  • 1

对于 SQL Server 2014,阅读此MSDN链接和有关许可的 Microsoft PDF文件提出了几个问题。

  • 对于可用性组,我们需要 WSFC 还是 FCI?
  • WSFC 和 FCI 有何不同?
  • 如果我们只需要 2 个 AG 节点,SQL Server 标准版可以工作吗?
sql-server sql-server-2014
  • 1 个回答
  • 6466 Views
Martin Hope
ToC
Asked: 2015-05-22 06:19:18 +0800 CST

在 Sql Server 中,VAS 和缓冲池有什么区别?

  • 2

我的理解:

在 SQL Server 中,

  • 缓冲池是所有Data/Proc/Log Cache等所在的位置。
  • 虚拟地址空间是指物理位置(在 RAM 或页面文件中)的逻辑位置。

但是这句话让我很困惑:

“..多页分配发生在 VAS 区域,单页分配来自缓冲池……”

缓冲池和 VAS 有什么区别?

sql-server buffer-pool
  • 1 个回答
  • 4287 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