我是 SQL 新手,想知道这两种JOIN类型有什么区别?
SELECT *
FROM user u
INNER JOIN telephone t ON t.user_id = u.id
SELECT *
FROM user u
LEFT OUTER JOIN telephone t ON t.user_id = u.id
Run Code Online (Sandbox Code Playgroud)
我什么时候应该使用其中一种?
您是否在 DEV 和 STAGING 环境中的服务器级计算机上使用 SQL Server Developer Edition?
我正在从事一个大型项目(如果它通过了概念验证阶段),我们将拥有几个运行 SQL Server 2012 企业版的大型地理分布式企业级数据库服务器。
我们的生产环境最初有 3 台服务器,我们的 Staging 环境至少有 3 台服务器,而我们的开发环境将有 1 台服务器(托管三个实例)。
我的印象是,我们只需要为实际生产服务器获取企业许可证,我们可以在我们的开发人员和临时环境中使用开发人员版本,因为它们不是“生产”。
其他消息来源告诉我,我们需要在上述所有机器上拥有企业许可证,并且开发人员版本仅适用于其工作站上的单个开发人员。
由于开发者版具有 Enterprise 的所有性感功能,我无法真正看到它在工作站级机器上的价值,尤其是对于开发和测试我们正在构建的高可用性系统类型。
如果我们必须为开发服务器分配企业许可证,那只会扼杀我们的概念验证阶段,从而扼杀项目。在暂存环境中强制使用企业许可证将使管理层只想完全跳过暂存。
您是否曾经不得不证明不使用查询提示是合理的?
我WITH (NOLOCK)在每个访问非常繁忙的服务器的查询中都看到了。开发人员认为它应该默认开启,因为他们讨厌在他们的代码中看到它数千次。
我试图解释说它允许脏读,最终它们会得到坏数据,但他们认为性能权衡是值得的。(他们的数据库一团糟;难怪他们有性能问题。)
如果你有一个明确的例子来说明如何反对这种滥用NOLOCK提示的情况,那将不胜感激。
是否可以创建数据库别名或同义词?我希望能够做的是将 NewDatabaseName 别名为 OldDatabaseName 以防止不得不重写大量代码。
背景故事:一位客户向我提出了一个荒谬的自我引发的问题。他们有一个带有 SQL 服务器后端的第三方应用程序。用户一直在使用 Visual Basic 编写针对该数据库的自定义报告,所有数据库连接信息都硬编码在他们的程序中。
最近第三方软件重命名了他们的数据库。现在所有的报告 EXE 都失败了。
哦,他们也没有很多源代码。
我忍住笑声,说我会看看我能做些什么。
最近,我不再只是在文件利用率接近 80% 时增加文件,而是更主动地通过常用技巧回收空间,例如对堆进行碎片整理、添加和删除聚集索引、实现行或页面压缩等。
但是,在某些情况下,我可以通过执行DBCC CLEANTABLE回收更多空间。我的环境中有数百个数据库,不可能知道用户在每个数据库中做了什么,并且完全可以接受涉及删除固定长度列的更改。我通常通过查看我编写的一些对象空间利用脚本中的行数与页数来发现这些机会。我想通过尝试自动检测这些场景来更进一步。
我想知道的是,是否有人在积极监控此类机会,如果是,您具体在寻找什么?
我的想法是写一些东西,收集一行的最大和最小大小、表中的行数、分配的页数和使用的页数,然后做一些基本的数学运算来记录结果远远超出了“预期”。
我有一份报告,显示过去 12 小时的事件计数,按小时分组。听起来很容易,但我正在努力解决的是如何包含弥补差距的记录。
这是一个示例表:
Event
(
EventTime datetime,
EventType int
)
Run Code Online (Sandbox Code Playgroud)
数据如下所示:
'2012-03-08 08:00:04', 1
'2012-03-08 09:10:00', 2
'2012-03-08 09:11:04', 2
'2012-03-08 09:10:09', 1
'2012-03-08 10:00:17', 4
'2012-03-08 11:00:04', 1
Run Code Online (Sandbox Code Playgroud)
我需要创建一个结果集,该结果集在过去 12 小时内的每一小时都有一个记录,无论该小时内是否有事件。
假设当前时间是“2012-03-08 11:00:00”,报告将显示(大致):
Hour EventCount
---- ----------
23 0
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 1
9 3
10 1
Run Code Online (Sandbox Code Playgroud)
我想出了一个解决方案,该解决方案使用一个每天每小时都有一个记录的表。我设法在 where 子句中使用 UNION 和一些令人费解的大小写逻辑获得了我正在寻找的结果,但我希望有人有更优雅的解决方案。
我有一个数据库,可以根据嵌入鞋子中的 RFID 标签跟踪人们。此数据到达VARCHAR(MAX)与其他数据混合在一起的列中,没有特定的顺序。到目前为止,所有 RFID 值的格式如下:
AnnnnnnnnAnnAAAA (where A = 0-9 and n = A-Z)
Run Code Online (Sandbox Code Playgroud)
我正在写一份报告,从这些消息中提取 RFID 并将它们存储在他们自己的表中。只要 RFID 遵循相同的模式,我就可以找到它们。如果 RFID 格式发生变化,我的提取过程将失败。
RFID标签有标准格式吗?哪种数据类型最适合存储 RFID 标签?
我现在就去VARCHAR(20)。
我有一个包含超过 400,000,000 条记录的表,我正在寻找有关如何快速解析它的建议。
TheNameTable
(
NameID int primary key,
TheName varchar(500)
)
Run Code Online (Sandbox Code Playgroud)
名称存储如下:“名字,姓氏”(不是我的表,只是我必须使用的)
我需要提取一个唯一的姓氏列表。我最初的想法是以一系列批次(比如一次 50,000 条记录)处理该表,使用 NameID 来控制批次范围。然后我将使用 SQL 的内置字符串函数在“,”处断开字符串并保留字符串的右半部分。
right(TheName,charindex('.',reverse(TheName))-1)
Run Code Online (Sandbox Code Playgroud)
我有一种感觉,这仍然需要很长时间。
有没有人有其他想法?
简单地导出数据并在数据库外处理文件是否值得?
我采用的解决方案:
按照建议,我创建了两个计算列。一个是名字,一个是姓。他们没有坚持,因为我的空间有限。
alter table TheNameTable
add LastName as substring(TheName, charindex(',',TheName)+1,1000)
alter table TheNameTable
add FirstName as left(TheName,charindex(',',TheName)-1)
Run Code Online (Sandbox Code Playgroud)
我要求管理员临时增加 RAM,他们将 VM 提高到 32GB。
我创建了一个新表,其中包含 FirstName 和 LastName 的列。我在列上放置了一个唯一的复合索引,但指定了 IGNORE_DUP_KEY = ON。
我刚刚插入了前 1,000,000 条记录。它过滤掉了 125,000 个重复项。整个语句运行耗时 9 秒。
这就是我要找的速度!
我正在尝试确定将 SQL 脚本部署到数百个分布式服务器的最佳方式。我有一个缓慢的 SSIS 包和一个非常快的 OSQL/BATCH 进程。
我在一个项目中,我们在现场部署了数百个数据库服务器。我需要能够定期查询服务器和/或应用数据库升级脚本。
当我们只有 20 个服务器时,我构建了一个 SSIS 包来获取服务器列表并一次处理一个。SSIS 包运行良好,有大量的错误处理和日志记录等。它能够从每个服务器捕获结果集并将它们存储在一个中央位置以供进一步分析。然而,由于我构建它的方式,它串行处理每个服务器。20 服务器大约需要 10 分钟来处理。我正处于这种方法太慢的地步。
在我投入更多时间重写这个包以产生其他包(每个服务器一个)之前,我希望从其他面临类似情况的人那里得到一些建议。
您会以这种方式使用 SSIS,还是切换到 powershell,甚至 OSQL?
我几乎是在开玩笑,我翻阅了我的档案,拿出了我 12 年前编写的一个批处理程序,用于在远程服务器上应用脚本。我做了一些调整(改为 OSQL),它运行得非常快。我可以在 20 秒内处理 100 个服务器。我从一台 Windows 7 机器启动它,它不会因为打开那么多命令窗口而窒息。
OSQL/BATCH 解决方案的缺点是批处理文件是用服务器名和密码硬编码的。但是它太快了,我会继续使用它,直到找到更好的解决方案。
SSIS 包 - 当前的 SSIS 包执行以下操作: - 连接到中央服务器 - 检索需要查询的服务器列表 - 使用 forloop 容器,连接到每个服务器(串联)并执行查询 - 如果查询返回一个结果集,该信息被捕获并存储在中央服务器 - 中央服务器更新以反映每个服务器的成功/失败 - 所有错误都记录在中央服务器
我正在寻找一种方法来找出 Windows Server 上次仅使用 t-sql 命令启动的时间。
我试图保持在默认的安全配置内(即我不想启用 xp_cmdshell)