我们正在开发一个非常大的 OLTP 数据库(SQL Server 2012)并考虑使用 GUID 作为主键(我记住不要使其成为集群),但是,我们不确定特别是性能的后果。我们首先使用 EF 代码。
有人可以帮我们决定吗?请包含文章链接。谢谢
我曾经遇到过这个问题,创建了一个程序,然后当我想更改它时,我曾经先删除它,然后再次重新创建它。然后我认为这需要很多时间。我必须找到更好的方法!
这是最好的方法,以减轻时间。并且如果您以后需要更改它?
我有两张桌子。两个表都包含一个可用于将它们连接在一起的 ID。然而,表 2 可以有more than one row for the same ID
. 表 1 始终只有一行。
例如,table 1
包含 60,000 行。当我执行左内连接时,table2
它返回约 171 000 行。
我想要完成的是返回表 2 中的第一行,这样当我加入它们时,我不会创建重复的记录。
我不确定这是否是正确的方法,但这就是我尝试过的:
SELECT I.*, a.Name from table 1 I
INNER JOIN (SELECT MIN (a.ID), a.NAME FROM table 2 group by a.ID) as a
on I.ID = a.ID
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
“i”附近的语法不正确。
关于如何解决这个问题有什么建议吗?或者以不同的方式得到结果?
我在 SQL Server 2012 中通过更新查询得到“意外”结果。这就是我想要做的。
从由ID ','name
(例如258967,Sarah Jones )组成的列(IDENTIFIER)中,我必须填写其他两列:ID
和SELLER_NAME
。
原始列有一些值,末尾有一个空白,其余的没有它:
'258967,Sarah Jones'
'98745,Richard James '
Run Code Online (Sandbox Code Playgroud)
这是我正在执行的更新查询:
UPDATE SELLER
SET
IDENTIFIER = LTRIM(RTRIM(IDENTIFIER)),
ID = Left(IDENTIFIER , charindex(',', IDENTIFIER )-1),
SELLER_NAME = UPPER(RIGHT((IDENTIFIER ),LEN(IDENTIFIER )-CHARINDEX(',',IDENTIFIER )));
Run Code Online (Sandbox Code Playgroud)
但我最后得到了错误的结果
258967,Sarah Jones 258967 SARAH JONES
98745,Richard James 98745 ICHARD JAMES
Run Code Online (Sandbox Code Playgroud)
所有末尾有空格的名称都会发生同样的情况。此时我想知道,如果我已经指定我要在第一个操作中消除 IDENTIFIER 值开头和结尾的所有空格,为什么系统会更新 ID 和 SELLER_NAMES 然后执行此操作?。
只是要指定: IDENTIFIER 列是卖方表的一部分,该表正在从另一个人那里更新,该人从 Excel 文件中导入数据。我收到这个值,我必须规范化信息。我只能阅读 SELLER 表,在回答之前考虑到这一点
我有以下数据集:
CISS_STATUS SVCDAT BRANCD
. 68
. 68
R . 68
R . 68
. 68
. 68
. 22
R 01/01/2013 65
A 01/01/2014 22
A 01/01/2015 32
Run Code Online (Sandbox Code Playgroud)
大约有 500K 条记录和 60 个其他字段,但您明白了。无论如何,我想要做的是基于 SVCDAT(这是一种 VarChar(10) 数据类型)编写一个 WHERE 子句,排除其中没有有效日期的记录(即其中带有点的记录)。
当我尝试类似的事情时:
WHERE convert(datetime,SVCDAT,1) > '1/1/1900'
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
Conversion failed when converting date and/or time from character string.
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时:
WHERE CAST(SVCDAT as smalldatetime) > '1/1/1900'
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
The conversion of a varchar data type to a smalldatetime data type resulted in
an out-of-range value. …
Run Code Online (Sandbox Code Playgroud) 我正在使用 SQL Server 2012。
我有 5 张桌子(我们称它们为 A、B、C、D 和 E)。每个表都包含一个名为 m_id 的列,其中包含 nvarchar(10) 的 id。
我目前运行查询次数低于 5 次(更改表名称)。查看表中是否包含该id。
select m_id from A where m_id = 'some_id'
Run Code Online (Sandbox Code Playgroud)
基本上我想知道 id 是否是 5 个表中的任何一个,如果是,则返回 1,否则如果 5 个表中的任何一个都不存在,则返回 0。
我觉得我目前的做法非常低效。有一个更好的方法吗?
我有一个相当大的表,有 400 列和 100,000 行。当我选择所有列时,查询非常慢(~7500ms)。仅在 3 列上设置了主键。我不关心插入/更新的速度,这个表主要用于读取。我正在阅读有关聚集列存储索引如何完美满足我的要求并提高读取性能的信息。
所以我尝试使用聚集列存储索引,速度几乎相同(~7000ms)。我真的期望有更高的改进。我错过了什么吗?
我想对所有表执行查询,但我需要检查结果。如果我做:
exec sp_MSforeachtable @command1 =
'
DBCC CHECKIDENT(''?'', NORESEED)
'
Run Code Online (Sandbox Code Playgroud)
结果如下:
检查身份信息:当前身份值“35”,当前列值“35”。
DBCC 执行完成。如果 DBCC 打印错误消息,请联系您的系统管理员。
消息 7997,级别 16,状态 1,第 3 行
“DocumentsJobPositions”不包含标识列。
等等。有时没关系,有时我需要进行一些修复,所以我需要每个查询的每个表的名称!
我怎样才能做到这一点?
我在这里有一个字符串,需要将其转换为日期,但问题是它可能采用'DD / MM / YYYY'或'YYYY-MM-DD'格式。
我已经尝试过convert,它仅适用于两种格式之一,但不能同时适用于两种格式:
declare @string nvarchar(255) = '2019-05-21'
declare @table table (date date)
insert into @table
select convert(date, @string, 111) as date
select * from @table
declare @string nvarchar(255) = '21/05/2019'
declare @table table (date date)
insert into @table
select convert(date, @string, 103) as date
select * from @table
Run Code Online (Sandbox Code Playgroud)
以上两种解决方案均导致错误,原因是我使用了其他格式。
有什么方法可以将字符串转换为日期,而不管其采用哪种格式?
我在客户表中有名称的结果
我想查找日志表列中是否存在此名称
我的日志表已更改列将记录名称和 ID,我只想找到名称
select top 100 *
from LogDataTable
where ChangeData like '%'+'select name from customer'+ '%'
Run Code Online (Sandbox Code Playgroud)
但是我没有得到这个查询的结果,我必须做任何改变吗?能做到吗?