• [技术干货] arm架构服务器安装SQL SERVER
    实际上arm架构服务器是不可以安装SQL SERVER的,SQL SERVER 2022 preview 版本说明也没有提及兼容arm架构。目前唯一的做法是安装 Azure SQL Edgesudo docker pull mcr.microsoft.com/azure-sql-edgesudo docker run --cap-add SYS_PTRACE -e 'ACCEPT_EULA=1' -e 'MSSQL_SA_PASSWORD=Your@Strong!Password' -e 'MSSQL_PID=Developer' -p 1433:1433 --name azuresqledge -d mcr.microsoft.com/azure-sql-edge
  • [交流吐槽] SQL Server 查询存储,做查询优化的利器
    介绍一个SQL Server 2016后新增的功能:查询存储。查询存储的工作原理类似于飞行数据记录器或者黑匣子,不断地收集与查询和计划相关的编译和运行时信息,包括已执行查询的历史记录,查询运行时执行统计信息,针对执行计划的执行计划等。与查询相关的数据将永久保存在内部表中,并通过一组视图向用户显示。通过这些信息,可以快速查找性能差异,识别由查询计划更改和故障排除引起的性能等等问题。通过以下命令或者SSMS界面进行开启ALTER DATABASE [DatabaseOne] SET QUERY_STORE = ON; 查询存储开启后官方对内部对应的一些表,详细描述如下查看说明当然,这种类似的节点信息收集的东西,其实并不适合查询频率过大的查询,经过非严谨测试,性能损耗大概在5%左右。做过DB性能优化的人应该都知道,以前我们要么通过持续性的日志记录分析,要么通过实时的监控去找到对应的性能瓶颈,包括CPU、内存、IO等,查询存储其实就是在此基础上更进一步,把我们关心的点都存储起来,并且有更详尽信息和标准分析报告,相当省事。具体可以查看官方文档学习学习。
  • [行业资讯] 微软改进Cosmos DB并发布SQL Server 2022预览版
    SQL Server在两年前进行了最后一次重大里程碑更新,即SQL Server 2019更新。SQL Server 2022更新的一大重点是与Microsoft Azure云的更紧密集成。同时,微软正在为Cosmos DB数据库提供一系列增量更新,包括索引指标-帮助优化查询性能,以及新Patch API-支持数据库中优化部分文档更新。Gartner公司分析师Adam Ronthal称:“Cosmos DB仍然是强大的多模型非关系DBMS(数据库管理系统)产品。在提供具有多个非关系API的平台时,微软将Cosmos DB定位为适用于云原生应用程序的灵活、现代的DBMS。”在Ronthal看来,微软对Cosmos DB采取了不同于其一些核心竞争对手的方法,主要体现在他们提供多模型非关系平台,而非多个最适合的工程系统。Ronthal称:“这提供了一种统一的方法,对希望整合其数据管理领域的企业很有吸引力。”SQL Server 2022将推动微软云数据服务Cosmos DB是一种较新的多模型云原生数据库,微软仍致力于推进其更成熟的SQL Server 数据库。Cosmos DB于2017年首次发布,而SQL Server的历史可以追溯到1989年,早于现代云时代。通过SQL Server 2022,微软的目标是将关系数据库平台引入其Azure云生态系统。微软执行副总裁Scott Guthrie在Ignite技术会议上说:“SQL Server 2022是迄今为止支持云功能最多的SQL Server版本。”Guthrie指出,SQL Server 2022增加了新的业务连续性功能,在Azure中具有内置灾难恢复集成。该更新还添加了与数据治理平台Azure Purview的集成。Guthrie补充说,它还包括本地操作SQL Server数据的分析,其中Azure Synapse分析运行在云端。总的来说,Guthrie表示微软正在寻求在其内部部署和云数据服务之间提供双向灵活性。根据微软在SQL Server 2022中所采取的方向,Ronthal表示这有助于将Azure定位为分析和业务连续性的重心,同时为本地和云组件提供整体方法。 Ronthal 称:“微软继续投资于本地组件和云组件之间的更深层次集成,利用它们在两个领域的优势。”
  • [技术讨论] 有没有可能在鲲鹏服务器上安装SQL SERVER 2019?
    安装了 ExaGear,也不知道成功没有,但是SQL SERVER是没跑起来
  • [交流吐槽] 特定于 Entity Framework Core SQL Server 提供程序的索引功能
    此页详细介绍了特定于 SQL Server 提供程序的索引配置选项。群集聚集索引根据数据行的键值在表或视图中排序和存储这些数据行。 为表创建适当的聚集索引可以显著提高查询的速度,因为数据已经按最佳顺序进行布局。 每个表只能有一个聚集索引,因为数据行本身只能按一个顺序存储。 有关详细信息,请参阅有关聚集索引和非聚集索引的 SQL Server 文档。默认情况下,表的主键列由聚集索引隐式支持,所有其他索引为非聚集索引。可以按如下所示配置要聚集的索引或键:protected override void OnModelCreating(ModelBuilder modelBuilder){    modelBuilder.Entity<Blog>().HasIndex(b => b.PublishedOn).IsClustered();}填充因子提供索引填充因子选项是为了优化索引数据存储和性能。 有关详细信息,请参阅有关填充因子的 SQL Server 文档。可按如下所示配置索引的填充因子:protected override void OnModelCreating(ModelBuilder modelBuilder){    modelBuilder.Entity<Blog>().HasIndex(b => b.PublishedOn).HasFillFactor(10);}联机创建ONLINE 选项允许在创建索引期间并发用户访问基础表或聚集索引数据以及任何关联的非聚集索引,以便用户可以继续更新和查询基础数据。 当脱机执行数据定义语言 (DDL) 操作(例如,生成或重新生成聚集索引)时,这些操作对基础数据和关联索引持有排他锁。 有关详细信息,请参阅有关 ONLINE 索引选项的 SQL Server 文档。可以使用 ONLINE 选项配置索引,如下所示:protected override void OnModelCreating(ModelBuilder modelBuilder){    modelBuilder.Entity<Blog>().HasIndex(b => b.PublishedOn).IsCreatedOnline();}
  • [整体安全] 【漏洞预警】Oracle MySQL Server输入验证错误漏洞(CVE-2022-21367)
    漏洞描述:甲骨文公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989年正式进入中国市场。2013年,甲骨文已超越 IBM ,成为继 Microsoft 后全球第二大软件公司。Oracle MySQL Server是美国甲骨文(Oracle)公司的一款关系型数据库。Oracle MySQL Server存在输入验证错误漏洞,攻击者可利用该漏洞未经授权更新、插入或删除对MySQL Server可访问数据的访问。漏洞危害:Oracle MySQL 的MySQL Server 产品中的漏洞。受影响的版本包括 5.7.36 及更早版本和 8.0.27 及更早版本。易于利用的漏洞允许高特权攻击者通过多种协议进行网络访问,从而破坏MySQL服务器。成功攻击此漏洞可导致未经授权的能力,导致MySQL服务器挂起或频繁可重复的崩溃,以及未经授权的更新,插入或删除对某些MySQL服务器可访问数据的访问。影响范围:Oracle MySQL Server <=5.7.36Oracle MySQL Server <=8.0.27漏洞等级:  中危修复方案:厂商已发布了漏洞修复程序,请及时关注更新:https://www.oracle.com/security-alerts/cpujan2022.html
  • [技术干货] openGauss数据库开发指导手册(上)
    简介本实验指导书主要目的是为了让读者熟悉并掌握openGauss数据库的基本操作,并通过案例强化学习。内容描述本实验指导书先介绍创建管理用户、表及其它数据库对象等openGauss数据库的基本操作,再从学校数据模型的案例入手,进行模拟演练。前置条件openGauss数据库开发需要掌握openGauss数据库的基本操作和SQL语法,openGauss数据库支持SQL2003标准语法,数据库基本操作参见附录一。实验环境说明组网说明本实验环境为华为云ECS服务器和openGauss数据库。设备介绍为了满足本实验需要,建议实验环境采用以下配置:设备名称、型号与版本的对应关系如下:设备明细表设备名称设备型号软件版本数据库openGaussopenGauss 1.1.0操作系统openEuleropenEuler 20.3LTS实验概览1 数据库开发实验1.1 创建和管理用户、表空间和数据库1.1.1 创建和管理用户1.1.1.1 创建用户通过CREATE USER创建的用户,默认具有LOGIN权限;通过CREATE USER创建用户的同时系统会在执行该命令的数据库中,为该用户创建一个同名的SCHEMA;其他数据库中,则不自动创建同名的SCHEMA;用户可使用CREATE SCHEMA命令,分别在其他数据库中,为该用户创建同名SCHEMA。系统管理员在普通用户同名schema下创建的对象,所有者为schema的同名用户(非系统管理员)。创建用户jim,登录密码为Bigdata@123。postgres=# CREATE USER jim PASSWORD 'Bigdata@123'; CREATE ROLE同样的下面语句也可以创建用户。postgres=# CREATE USER kim IDENTIFIED BY 'Bigdata@123'; CREATE ROLE如果创建有“创建数据库”权限的用户,则需要加CREATEDB关键字。postgres=# CREATE USER dim CREATEDB PASSWORD 'Bigdata@123'; CREATE ROLE1.1.1.2 管理用户将用户jim的登录密码由Bigdata@123修改为Abcd@123。postgres=# ALTER USER jim IDENTIFIED BY 'Abcd@123' REPLACE 'Bigdata@123'; ALTER ROLE为用户jim追加CREATEROLE权限。postgres=# ALTER USER jim CREATEROLE; ALTER ROLE将enable_seqscan的值设置为on,设置成功后,在下一会话中生效。postgres=# ALTER USER jim SET enable_seqscan TO on; ALTER ROLE锁定jim帐户。postgres=# ALTER USER jim ACCOUNT LOCK; ALTER ROLE删除用户。postgres=# DROP USER kim CASCADE; DROP ROLE postgres=# DROP USER jim CASCADE; DROP ROLE postgres=# DROP USER dim CASCADE; DROP ROLE1.1.2 创建和管理表空间1.1.2.1 创建表空间步骤 1 执行如下命令创建用户jack。postgres=# CREATE USER jack IDENTIFIED BY 'Bigdata@123';当结果显示为如下信息,则表示创建成功。CREATE ROLE步骤 2 执行如下命令创建表空间。postgres=# CREATE TABLESPACE fastspace RELATIVE LOCATION 'tablespace/tablespace_1';当结果显示为如下信息,则表示创建成功。CREATE TABLESPACE其中“fastspace”为新创建的表空间,“数据库节点数据目录/pg_location/tablespace/tablespace_1”是用户拥有读写权限的空目录,如 /gaussdb/data/db1/pg_location/tablespace/tablespace_1 。步骤 3 数据库系统管理员执行如下命令将“fastspace”表空间的访问权限赋予数据用户jack。postgres=# GRANT CREATE ON TABLESPACE fastspace TO jack;当结果显示为如下信息,则表示赋予成功。GRANT1.1.2.2 管理表空间1.1.2.2.1 查询表空间方式1:检查pg_tablespace系统表。如下命令可查到系统和用户定义的全部表空间。postgres=# SELECT spcname FROM pg_tablespace; spcname ------------ pg_default pg_global fastspace (3 rows)方式2:使用gsql程序的元命令查询表空间。postgres=# \db List of tablespaces Name | Owner | Location ------------+-------+------------------------- fastspace | omm | tablespace/tablespace_1 pg_default | omm | pg_global | omm | (3 rows)1.1.2.2.2 查询表空间使用率步骤 1 查询表空间的当前使用情况。postgres=# SELECT PG_TABLESPACE_SIZE('fastspace');返回如下信息:pg_tablespace_size -------------------- 4096 (1 row)其中4096表示表空间的大小,单位为字节。步骤 2 计算表空间使用率。表空间使用率=PG_TABLESPACE_SIZE/表空间所在目录的磁盘大小。1.1.2.2.3 修改表空间执行如下命令对表空间fastspace重命名为fspace。postgres=# ALTER TABLESPACE fastspace RENAME TO fspace; ALTER TABLESPACE1.1.2.2.4 删除表空间执行如下命令删除用户jack。postgres=# DROP USER jack CASCADE; DROP ROLE执行如下命令删除表空间fspace。postgres=# DROP TABLESPACE fspace; DROP TABLESPACE说明:用户必须是表空间的owner或者系统管理员才能删除表空间。1.1.3 创建和管理数据库1.1.3.1 创建数据库步骤 1 使用如下命令创建一个新的表空间tpcds_local。postgres=# CREATE TABLESPACE tpcds_local RELATIVE LOCATION 'tablespace/tablespace_2'; CREATE TABLESPACE步骤 2 使用如下命令创建一个新的数据库db_tpcc。postgres=# CREATE DATABASE db_tpcc WITH TABLESPACE = tpcds_local; CREATE DATABASE1.1.3.2 管理数据库1.1.3.2.1 查看数据库使用\l元命令查看数据库系统的数据库列表(l表示list)。postgres=# \l List of databases Name | Owner | Encoding | Collate | Ctype | Access privileges -----------+-------+-----------+---------+-------+------------------- db_tpcc | omm | SQL_ASCII | C | C | postgres | omm | SQL_ASCII | C | C | template0 | omm | SQL_ASCII | C | C | =c/omm + | | | | | omm=CTc/omm template1 | omm | SQL_ASCII | C | C | =c/omm + | | | | | omm=CTc/omm (4 rows)使用如下命令通过系统表pg_database查询数据库列表。postgres=# SELECT datname FROM pg_database; datname ----------- template1 db_tpcc template0 postgres (4 rows)1.1.3.2.2 修改数据库用户可以使用如下命令修改数据库属性(比如:owner、名称和默认的配置属性)。使用以下命令为数据库设置默认的模式搜索路径。postgres=# ALTER DATABASE db_tpcc SET search_path TO pa_catalog,public; ALTER DATABASE使用如下命令为数据库重新命名。postgres=# ALTER DATABASE db_tpcc RENAME TO human_tpcds; ALTER DATABASE1.1.3.2.3 删除数据库用户可以使用DROP DATABASE命令删除数据库。此命令删除了数据库中的系统目录,并且删除了带有数据的磁盘上的数据库目录。用户必须是数据库的owner或者系统管理员才能删除数据库。当有人连接数据库时,删除操作会失败。删除数据库时请先连接到其他的数据库。使用如下命令删除数据库:postgres=# DROP DATABASE human_tpcds; DROP DATABASE1.2 创建和管理表1.2.1 创建表表是建立在数据库中的,在不同的数据库中可以存放相同的表。甚至可以通过使用模式在同一个数据库中创建相同名称的表。执行如下命令创建表。 postgres=# CREATE TABLE customer_t1 ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6), c_last_name char(8) );当结果显示为如下信息,则表示创建成功。CREATE TABLE其中c_customer_sk 、c_customer_id、c_first_name和c_last_name是表的字段名,integer、char(5)、char(6)和char(8)分别是这四字段名称的类型。1.2.2 向表中插入数据1.2.2.1 向表customer_t1中插入一行数据数据值是按照这些字段在表中出现的顺序列出的,并且用逗号分隔。通常数据值是文本(常量),但也允许使用标量表达式。postgres=# INSERT INTO customer_t1(c_customer_sk, c_customer_id, c_first_name) VALUES (3769, 'hello', 'Grace');如果用户已经知道表中字段的顺序,也可无需列出表中的字段。例如以下命令与上面的命令效果相同。postgres=# INSERT INTO customer_t1 VALUES (3769, 'hello', 'Grace');如果用户不知道所有字段的数值,可以忽略其中的一些。没有数值的字段将被填充为字段的缺省值。例如:postgres=# INSERT INTO customer_t1 (c_customer_sk, c_first_name) VALUES (3769, 'Grace'); 或postgres=# INSERT INTO customer_t1 VALUES (3769, 'hello');1.2.2.2 向表中插入多行数据命令如下:postgres=# INSERT INTO customer_t1 (c_customer_sk, c_customer_id, c_first_name) VALUES (6885, 'maps', 'Joes'), (4321, 'tpcds', 'Lily'), (9527, 'world', 'James');如果需要向表中插入多条数据,除此命令外,也可以多次执行插入一行数据命令实现。但是建议使用此命令可以提升效率。1.2.2.3 从指定表插入数据到当前表如果从指定表插入数据到当前表,例如在数据库中创建了一个表customer_t1的备份表customer_t2,现在需要将表customer_t1中的数据插入到表customer_t2中,则可以执行如下命令。postgres=# CREATE TABLE customer_t2 ( c_customer_sk integer, c_customer_id char(5), c_first_name char(6), c_last_name char(8) ); 插入数据:INSERT INTO customer_t2 SELECT * FROM customer_t1;删除备份表:postgres=# DROP TABLE customer_t2 CASCADE; DROP TABLE1.2.3 更新表中数据修改已经存储在数据库中数据的行为叫做更新。用户可以更新单独一行,所有行或者指定的部分行。还可以独立更新每个字段,而其他字段则不受影响。需要将表customer_t1中c_customer_sk为9527的字段重新定义为9876:postgres=# UPDATE customer_t1 SET c_customer_sk = 9876 WHERE c_customer_sk = 9527; UPDATE 1这里的表名称也可以使用模式名修饰,否则会从默认的模式路径找到这个表。SET后面紧跟字段和新的字段值。新的字段值不仅可以是常量,也可以是变量表达式。比如,把所有c_customer_sk的值增加100:postgres=# UPDATE customer_t1 SET c_customer_id = 'Admin', c_first_name = 'Local' WHERE c_customer_sk = 4421;用户可以在一个UPDATE命令中更新更多的字段,方法是在SET子句中列出更多赋值,比如:postgres=# UPDATE customer_t1 SET c_customer_id = 'Admin', c_first_name = 'Local' WHERE c_customer_sk = 4421;1.2.4 查看数据使用系统表pg_tables查询数据库所有表的信息。postgres=# SELECT * FROM pg_tables;使用gsql的\d+命令查询表的结构。postgres=# \d+ customer_t1;执行如下命令查询表customer_t1的数据量。postgres=# SELECT count(*) FROM customer_t1;执行如下命令只查询字段c_customer_sk的数据。postgres=# SELECT c_customer_sk FROM customer_t1;执行如下命令过滤字段c_customer_sk的重复数据。postgres=# SELECT DISTINCT( c_customer_sk ) FROM customer_t1;执行如下命令查询字段c_customer_sk为3869的所有数据。postgres=# SELECT * FROM customer_t1 WHERE c_customer_sk = 3869;执行如下命令按照字段c_customer_sk进行排序。postgres=# SELECT * FROM customer_t1 ORDER BY c_customer_sk;执行如下命令查询ROWNUM伪列。postgres=# SELECT rownum,c_customer_sk,c_customer_id FROM customer_t1;执行如下命令使用别名进行查询(CNB、CSK、CID为列别名,T 为表别名)。postgres=# SELECT rownum CNB,T.c_customer_sk CSK,T.c_customer_id CID FROM customer_t1 T;1.2.5 删除表中数据在使用表的过程中,可能会需要删除已过期的数据,删除数据必须从表中整行的删除。使用DELETE命令删除行,如果删除表customer_t1中所有c_customer_sk为3869的记录:postgres=# DELETE FROM customer_t1 WHERE c_customer_sk = 3869;如果执行如下命令之一,会删除表中所有的行。postgres=# DELETE FROM customer_t1;或:postgres=# TRUNCATE TABLE customer_t1;全表删除的场景下,建议使用truncate,不建议使用delete。删除创建的表:postgres=# DROP TABLE customer_t1;
  • [技术干货] SQL Server Msdb
    Msdb数据库用来保存数据库备份、SQL Agent信息、DTS程序包和SQL Server任务等信息,以及诸如日志转移这样的复制信息
  • [技术干货] SQL Server Tempdb
    Tempdb数据库存有临时对象,例如全局和本地临时表和存储过程。这个数据库在SQL Server每次重启的时候都会被重新创建,而其中包含的对象是依据模型数据库里定义的对象被创建的。除了这些对象,Tempdb还存有其它对象,例如表变量、来自表值函数的结果集,以及临时表变量。由于Tempdb会保留SQL Server实体上所有数据库的对象类型,所以,对数据库进行优化配置是非常重要的。
  • [技术干货] SQL Server Model
    Model数据库(模型数据库)是一个用来在实体上创建新用户数据库的模版数据库,可以把任何存储过程、视图、用户等放在模型数据库里,这样在创建新数据库的时候,新数据库就会包含存放在模型数据库里的所有对象了。
  • [技术干货] SQL Server Master
    Master数据库(主数据库)保存有放在SQL Server实体上的所有数据库元数据的详细信息,它还是将引擎固定起来的粘合剂。由于如果不使用Master数据库,那么SQL Server就不能启动,所以,必须要小心地管理好这个数据库。因此,对这个数据库进行常规备份是十分必要的。这个数据库包括了诸如系统登录、配置设置、已连接的Server等信息。主数据库还存有扩展存储过程,它能够访问外部进程,从而允许与磁盘子系统和系统API调用等特性交互。
  • [技术干货] Oracle跟SQL Server 2005的区别
    宏观上: 1). 最大的区别在于平台,oracle可以运行在不同的平台上,sql server只能运行在windows平台上,由于windows平台的稳定性和安全性影响了sql server的稳定性和安全性 2). oracle使用的脚本语言为PL-SQL,而sql server使用的脚本为T-SQL 
  • [技术干货] SQL Server 2012 多表连接查询功能实例代码
    直接给大家贴代码了,具体代码如下所示:-- 交叉连接产生笛卡尔值 (X*Y) SELECT * FROM Student cross Join dbo.ClassInfo --另外一种写法 SELECT * FROM Student , ClassInfo -- 内连接 (Inner 可以省略) SELECT * FROM Student JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID; -- Inner Join SELECT * FROM Student INNER JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID; -- on 条件,通常是 主外键,但是不限于主外键 -- on 条件,允许有多个,而且可能是针对某个表的 SELECT * FROM Student INNER JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID AND dbo.Student.Class IN (1,2) -- 针对Student表增加查询条件 -- 不等于 (笛卡尔值减去 相等的值) SELECT * FROM Student INNER JOIN dbo.ClassInfo ON dbo.Student.Class <> dbo.ClassInfo.ID; --自连接 从Class表中查询到Class所在的系 SELECT T1.* ,T2.ClassName FROM dbo.ClassInfo AS T1 INNER JOIN dbo.ClassInfo AS T2 ON T1.PID=T2.ID -- Left Join SELECT * FROM Student Left JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID; -- Right Join SELECT * FROM Student RIGHT JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID; -- 全外连接 SELECT * FROM Student FULL OUTER JOIN dbo.ClassInfo ON dbo.Student.Class = dbo.ClassInfo.ID; -- 外连接和内连接的区别是: -- 内连接,on条件不符合的话,会过滤掉数据 -- 外连接,以保留表为主,on条件成立显示数据,否则显示NULL --Union 纵向连接 SELECT StuID,StuName,StuEnName,StuAge,StuBirthday FROM Student WHERE StuID<=2 UNION SELECT StuID,StuName,StuEnName,StuAge,StuBirthday FROM dbo.Student WHERE StuID>2 --Union 去重复 SELECT StuSex FROM Student WHERE StuID<=2 UNION SELECT StuSex FROM dbo.Student WHERE StuID>2 --Union 显示全部 SELECT StuSex FROM Student WHERE StuID<=2 UNION ALL SELECT StuSex FROM dbo.Student WHERE StuID>2 --Except 差集,排除 SELECT StuID,StuName,StuEnName,StuAge,StuBirthday FROM Student Except SELECT StuID,StuName,StuEnName,StuAge,StuBirthday FROM dbo.Student WHERE StuID<=2 --Intersect 交集 SELECT StuID,StuName,StuEnName,StuAge,StuBirthday FROM Student WHERE StuID>=2 Except SELECT StuID,StuName,StuEnName,StuAge,StuBirthday FROM dbo.Student WHERE StuID<=3
  • [技术干货] SQL设置SQL Server最大连接数及查询语句
    关于Sql Server最大连接数(Max Pool Size)的问题,后来通过查找一些资料解决了,所以想着总结下一、设置最大连接数下面的T-SQL 语句可以配置SQL Server 允许的并发用户连接的最大数目。exec sp_configure 'show advanced options', 1 exec sp_configure 'user connections', 100第一句用以表示显示sp_configure 系统存储过程高级选项,使用user connections 时,要求show advanced options 值为1。第二句配置最大连接数为100,0 表示不限制,但不表示无限,后面将谈谈。也可以在企业管理器中配置,在企业管理器中,可以在实例上点右键->“属性”->“连接”里面更改。需要重新启动SQL Server,该值才会生效。@@max_connectionsselect @@max_connections它总是返回32767,它并不是指上面设置的user connections,实际上它表示user connections 最大可设置为多少。由于它的最大值是32767,那么user connections 为0 时,最大连接数也就是32767 了,并不是无限。默认情况下user connections 值是0,也就是说默认情况下SQL Server 的最大连接数是32767。二、获得当前设置的最大连接数:select value from master.dbo.sysconfigures where [config]=103 三、如何监测SQLServer的连接数/*查询连接数*/ select loginame,count(1) as Nums from sys.sysprocesses group by loginame order by 2 desc select spid,ecid,status,loginame,hostname,cmd,request_id from sys.sysprocesses where loginame='' and hostname=''方法二:SP_WHO 'loginName'loginName 是当然登陆Sql的用户名,一般程序里面都会使用一个username来登陆SQL这样通过这个用户名就能查看到此用户名登陆之后占用的连接了。如果不写loginName,那么返回的就是所有的连接。既然连接数是可预测、可监测的,那么它就是可度量的,那么我们就可以根据实际情况来评估或测试程序的并发放量了。
  • [技术干货] 喜忧参半的SQL Server触发器详解 下
    3.最后一步是测试和验证日志表是否正确。以下是添加触发器后对表进行更新的测试:12345678UPDATE Orders SET InternalComments = 'Item is no longer backordered', BackorderOrderID = NULL, IsUndersupplyBackordered = 0, LastEditedBy = 1, LastEditedWhen = SYSUTCDATETIME()FROM sales.OrdersWHERE Orders.OrderID = 10;结果如下:点击并拖拽以移动上面省略了一些列,但是我们可以快速确认已经触发了更改,包括日志表末尾新增的列。INSERT和DELETE前面的示例中,进行插入和删除操作后,读取日志表中使用的数据。这种特殊的表可以作为任何相关写操作的一部分。INSERT将包含**入操作触发,DELETE将被删除操作触发,UPDATE包含**入和删除操作触发。对于INSERT和UPDATE,将包含表中每个列新值的快照。对于DELETE和UPDATE操作,将包含写操作之前表中每个列旧值的快照。触发器什么时候最有用DML触发器的最佳使用是简短、简单且易于维护的写操作,这些操作在很大程度上独立于应用程序业务逻辑。触发器的一些重要用途包括:记录对历史表的更改审计用户及其对敏感表的操作。向表中添加应用程序可能无法使用的额外值(由于安全限制或其他限制),例如: 登录/用户名 操作发生时间服务器/数据库名称简单的验证。关键是让触发器代码保持足够的紧凑,从而便于维护。当触发器增长到成千上万行时,它们就成了开发人员不敢去打扰的黑盒。结果,更多的代码被添加进来,但是旧的代码很少被检查。即使有了文档,这也很难维护。为了让触发器有效地发挥作用,应该将它们编写为基于设置的。如果存储过程必须在触发器中使用,则确保它们在需要时使用表值参数,以便可以基于集的方式移动数据。下面是一个触发器的示例,该触发器遍历id,以便使用结果顺序id执行示例存储过程:123456789101112131415161718CREATE TRIGGER TR_Sales_Orders_Process ON Sales.Orders AFTER INSERTASBEGIN SET NOCOUNT ON; DECLARE @count INT; SELECT @count = COUNT(*) FROM inserted; DECLARE @min_id INT; SELECT @min_id = MIN(OrderID) FROM inserted; DECLARE @current_id INT = @min_id; WHILE @current_id < @current_id + @count BEGIN EXEC dbo.process_order_fulfillment  @OrderID = @current_id; SELECT @current_id = @current_id + 1; ENDEND虽然相对简单,但当一次插入多行时对 Sales.Orders的INSERT操作的性能将受到影响,因为SQL Server在执行process_order_fulfillment存储过程时将被迫逐个执行。一个简单的修复方法是重写存储过程,并将一组Order id传递到存储过程中,而不是一次一个地这样做:1234567891011121314CREATE TYPE dbo.udt_OrderID_List AS TABLE( OrderID INT NOT NULL, PRIMARY KEY CLUSTERED ( OrderID ASC));GOCREATE TRIGGER TR_Sales_Orders_Process ON Sales.Orders AFTER INSERTASBEGIN SET NOCOUNT ON; DECLARE @OrderID_List dbo.udt_OrderID_List; EXEC dbo.process_order_fulfillment @OrderIDs = @OrderID_List;END更改的结果是将完整的id集合从触发器传递到存储过程并进行处理。只要存储过程以基于集合的方式管理这些数据,就可以避免重复执行,也就是说,避免在触发器内使用存储过程有很大的价值,因为它们添加了额外的封装层,进一步隐藏了在数据写入表时执行的TSQL。它们应该被认为是最后的手段,只有当可以在应用程序的许多地方多次重写TSQL时才使用。什么时候触发器是危险的架构师和开发人员面临的最大挑战之一是确保触发器只在需要时使用,而不允许它们成为一刀切的解决方案。向触发器添加TSQL通常被认为比向应用程序添加代码更快、更容易,但随着时间的推移,这样做的成本会随着每添加一行代码而增加。触发器在以下情况下会变得危险:保持尽可能少的触发以减少复杂性。触发代码变得复杂。如果更新表中的一行导致要执行数千行添加的触发器代码,那么开发人员就很难完全理解数据写入表时会发生什么。更糟糕的是,当出现问题时,故障排除非常具有挑战性。触发器跨服务器。这将网络操作引入到触发器中,可能导致在出现连接问题时写入速度变慢或失败。如果目标数据库是要维护的对象,那么即使是跨数据库触发器也会有问题。触发器调用触发器。触发器中最令人痛苦的是,当插入一行时,写操作会导致75个表中有100个触发器要执行。在编写触发器代码时,确保触发器可以执行所有必要的逻辑,而不会触发更多触发器。额外的触发通常是不必要的。递归触发器被设置为ON。这是一个默认设置为off的数据库级别设置。打开时,它允许触发器的内容调用相同的触发器。递归触发器会极大地损害性能,调试时也会非常混乱。通常,当一个触发器中的DML作为操作的一部分触发其他触发器时,使用递归触发器。函数、存储过程或视图都在触发器中。在触发器中封装更多的业务逻辑会使它们变得更复杂,并给人一种触发器代码短小简单的错误印象,而实际上并非如此。尽可能避免在触发器中使用存储过程和函数。迭代发生。循环和游标本质上是逐行操作的,可能会导致对1000行的操作一次触发1000次,这极大地损害了查询性能。这是一个很长的列表,但通常可以总结为短而简单的触发器会表现得更好,并避免上面的大多数陷阱。如果使用触发器来维护复杂的业务逻辑,那么随着时间的推移,越来越多的业务逻辑将被添加进来,并且不可避免地将违反上述最佳实践。重要的是要注意,为了维护原子的、事务,受触发器影响的任何对象都将保持事务处于打开状态,直到该触发器完成。这意味着长触发器不仅会使事务持续时间更长,而且还会持有锁并导致持续时间更长。因此,在测试触发器时,在为现有触发器创建或添加额外逻辑时,应该了解它们对锁、阻塞和等待的影响。
总条数:106 到第
上滑加载中