针对开发人员的Microsoft SQL Server元数据

Microsoft SQL Server 2016最近在关系数据库管理系统(RDBMS)中处于领先地位。 高性能,安全性,分析和云兼容性的结合使其成为领先的RDBMS 。 SQL Server 2017甚至支持R和Python编程语言,这进一步提高了它在学术机构中的数据科学家和数据专业人员中的吸引力。

这是一个激动人心的时刻的原因有很多是外本文的范围,SQL Server开发,但要简明概括他们:SQL Server已不仅成为头号RDBMS,这也成为一个 RDBMS。

牢记这些令人印象深刻的SQL Server新版本,您可能会想知道如何从预期对整体生产力产生最大影响的功能中获得最大价值,尤其是在您缺乏经验的情况下。 另一方面,如果您不参加每个网络研讨会,也不在浏览每篇有关新功能的文章,那么不必担心太多。 许多公司仍在使用SQL Server 2008 R2,尤其是在金融和医疗保健等受到严格监管的行业中。

我会警告任何人,在不首先精通(如果不精通)基本技能之前,不要专注于SQL Server的任何新功能。

本文解释了为什么元数据很有价值,什么是元数据,然后介绍了使用引用元数据的Transact-SQL(T-SQL)代码解决的两个实际问题。 从查询目录视图到动态使用元数据,您应该不了解将减少您熟悉数据和独立解决问题的时间和精力,从而使您的SQL Server开发技能更有价值的知识。

无论您使用的是哪个行业,公司或什至当前版本的SQL Server,您都可以学习这三个通用技能,这些技能可以高度移植,甚至可以跨越相对较大的软件版本跳跃(例如,从SQL Server 2008 R2到2014)。 。

开发人员的三项基本SQL Server技能

SQL是您必须具备的首要技能,也是最显而易见的技能。学习这种脚本语言的主要原因之一(除了它很有趣之外)还在于它的可传递性,即使在其他RDBMS之间也是如此。 当然,我说的是美国国家标准协会(ANSI)的标准SQL(SQL)语法,不一定是T-SQL,这是Microsoft的SQL方言。 就个人而言,我还发现学习SQL / T-SQL语法的新元素比适应图形用户界面上的新功能要容易。 出于本文的目的,我将基于以下假设来研究T-SQL:假定阅读本文的人都是SQL Server开发人员的某种变体。

PowerShell是第二项技能。 PowerShell是另一种脚本语言,允许用户自动执行各种有用的任务,这些任务通常涉及运行SQL Server Reporting Services报表,安排作业以及基本上完成许多数据库管理员(DBA)的工作。 但是,使PowerShell更具吸引力的是它替代了使用.NET对象和方法的Windows DOS批处理语言(即,在命令提示符下使用的批处理语言)。 其价值的另一个原因是,与T-SQL不同,PowerShell可以自动化跨越Windows和SQL Server环境的任务。

除了这两种丰富的脚本语言之外,还有第三种技能可以使任何精通SQL Server的用户受益,这就是元数据的使用。 从技术上讲,理解SQL Server元数据(就本文而言,除非明确指定,否则对“元数据”的所有引用都将意味着“ SQL Server”)是学习的主题,也是锻炼和应用技能(即记忆关系和学习的机会) T-SQL)-本身并不是一项技能。 因此,每当我提到“元数据的使用”时,我的意思是“开发人员在T-SQL中应用元数据知识的程度。”

但是,我认为,元数据也是开发人员社区中最被忽视和低估的主题之一(而学习T-SQL显然不是)。 许多入门的SQL Server或T-SQL书籍甚至都不会在以后的章节中讨论它,即使有的话,甚至甚至很少。

熟悉SQL Server元数据是一项比大多数讲师似乎更有价值的技能,特别是对于初学者而言,因为这是在SQL语言,数据库设计以及物理和逻辑处理中将知识应用于理论概念的一种实用方法。

即使对于经验丰富的开发人员和DBA,SQL Server元数据也可能非常有价值,因为它的实用性会随着您在数据库设计和编程的其他领域的创造力和能力而扩展。 在整篇文章中,我将提供一些T-SQL脚本的示例,这些示例会增加复杂性,并演示如何在尝试解决问题时熟悉元数据会变得无价。

但是,在深入研究示例之前,我应该提出几个重要的一般性观点。 微软的网站,通常称为“在线图书”(BOL),是我可以推荐的关于此主题的唯一最大资源。 实际上,您应该查看此页面以熟悉各种类型的元数据,以及此页面上的有关如何访问元数据(即使用目录视图)的信息。

基本元数据查询

查询对象目录视图的简单性和灵活性使即使是对SQL知识最少的用户也可以很好地浏览数据库中的对象和关系。 请允许我通过一个简单的示例演示为什么元数据对开发人员有用。

对于那些感兴趣的人,请注意,我正在使用SQL Server 2016 Express Edition和AdventureWorks2014示例数据库(两者都是完全免费的)。

假设您是虚构公司Adventure Works Cycles的新员工。 在查看了几张表后,您会发现名为“ BusinessEntityId”的列出现了很多。 让查询在数据库中显示具有该名称的每一列不是很好吗? 了解有关SQL Server元数据的基础知识使之变得容易。

由于您知道[sys]。[all_objects],[sys]。[schemas]和[sys]。[all_columns],因此可以编写一个简单的查询来实现BusinessEntityId的单个视图。

use AdventureWorks2014
go
select s.name as 'SchemaName',o.name as 'TableName',c.name as 'ColumnName'
from sys.schemas as sinner join sys.all_objects as oon s.schema_id = o.schema_idinner join sys.all_columns as con c.object_id = o.object_id
where c.name like 'BusinessEntityId'
and o.type = 'U'
order by SchemaName,TableName,ColumnName;

这是结果集:

元数据不仅仅用于编写基本的临时查询。 考虑进行难以置信的复杂查询的机会,以回答极其困难或耗时的问题。 例如,给定数据库中存在多少个重复索引? 它们是什么类型的索引?

不管您当前的T-SQL技能水平如何,尤其是通过目录视图和动态管理视图(DMV)熟悉元数据都非常有价值。 这是一种有趣且易于访问的机制,可以磨练您对T-SQL语言和公司主数据的了解,并随着您在数据库编程中不断增强的能力而扩展。

现在,按照其余查询中的注释进行说明,这些注释说明了使用元数据(结合一些业务知识)探索主数据如何可以帮助您独立回答问题。

use AdventureWorks2014
goselect s.name as 'SchemaName',o.name as 'TableName',c.name as 'ColumnName'
from sys.schemas as sinner join sys.all_objects as oon s.schema_id = o.schema_idinner join sys.all_columns as con c.object_id = o.object_id
where c.name like 'BusinessEntityId'
and o.type = 'U'
order by SchemaName,TableName,ColumnName;--Now join two tables using BusinessEntityId
select *
from HumanResources.Employee as einner join Person.Person as pon e.BusinessEntityID = p.BusinessEntityID
order by p.BusinessEntityID;--hmm, it looks like PersonType "EM" stands for "Employee," but what does "SP" mean?
--let's see if there are any other PersonType values
select distinct PersonType
from HumanResources.Employee as einner join Person.Person as pon e.BusinessEntityID = p.BusinessEntityID
order by p.BusinessEntityID;--apparently, there are none
--run the previous query again and look for patterns
--perhaps it has something to do with JobTitle?
select distinct p.PersonType,e.JobTitle
from HumanResources.Employee as einner join Person.Person as pon e.BusinessEntityID = p.BusinessEntityID
order by p.BusinessEntityID;--looks like it could have something to do with all sales-related jobs

如果您了解有关SQL Server元数据的方法,则可以了解很多关于公司数据的信息。

元数据的高级应用

但是元数据的更高级应用又如何呢? 如果您是在公司工作多年的经验丰富的开发人员,该怎么办? 为什么要学习SQL Server元数据? 好吧,一个更复杂的例子可能会让您信服。

在Grant Fritchey在PASS本地用户组活动中的演讲之一中,他描述了有关如何提高SQL Server性能的10条技巧。 其中之一是寻找嵌套视图并重写它们(理想情况下是通过连接到表)。 所谓“嵌套”,是指创建视图时引用其定义中的其他视图。 给定视图定义中嵌套的级别越多,性能下降的幅度越大。

显而易见的解决方案是不编写嵌套视图,但这也不是避免其假设存在的借口,因为这样做会限制性能调整的熟练程度,并依赖于将来不会成为问题的假设。 而且,如果您正在调查数据库性能问题并且不确定嵌套视图是否困扰数据库,那么值得您花时间至少看看一下此问题是否是必须解决的问题。 。

但是,您如何去做呢? 除了手动右键单击对象资源管理器中的每个视图并查看定义之外,为什么不创建一个利用动态SQL为您提供答案的元数据存储过程?

我写了两个存储过程,它们将在本文后面引用,以帮助您开始解决此问题。 碰巧有一个名为“ sys.dm_sql_referenced_entities”的系统函数,它接受两个输入参数:合格的视图名称(即“ schema.view”或“ [schema]。[view]”)和一个“引用类”。

就本文而言,只知道我们仅对数据库对象感兴趣,这意味着我们需要在第二个参数中使用字符串“ object”。 如果您想知道,如果使用其他引用类,则可以查看触发器的引用。 有关更多信息,请参见此链接 。

既然我已经提到了“动态sql”,那么我应该解决两类可能涉及的问题:安全性和性能。

动态SQL成本:安全性和性能

动态SQL本质上是“编写SQL的SQL”。 尽管它在存储过程中非常有用,但会带来一些成本。 但是,在详细说明这些成本之前,我必须指出,与嵌套视图可能对数据库产生的长期影响相比,它们可以忽略不计。

我很清楚,SQL注入是一种严重的安全风险,当开发人员编写动态SQL时,这种风险就有可能发生。 对我来说幸运的是,“父”存储过程不接受用户输入,也不打算在任何面向客户的应用程序中使用。 更具体地说,动态SQL不会接受来自应用程序前端的用户输入来获取其参数的值。

另一方面,如果您关心的是动态SQL的性能,那么我为您提供两个答复:

首先,此“嵌套视图”练习的目的是通过解决潜在的严重问题来提高数据库的整体性能,而这种问题很少发生(也就是说,除非您有一群开发人员继续定期嵌套视图,在这种情况下,您会遇到更大的问题)。

由于问题(理论上)很少发生,因此您应该只希望不频繁运行代码,这意味着代码性能不佳只会在您多次运行时才会引起关注。 换句话说,如果您专注于这些过程的性能却以牺牲整个数据库的性能为代价,则将完全失去问题的背景,因此,不要对代码的性能考虑得太严格(但是如果可以,请随时进行更多调整)。

其次,您可能还担心由于动态SQL的非关系​​性质,性能会受到影响。 我完全同意这样一种观点,即任何编写SQL的人都应在可能的情况下尽力做到相关性(即,以符合集合论原理的方式进行编写)。 不幸的是,没有比该方法更符合关系模型的解决该问题的替代方法了。 如果您不同意,或者找到任何使我的代码更具关系性的方法来改进我的代码,请立即与我联系。 我还应该提到,我已经写了整篇文章 。

为了快速总结这些批评:与嵌套视图可能对不断增长的数据库产生的长期和累积的,性能下降的影响相比,安全风险和性能问题可忽略不计。 该代码本身可能并未针对可伸缩性和性能进行优化,但是如果使用得当,它将有助于您确保数据库处于最佳状态。

使您的元数据动态化

那么,动态SQL是否值得承担这些风险? 我能给您的最佳答案是,这取决于您要解决的问题的价值。 动态SQL是SQL开发人员工具带中的另一种工具,它大大增加了解决问题的方式。 自动执行此嵌套视图清除程序搜寻的第一步是使用sys.dm_sql_referenced_entities(为简洁起见,我将使用“被引用实体”)编写动态SQL语句,以返回所有被引用视图的名称和引用频率:

[dbo]。[CountObjectReferences]

use [AdventureWorks2014]
gocreate procedure [dbo].[CountObjectReferences] (@QualifiedView as varchar(255),@RefCount as int output
) as
/*******************************************************************************************************************
Author: Alex Fleming
Create Date: 11-05-2017
This stored procedure accepts a string that contains a qualified view or table and returns the number of references.
Examples of valid parameters: 'Sales.vStoreWithContacts' or '[Sales].[vStoreWithContacts]'
*******************************************************************************************************************/
set nocount on;
begindeclare @DynamicSQL varchar(3000) = ('select count(*)from sys.dm_sql_referenced_entities(' + '''' + @QualifiedView + '''' + ',''object'') as RefEntinner join sys.all_views as AllViewson RefEnt.referenced_id = AllViews.object_idwhere RefEnt.referenced_class = 1and RefEnt.referenced_minor_name is null;');exec (@DynamicSQL);end;/********************************Test*********************************************
Note: AdventureWorks2014 does not contain any nested views out-of-the-box.
Consequently, I have created several for testing.  Here's the definition 
of two (one of them is nested by two levels):create view [HumanResources].[DuplicateEmployeeView] as 
(
select *
from HumanResources.vEmployee		------standard view in AdventureWorks2014------
);create view [HumanResources].[DuplicateEmployeeView3] as 
(
select *
from HumanResources.DuplicateEmployeeView
);declare @RefCount int;
exec dbo.CountObjectReferences @QualifiedView = 'HumanResources.DuplicateEmployeeView3', @RefCount = @RefCount output;
*********************************************************************************/

[dbo]。[FindNestedViews_v3]

use AdventureWorks2014gocreate procedure dbo.FindNestedViews_v3 (@ViewRefCount as int output) as/*******************************************************************************************************************Author: Alex FlemingCreate Date: 11-05-2017This stored procedure finds all of the views in the current database, stores them in a temp table, then passes them as parameters into the dbo.GetViewReferences stored procedure and stores the results in a new temp table, which isthen queried for all views containing one or more views in their definitions.*******************************************************************************************************************/set nocount on;beginif object_id ('[tempdb]..[#SchemaViewTemp]') is not nulldrop table #SchemaViewTemp;create table #SchemaViewTemp(  SVID int identity(1,1) NOT NULL primary key,SchemaViewString varchar(2000) NULL,RefCount int null);  insert into #SchemaViewTemp (SchemaViewString)select s.name + '.' + v.name as 'SchemaViewString'from sys.all_views as vinner join sys.schemas as son v.schema_id = s.schema_idwhere v.object_id > 0order by SchemaViewString;if object_id ('[tempdb]..[#ViewReferences]') is not nulldrop table #ViewReferences;--this table stores the output of the insert/exec statement--(can't use the same table because there is no way of updating based on an exec statement)create table #ViewReferences(  RefID int identity(1,1) not null primary key,RefCount int null);  declare @UpdateStmt varchar(500);declare @cnt as int = 0;declare @ViewString as nvarchar(255);declare NestedViewReader cursor forselect SchemaViewStringfrom #SchemaViewTemp;open NestedViewReader;fetch next from NestedViewReaderinto @ViewStringwhile @@FETCH_STATUS = 0begininsert into #ViewReferences (RefCount)exec @ViewRefCount = dbo.CountObjectReferences@QualifiedView = @ViewString, @RefCount = @ViewRefCount output;set @UpdateStmt = ('update #SchemaViewTemp set RefCount = ' + cast((select RefCount from #ViewReferences where RefID = @cnt + 1) as varchar(3)) +' where SVID = 1 + ' + cast(@cnt as varchar(2)) + ';');print @UpdateStmt;--for troubleshootingexec (@UpdateStmt);set @cnt = @cnt + 1;fetch next from NestedViewReaderinto @ViewStringendclose NestedViewReader;deallocate NestedViewReader;drop table #ViewReferences;select *from #SchemaViewTemp where RefCount > 0order by RefCount desc;end;go/********************************Test***********************************declare @ViewRefCount as int;exec dbo.FindNestedViews_v3 @ViewRefCount = @ViewRefCount output;************************************************************************/

在动态SQL和游标之间,T-SQL的某些功能只是该解决方案不可避免的部分。 据我所知,使该想法起作用的唯一方法是使用动态SQL执行引用的实体系统功能。

此外,多次运行动态SQL的唯一方法是使用游标(除非您想尝试使用扩展的存储过程,但这不在本文的讨论范围之内)。 除了动态SQL和游标之外,您还有一些重要的设计决策。

一旦您有一个执行在数据库,模式和视图名称中传递的动态SQL语句的存储过程,您可能希望放慢速度并考虑设计,特别是通过回答设计问题:“我是否要中断?将此存储到另一个存储过程中并调用它,还是将所有逻辑封装在一个巨型存储过程中?”

我将动态SQL包含在一个单独的存储过程中,而不是将其作为一个庞大的存储过程的第一部分,这一事实是我的故意设计决定。 当时,我认为阅读和维护起来会更容易。 此外,我想确保动态SQL的执行计划是一致的(存储过程的优点之一是防止优化器偶尔生成不同的执行计划)。 我还发现编写和测试更加容易。

确定如何存储合格的视图,将它们传递给[dbo]。[CountObjectReferences]存储过程,存储游标的结果,然后显示最终输出,这是此问题中比较困难的部分之一。 我们可以使用表变量,临时表,用户定义的表或视图。

如果您在此存储过程中使用嵌套视图,那将有多讽刺? 从技术上讲,只有当您在其中编写存储过程的数据库中没有除过程中的嵌套视图之外的嵌套视图,这才具有讽刺意味。 现在很讽刺!

我之所以选择临时表,是因为我对表变量不太熟悉。 我不想在此过程中维护用户定义的表,也没有安全方面的顾虑阻止我直接访问数据(因此排除了视图)。 稍后添加索引以及轻松地在本地和全局之间更改临时表的范围的能力也是吸引我的最初决定的吸引人的特征。

从一开始我就没有澄清过我是否想要一个更详细的结果集(它为用户提供尽可能多的相关元数据)还是包含最少的数据量以换取更高的性能,可维护性和简便性。

在考虑了原始问题并认为我希望能够临时运行这些存储过程之后,后者成为我的偏爱。我只需要一个简单的结果集即可找到嵌套视图。 基本上,您希望返回尽可能少的信息来回答您的问题。 在我们的例子中,这意味着返回所有包含其他视图的视图名称,理想情况下,返回原始视图和表之间存在多少级嵌套视图。

在继续之前,我必须指出,我知道使用游标会限制这种方法的可扩展性。 另一方面,在数据库中嵌套视图也不是完全可扩展的数据库设计方法,因此也请记住这一点。

如果我不了解[sys]。[views]或引用的实体功能,这些存储过程将是不可能的。 实际上,我最初是在[sys]。[schemas]和[sys]。[all_columns]上加入了[sys]。[all_objects],它们的性能比本文引用的版本差。 指出元数据特权和动态SQL背后的安全性问题也很重要。

由于安全策略根据组织的规模和行业的不同而不同,因此,每当从事涉及SQL Server开发的工作时,都应使用这些因素使您的期望与要使用的DBA保持一致。 有关SQL Server元数据安全性的更多信息,请参阅Kalen Delaney的本文 。 实际上,我还建议您从Delaney中阅读有关SQL Server元数据的更多信息。

其次,元数据访问需要您的DBA的批准。 虽然允许任何用户访问系统元数据都存在很小的安全风险,但这实际上取决于您的DBA或公司对开发人员的信任程度。 除非您在受到严格监管的行业工作,否则这对您来说不太可能成为问题。

当使用术语元数据时,我特别专注于系统元数据。 我还应该指出DMV的用处,因为它们在DBA中得到了广泛的使用和依赖,并建议任何开发人员都应该熟悉上述所有信息。

我发现最具挑战性的是快速找到正确的DMV或系统元数据-当我从上一段中得出自己的建议时,这个问题肯定会减少。 关于这一点,我鼓励遇到相同问题的任何人使用我的第一个示例,然后根据您要查找的内容对其进行修改(即,对其进行修改以根据关键字搜索来查找感兴趣的DMV或系统视图)。

通过额外的实践,在没有第三方软件任何帮助的情况下,通过最大限度地提高您在SQL Server中解决问题的能力,元数据和DMV对您来说将变得无比宝贵。 更好的是,您大部分依赖SQL Server元数据的代码仍将在Microsoft Azure中运行,从而使元数据的应用成为一种更具可移植性的技能。

考虑到技术兴衰的混乱,可转让技能越来越难以识别和依赖,这使开发人员的生活(有时)变得不必要地困难。 因此,SQL Server元数据的价值证明了Microsoft对用户授权的奉献精神,这无疑表明了他们与开发人员一起为您创建产品的迹象。

翻译自: https://www.javacodegeeks.com/2018/02/microsoft-sql-server-metadata-developers.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机怎么录制视频教程,怎么录制视频教程?查看电脑具体录屏方法

怎么录制视频教程?查看电脑具体录屏方法2020年04月07日 15:25作者:黄页编辑:黄页分享怎么录制视频教程?有时候在生活中遇到了喜欢的视频、直播等,想在电脑上通过录屏的方式记录下来。高质量的录屏视频怎么实现?其实具体录屏的方…

加密解密,MySQL单行函数,数学函数字符串日期时间,流程控制,完整详细可收藏查询SQL

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) 文章目录1、函数的理解2、数值函数2.1 基本函数2.2 角度与弧度…

无锡太湖学院计算机科学与技术宿舍,无锡太湖学院宿舍条件,宿舍环境图片(10篇)...

无锡太湖学院宿舍条件,宿舍环境图片(10篇)大学宿舍是一个神奇的地方,来自于天南地北的同学聚集在一个屋檐下,并将在一起度过宝贵的大学时光。人们常说,没有住过宿舍的大学是不完整的。当然不同的大学宿舍环境条件都不一样。高考升学网小编本文…

SELECT执行过程,MySQL聚合函数,多行分组函数,GROUP BY HAVING,详细完整可收藏

文章目录1、聚合函数介绍2、五个常用聚合函数3、GROUP BY4、HAVING5、SELECT的执行过程1、聚合函数介绍 聚合函数作用于一组数据,并对一组数据返回一个值。聚合函数不能嵌套调用。比如不能出现类似“AVG(SUM(字段名称))”形式的调用。 2、五个常用聚合函数 2.1 A…

嵌套套娃,MySQL子查询,单行与多行子查询,相关和不相关(关联)子查询,完整详细可收藏

文章目录1、需求分析与问题解决2、单行子查询3、多行子查询4、相关子查询5、抛一个思考题子查询指一个查询语句嵌套在另一个查询语句内部的查询,这个特性从MySQL 4.1开始引入。SQL 中子查询的使用大大增强了 SELECT 查询的能力,因为很多时候查询需要从结…

键盘连接在计算机的,技巧:如何在计算机键盘上输入连字符和破折号?

文字/连字符在哪里,我该如何输入?例如,某些英语单词中有连字符,例如高层。当然,有时是否有连字符都没有关系,并且不影响其含义。但是,有时有必要。例如,单词在行尾的位置是不够的。您…

删库跑路?不可回滚?MySQL创建和管理表,修改清空表,MySQL8新特性DDL原子化,完整详细可收藏

文章目录1、基础知识2、创建和管理数据库3、创建表4、修改表5、重命名表6、 删除表7、清空表8、MySQL8新特性—DDL的原子化1、基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步 。只有正确地把数据存储起来,我们才能进行有效的处理和分析。否则&#x…

不全?MySQL数据类型精讲,定点日期枚举文本字符串,json二进制,空间,选择建议,完整详细可收藏

文章目录1. MySQL中的数据类型2. 整数类型3. 浮点数类型4. 定点数类型5. 位类型:BIT6. 日期与时间类型7. 文本字符串类型8. ENUM类型9. SET类型10. 二进制字符串类型11. JSON 类型12. 空间类型13. 选择建议1. MySQL中的数据类型 常见数据类型的属性,如下…

约束,MySQL约束,非空默认值,主键外键唯一自增,完整详细可收藏

文章目录1. 约束(constraint)概述2. 非空约束3. 唯一性约束4. PRIMARY KEY 约束5. 自增列:AUTO_INCREMENT6. FOREIGN KEY 约束7. CHECK 约束8. DEFAULT约束9. 面试1. 约束(constraint)概述 1.1 为什么需要约束 数据完整性(Data Integrity)是…

如何测试Java类的线程安全性

我在最近的一次网络研讨会中谈到了这个问题,现在是时候以书面形式进行解释了。 线程安全是Java等语言/平台中类的重要品质,我们经常在线程之间共享对象。 缺乏线程安全性导致的问题很难调试,因为它们是零星的并且几乎不可能有意复制。 您如何…

争议?MySQL存储过程与函数,封装,体,完整详细可收藏

文章目录1. 存储过程概述2. 创建存储过程3. 调用存储过程4. 存储函数的使用5. 存储过程和函数的查看、修改、删除6. 关于存储过程使用的争议MySQL从5.0版本开始支持存储过程和函数。存储过程和函数能够将复杂的SQL逻辑封装在一起,应用程序无须关注存储过程和函数内部…

梦幻,MySQL视图,虚实表,完整详细可收藏

文章目录1. 数据库对象2. 视图概述3. 创建视图4. 查看视图5. 更新视图的数据6. 修改、删除视图7. 总结1. 数据库对象 2. 视图概述 2.1 为什么使用视图? 视图一方面可以帮我们使用表的一部分而不是所有的表,另一方面也可以针对不同的用户制定不同的查询视…

一条一条来,MySQL变量、流程控制与游标,完整详细可收藏

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) 文章目录1. 变量2. 定义条件与处理程序3. 流程控制4. 游标MyS…

无服务器:SLAppForge Sigma入门

! Cmere。 寻找某事? 无服务器,是吗? 在上面。 进入海峡,在“ Sigma”标志处右转。 (嗯,还不要怪我们;至少我们认为这很容易!) 我们的梦想目标之一是与S…

自动,MySQL触发器,完整详细可收藏

前些天发现了十分不错的人工智能学习网站,通俗易懂,风趣幽默,没有广告,分享给大家,大家可以自行看看。(点击跳转人工智能学习资料) 文章目录1. 触发器概述2. 触发器的创建3. 查看、删除触发器4.…

统计信号处理基础 - 估计与检测理论 估计部分习题3.7公式推导

统计信号处理基础 - 估计与检测理论 估计部分习题3.7公式推导题目证明结论得证题目 相信学习信号检测与估计的童鞋们肯定看到过Steven M.Kay大牛的书,非常厚的一本,不得不说,人家的书就是写得好,浅显易懂(当然是要从头…

机器学习大作业《Kaggle赛题之Kannada MNIST研究》论文和Python代码

一、赛题概述及分析 1、背景介绍 邮政系统每天都会处理大量的信件,最为要紧的一环是要根据信件上的收信人邮编进行识别和分类,以便确定信件的投送地。原本这项任务是依靠大量的人工来进行,后来人们尝试让计算机来替代人工。然而&#xff0c…

neo4j图形界面_图形处理:betweeness中心性– neo4j的密码与graphstream

neo4j图形界面上周, 我写了关于中间性中心算法以及我尝试使用graphstream 理解它的尝试 ,在阅读源代码的同时,我意识到我可以使用neo4j的所有最短路径算法将某些东西放在一起。 概括地说,中间性中心度算法用于确定图中节点的负载…

打开服务器文件提示内存不够,打开服务器文件提示内存不够

打开服务器文件提示内存不够 内容精选换一换本节操作指导您完成Windows操作系统云服务器磁盘空间清理。弹性云服务器匀出一部分磁盘空间来充当内存使用,当内存耗尽时,云服务器可以使用虚拟内存来缓解内存的紧张。但当内存使用率已经非常高时,…

【自适应(盲)均衡1】LMMSE、Godard、CMA常模、Sato等算法在信道均衡中的应用理论与MATLAB仿真(代码见CSDN同名资源)

1.实验背景 考虑如图所示的基带等效数据传输系统,发送符号经过ISI失真信道传输,叠加高斯加性白噪声。 设发送信号采用QPSK调制,即 x k = ( 1 j ) / 2 {x_k} = ( \pm 1 \pm j)/\sqrt 2 x