我正在尝试确定两个不同查询的相对性能,并且有两种方法可以测量这个:
1.运行两个和每个查询的时间
2.运行两个并从实际执行计划中获取"查询成本"
这是我为查询定时运行的代码...
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1a
SELECT getDate() - @start AS Execution_Time
GO
DBCC FREEPROCCACHE
GO
DBCC DROPCLEANBUFFERS
GO
DECLARE @start DATETIME SET @start = getDate()
EXEC test_1b
SELECT getDate() - @start AS Execution_Time
GO
Run Code Online (Sandbox Code Playgroud)
我得到的是以下内容:
Stored_Proc Execution_Time Query Cost (Relative To Batch)
test_1a 1.673 seconds 17%
test_1b 1.033 seconds 83%
Run Code Online (Sandbox Code Playgroud)
执行时间的结果直接与查询成本的结果相矛盾,但我很难确定"查询成本"实际意味着什么.我最好的猜测是它是Reads/Writes/CPU_Time/etc的集合,所以我想我有几个问题:
有没有明确的来源来解释这项措施的含义?
人们使用什么其他"查询性能"指标,它们的相对优点是什么?
值得注意的是,这是一个中型SQL Server,在MS Server 2003 Enterprise Edition上运行MS SQL Server 2005,具有多个处理器和100多个并发用户.
编辑:
经过一番麻烦后,我设法在该SQL Server上获得了Profiler访问权限,并且可以提供额外的信息(支持查询成本与系统资源相关,而不是执行时间本身...)
Stored_Proc …Run Code Online (Sandbox Code Playgroud) sql sql-server optimization sql-server-2005 sql-execution-plan
我有一个日期变量,我想把它转换为它的第一天,
我怎样才能做到这一点:
select *
from tableName
where SESSION_START_DATE_TIME > To_Date ('12-Jan-2012 16:00', 'DD-MON-YYYY hh24:mi' )
Run Code Online (Sandbox Code Playgroud)
SESSION_START_DATE_TIME的格式为'12/01/2012 13:16:32.000'
我试过了 where To_Date (SESSION_START_DATE_TIME, 'DD-MON-YYYY hh24:mi') > To_Date ('12-Jan-2012 16:00', 'DD-MON-YYYY hh24:mi' )
但无论我尝试什么,我都会得到错误:
SQL command not properly formed
我已将MS SQL Server 2005数据库备份并还原到新服务器.
重新创建登录,用户和用户权限的最佳方法是什么?
在SQL Server 2000的企业管理器上,我能够编写登录脚本,为用户编写脚本并单独编写用户权限脚本.然后,我可以一个接一个地运行,唯一剩下的手动步骤是设置登录密码(出于安全原因,这不是脚本)
这在SQL Server 2005的Management Studio中似乎不可能,使一切都非常繁琐和耗时.(我最终必须编写整个数据库的脚本,从新数据库中删除所有登录和用户,运行脚本,然后搜索错误消息的混合,以查看哪些有效,哪些无效.)
有没有人对此有任何经验和建议?
一个性能如何调优SQL查询?
可以使用哪些技巧/工具/概念来更改SQL查询的性能?
绩效如何量化?
需要注意什么?
主持人请注意:
这是一个很大的问题,我应该把它分成多个问题吗?
对响应者的注意: 因为这是一个很大的问题,请参考其他问题/答案/文章,而不是写冗长的解释.
客户端在执行存储过程时报告了非常奇怪的行为的重复实例.
它们具有运行易失性数据集的缓存转置的代码.如果出现以下情况,则会编写存储过程以按需重新处理数据集:
1.数据集自上次重新处理后已更改
2. 数据集已更改5分钟
(第二个条件是在更改期间停止大量重复重新计算.)
这工作好几个星期,SP花了1-2秒完成重新处理,它只在需要时才这样做.然后...
这已经重复了很多次.SP突然"停止工作",永不返回,客户端超时.(我们尝试通过管理工作室运行它,并在15分钟后取消查询.)
然而,每次我们重新编译SP时,它都会突然再次运行.
我还没有在适当的EXEC声明中尝试过WITH RECOMPILE,但我并不特别想这样做.它每小时被调用一百次,通常什么都不做(它只会每天重新处理数据几次).如果可能的话,我想避免重新编译什么是相对复杂的SP的开销"只是为了避免"不应该"发生的事情......
干杯,
Dems.
编辑:
pseduo代码如下:
选择是"不漂亮",但是当在线执行时,它们立即执行.包括SP何时拒绝完成.分析器显示它是SP"停止"的INSERT
SP没有参数,sp_lock没有显示阻止进程的任何内容.
我执行两个查询并得到奇怪的结果.我想知道为什么会这样.
现在查询:
SELECT * FROM TABLE_A a, TABLE_B b, TABLE_C c
WHERE a.a = b.a (+)
AND b.c = c.c
AND a.a = 123;
Run Code Online (Sandbox Code Playgroud)
结果为空.
SELECT COUNT(*) FROM TABLE_A a, TABLE_B b, TABLE_C c
WHERE a.a = b.a (+)
AND b.c = c.c
AND a.a = 123;
Run Code Online (Sandbox Code Playgroud)
结果是1.
它实际上是具有不同返回值的相同查询.
表A包含'a'字段= 123的
行.表B不包含aa = ba的行
如何为同一查询返回任何内容或1?
更新:
当我这样做的时候
SELECT COUNT(*) FROM TABLE_A a, TABLE_B b, TABLE_C c
WHERE a.a = b.a (+)
AND b.c = c.c (+)
AND a.a = 123; …Run Code Online (Sandbox Code Playgroud) 我有一个表格如下(简化示例,我们有超过60个字段):
CREATE TABLE "fact_table" (
"pk_a" bigint NOT NULL ENCODE lzo,
"pk_b" bigint NOT NULL ENCODE delta,
"d_1" bigint NOT NULL ENCODE runlength,
"d_2" bigint NOT NULL ENCODE lzo,
"d_3" character varying(255) NOT NULL ENCODE lzo,
"f_1" bigint NOT NULL ENCODE bytedict,
"f_2" bigint NULL ENCODE delta32k
)
DISTSTYLE KEY
DISTKEY ( d_1 )
SORTKEY ( pk_a, pk_b );
Run Code Online (Sandbox Code Playgroud)
该表以高基数维度分布.
该表按一对按时间顺序递增的字段排序.
该表包含超过20亿行,并使用~350GB的磁盘空间,均为"每个节点".
我们的每小时管理包括更新一些最近的记录(在表的最后0.1%内,基于排序顺序)并插入另外的100k行.
无论我们选择什么样的机制,VACUUMing表都变得过于繁琐:
- sort步骤需要几秒钟
- merge步骤需要6个小时
我们可以看到SELECT * FROM svv_vacuum_progress;,所有20亿行都被合并了.即使前99.9%完全不受影响. …
大家认为什么是SQL中有时间限制的层次结构的最佳表示?
我的意思是:
- 在任何给定的日期,你有一个普通的树层次结构
- 这个层次结构可以从一天到
另一个变化- 每个孩子在任何给定的日期仍然只有一个父
第1天......
Business
|
|-Joe
| |-Happy
| |-Sneezy
| |-Doc(*)
|
|-Moe
|-Bashfull
|-Sleepy
Run Code Online (Sandbox Code Playgroud)
第2天......
Business
|
|-Joe
| |-Happy
| |-Sneezy
|
|-Moe
|-Doc(*)
|-Bashfull
|-Sleepy
Run Code Online (Sandbox Code Playgroud)
孩子可以在任何时候第一次加入层次结构,或者完全离开层次结构.(例如,新员工和退休员工.)
主要考虑因素:
我知道我现在是怎么做的,但我对其他人怎么做可能很感兴趣:)
编辑
我天真地假设了一些考虑,所以会更明确......
通用性质是最重要的(仅形成通用关系模式的一部分),结合易于使用的驱动报告(对于任何日期范围的树的任何部分)以及可靠更新的能力.
在stackoverflow的这个问题中,接受的答案涉及多次重复相同的代码片段.根据我的经验,许多人努力通过各种方式以各种方式封装代码片段来减少这种情况;
- 可维护性(更改的地方更少)
- 可读性(一次读取代码,然后每次都是"别名")
- 等等
使用链接问题中的代码,您将如何开始减少相同代码片段的重复?或者你会原样离开吗?
(不使用替代逻辑,但坚持使用REPLACE等,只是改变相同逻辑的现状.)
Select Case
When CharIndex('.', Replace(URL, 'www.','')) > 0 then
Left(Replace(URL, 'www.',''), CharIndex('.',Replace(URL, 'www.',''))-1)
Else
Replace(URL, 'www.','')
End as [CleanURL]
From dbo.YourTable
Run Code Online (Sandbox Code Playgroud)
(接受的答案已更改,因此我将代码示例复制到此处.)
编辑
只是为了澄清,我认为我已经引起了混乱.
这不是:
- 如何封装这整段代码以便重复使用?
但它更确切地说:
- 如何减少这段代码中的冗余?
sql ×10
sql-server ×4
oracle ×3
backup ×1
coding-style ×1
database ×1
hierarchy ×1
optimization ×1
performance ×1
reporting ×1
ssms ×1
t-sql ×1