我有以下代码可行:
foreach ($db in $svr.Databases |
where-object {
$_.name -eq "testDB"
-or $_.name -eq "master"
-or $_.name -eq "model"
-or $_.name -eq "msdb" } )
{
write-output $db.name
}
Run Code Online (Sandbox Code Playgroud)
这是一个更干净的方法吗?
就像是:
foreach ($db in $svr.Databases |
where-object {$_.name -in "testDB, master, model, msdb" } )
{
write-output $db.name
}
Run Code Online (Sandbox Code Playgroud) 我正在使用遗留数据库将GUID值存储为varchar(36)数据类型:
CREATE TABLE T_Rows (
RowID VARCHAR(36) NOT NULL PRIMARY KEY,
RowValue INT NOT NULL
)
INSERT T_Rows (RowID, RowValue) VALUES (NEWID(), 1)
Run Code Online (Sandbox Code Playgroud)
我认为将GUID存储为唯一标识符会更好,因为它只有16个字节而不是36个字节.
将GUID存储为varchar有什么好处吗?
我想做一个UPSERT的SELECT/INSERT版本.以下是现有代码的模板:
// CREATE TABLE Table (RowID INT NOT NULL IDENTITY(1,1), RowValue VARCHAR(50))
IF NOT EXISTS (SELECT * FROM Table WHERE RowValue = @VALUE)
BEGIN
INSERT Table VALUES (@Value)
SELECT @id = SCOPEIDENTITY()
END
ELSE
SELECT @id = RowID FROM Table WHERE RowValue = @VALUE)
Run Code Online (Sandbox Code Playgroud)
将从许多并发会话中调用该查询.我的性能测试表明它会在特定负载下持续抛出主键违规.
是否有一种高并发方法可以使此查询保持性能,同时仍然避免插入已存在的数据?
t-sql sql-server concurrency design-patterns sql-server-2008
我的公司正在使用SQL Server 2008 Express开发一个开发项目.我们计划在主表中存储的数据量将快速超过Express的4GB大小限制.我们可以用SQL Server 2008 R2购买自己一段时间,但最终我们也将超过10GB的限制.
在购买标准版许可证之前,团队负责人希望听取所有可用选项.我们公司的专业知识是SQL Server和Oracle,因此使用MySQL或PostgresSQL将被视为最后的手段.
我能想到的唯一选择是将主表水平划分为独立的不同数据库的设计.此外,还有一个中央数据库来存储有关数据存储位置的信息.
例如,2008的所有表数据将存储在DB_2008中,DB_2009中的2009数据中,依此类推.元数据表可能如下所示:
PKStartDate PKEndDate DBName
----------- ---------- ----------
2008-01-01 2008-12-31 DB_2008
2009-01-01 2009-12-31 DB_2009
2010-01-01 2010-12-31 DB_2010
Run Code Online (Sandbox Code Playgroud)
此表将用于确定存储过程的数据的数据库位置.我们的大多数代码已经使用参数化的动态SQL,因此实现起来并不困难.
有没有人曾经这样做过?
这种类型的设计是否有既定的模型,还是只是一个可怕的想法?
sql-server ×4
t-sql ×2
concurrency ×1
database ×1
guid ×1
performance ×1
powershell ×1
smo ×1
sql ×1