我有一个包含不同长度整数的 VARCHAR 列的数据库。我想对它们进行排序,所以 10 在 9 之后,而不是 1,并且 70A 在 70 之后。我可以使用WHERE 子句中的PATINDEX()、CTE 和 CASE 语句来做到这一点。
但是,我想知道是否有不需要的整理。
在 Microsoft SQL 服务器中,如何使用 T-SQL 添加/更改现有表列的默认值?
这个问题必须在这个网站上:)
禁止在视图中使用 ORDER BY,正如我所理解的,因为在使用此视图时可能存在多个 order by。
例如TOP 99.999999 PERCENT,我知道有一些方法可以绕过此限制,但我想知道最佳实践是什么,而不是如何破解它。
所以,如果我想在我的数据库中创建供个人使用的视图,这意味着我想连接到数据库并只看到固定和排序的数据,如果我不能订购视图,我该怎么做?
目前在我的 SQL Server 数据库中,我对TOPhack有意见,我经常使用它们,但感觉不对。
我有一个大的用户定义的表类型变量,它有 129 列。我将一次在这个表变量中存储大约 2000-3000 条记录,并将其传递给各种存储过程和函数以获取附加数据并进行修改。然后,这些附加数据和新修改将存储在相同类型的新表变量中,并通过OUTPUT参数返回到源存储过程。(这是因为表类型参数只能作为READONLY.)
这是我的伪代码:
SP1
@tmp tableType
{
INSERT @tmp EXEC
SP2 (@tmp)
INSERT @tmp EXEC
SP3 (@tmp)
}
Run Code Online (Sandbox Code Playgroud)
我应该使用 a@table_variable还是#temp_table?
有没有人使用过 using 的调整选项TF834 large page allocations。我只是在阅读一篇关于它的 MS 文章,想知道是否有人使用过它并看到了性能提升。有什么需要注意的事项、提示、陷阱吗?
服务器是 Windows 2008 64 位、128 GB RAM、4 CPU 8 核超线程(总共 64 核)SQL2005 服务器。我希望调整服务器以更好地使用其规范,而不仅仅是使用当前在其上完成的默认 SQL 安装。任何额外的提示将受到欢迎。
最近,我试图创建一个包含通用测试数据对于一些大型的串这里的一个问题。似乎我曾经知道一种乘法字符串的方法。但是,我已经记不起语法了。
我正在寻找类似的东西:
SELECT 'A' + ('a' * 1000) + 'ha!'
Run Code Online (Sandbox Code Playgroud)
想出“Aaaaaaaaaaaaaaha!” (嗯,当然要长得多。)
这在 T-SQL 中可能吗?(或者我在想其他语言吗?)另外,还有其他技术可以生成大字符串吗?
当您完成查询/存储过程/函数的编写后,快速获取一些性能参数的最有用的方法是什么?您是否运行查询并查看实际执行计划?如果是这样,您要寻找的东西是什么?显然表/索引扫描是位命中,但还有什么?
在阅读我的 70-433 试卷时,我想到了一些我认为不起作用的东西,但我相信它确实有效。这段话是这样写的:
该列还必须标记为PERSISTED,这意味着 SQL Server 将计算列的表达式的结果物理存储在数据行中,而不是每次在查询中引用时计算它。
由此我明白了两件事:
读完后,我觉得这有点奇怪,因为我在以前的项目中设法在非持久化列上创建了索引。
如何为未持久化的东西创建索引,从长远来看这是否有害?
为了证明这一点,我运行了以下 SQL 语句:
CREATE TABLE testTable
(
ID INT IDENTITY(1,1) PRIMARY KEY,
telephone VARCHAR(14),
c_areaCode AS (SUBSTRING(telephone,0,5)),
cp_areaCode AS (SUBSTRING(telephone,0,5)) PERSISTED
)
INSERT INTO testTable VALUES('09823 000000');
INSERT INTO testTable VALUES('09824 000000');
INSERT INTO testTable VALUES('09825 000000');
CREATE NONCLUSTERED INDEX IX_NotPersisted ON testTable(c_areaCode);
CREATE NONCLUSTERED INDEX IX_Persisted ON testTable(cp_areaCode);
Run Code Online (Sandbox Code Playgroud)
然后运行以下查询:
DBCC FREEPROCCACHE
DBCC FREESYSTEMCACHE('ALL');
DBCC DROPCLEANBUFFERS
GO
SELECT cp_areaCode FROM testTable;
GO
SELECT c_areaCode …Run Code Online (Sandbox Code Playgroud) 尝试运行我的维护计划时,我收到以下错误:
执行查询“”失败,出现以下错误:“无法重新组织表“”上的索引“”(分区 1),因为禁用了页级锁定。”
我们目前在此索引上启用了行级锁定。我可以启用页面级别锁定,但我不确定影响是什么。
我的问题是:这两种锁定方案有什么区别,它们在现实世界(生产中)的后果是什么?
环境:
我们有两台运行 SQL Server 2005 的 32 位 Windows Server 2003 R2 机器。硬件配置是相同的服务器,具有 Xeon 5160 CPU、4GB RAM 和 13GB RAID0。未启用 AWE 和 /3GB 标志。
服务器是使用预定义的安装清单并排设置的,并且两台机器上安装的所有软件都是相同的。
我们知道要检查的每个 SQL 服务器安装设置和补丁级别都是相同的。一个区别是 TEMPDB 在快速机器上为 400MB,而在慢速机器上为 1.2GB。但是,在这两种情况下,我们都没有看到任何 TEMPDB 分配发生。
问题:
有一个存储过程,一个运行 2 秒,另一个运行 15 分钟。在额外的 15 分钟内,几乎没有磁盘活动,也没有内存使用变化,但一个 CPU 内核始终保持 100% 固定。
即使从一个数据库备份并恢复到另一个数据库,这种行为仍然存在。
由于它是一个存储过程,因此活动监视器和分析器不会向我们显示有关此高 CPU 活动在存储过程中的何处发生的任何详细信息。
问题:
我们还应该看什么?
跟进:
缓慢发生在以下游标定义的 FETCH NEXT 语句中:
DECLARE C CURSOR FOR
SELECT X, Y
FROM dbo.A
WHERE X NOT IN (SELECT X FROM dbo.B)
AND Z <=0
... …Run Code Online (Sandbox Code Playgroud) sql-server ×10
performance ×3
collation ×1
ddl ×1
locking ×1
maintenance ×1
natural-sort ×1
order-by ×1
query ×1
sorting ×1
t-sql ×1
view ×1