小编Mat*_*lie的帖子

衡量查询效果:"执行计划查询成本"与"拍摄时间"

我正在尝试确定两个不同查询的相对性能,并且有两种方法可以测量这个:
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的集合,所以我想我有几个问题:

  1. 有没有明确的来源来解释这项措施的含义?

  2. 人们使用什么其他"查询性能"指标,它们的相对优点是什么?


值得注意的是,这是一个中型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

50
推荐指数
4
解决办法
9万
查看次数

Oracle,将日期时间作为其当月的第一天

我有一个日期变量,我想把它转换为它的第一天,

  • 例如:10/10/2010 - > 01/10/2010
  • 例如:31/07/2010 - > 01/07/2010

sql oracle

24
推荐指数
3
解决办法
6万
查看次数

Oracle:如何在where子句中按日期和时间进行过滤

我怎样才能做到这一点:

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

sql oracle

13
推荐指数
4
解决办法
16万
查看次数

将备份还原到其他服务器 - 用户权限

我已将MS SQL Server 2005数据库备份并还原到新服务器.

重新创建登录,用户和用户权限的最佳方法是什么?

在SQL Server 2000的企业管理器上,我能够编写登录脚本,为用户编写脚本并单独编写用户权限脚本.然后,我可以一个接一个地运行,唯一剩下的手动步骤是设置登录密码(出于安全原因,这不是脚本)

这在SQL Server 2005的Management Studio中似乎不可能,使一切都非常繁琐和耗时.(我最终必须编写整个数据库的脚本,从新数据库中删除所有登录和用户,运行脚本,然后搜索错误消息的混合,以查看哪些有效,哪些无效.)

有没有人对此有任何经验和建议?

sql sql-server backup ssms database-restore

10
推荐指数
1
解决办法
2万
查看次数

性能调优SQL - 如何?

一个性能如何调优SQL查询?

  • 可以使用哪些技巧/工具/概念来更改SQL查询的性能?
  • 如何量化收益?
  • 需要注意什么?


可以使用哪些技巧/工具/概念来更改SQL查询的性能?

  • 使用索引?他们如何在实践中工作?
  • 归一化与非归一化数据?什么是性能与设计/维护权衡?
  • 预处理中间表?使用触发器或批处理作业创建?
  • 重构查询以使用临时表,子查询等?
  • 将复杂查询分成多个和UNION结果?
  • 还要别的吗?


绩效如何量化?

  • 读?
  • CPU时间?
  • 不同版本一起运行时的"%Query Cost"?
  • 还要别的吗?


需要注意什么?

  • 是时候制定执行计划了吗?(存储过程与内联查询)
  • 存储过程被迫重新编译
  • 对小数据集进行测试(查询是线性扩展还是平方律等?)
  • 缓存先前运行的结果
  • 优化"正常情况",但伤害"最坏情况"
  • 什么是"参数嗅探"?
  • 还要别的吗?


主持人请注意: 这是一个很大的问题,我应该把它分成多个问题吗?

对响应者的注意: 因为这是一个很大的问题,请参考其他问题/答案/文章,而不是写冗长的解释.

sql performance

10
推荐指数
1
解决办法
1965
查看次数

MS SQL Server 2005 - 存储过程"自发中断"

客户端在执行存储过程时报告了非常奇怪的行为的重复实例.

它们具有运行易失性数据集的缓存转置的代码.如果出现以下情况,则会编写存储过程以按需重新处理数据集:
1.数据集自上次重新处理后已更改
2. 数据集已更改5分钟

(第二个条件是在更改期间停止大量重复重新计算.)


这工作好几个星期,SP花了1-2秒完成重新处理,它只在需要时才这样做.然后...

  • SP突然"停止工作"(它只是继续运行而且从未返回)
  • 我们以微妙的方式改变了SP,它再次起作用
  • 几天后它又停止了工作
  • 然后有人说"我们以前见过这个,只是重新编译SP"
  • 在没有更改代码的情况下,我们重新编译了SP,并且它工作正常
  • 几天后它又停止了工作


这已经重复了很多次.SP突然"停止工作",永不返回,客户端超时.(我们尝试通过管理工作室运行它,并在15分钟后取消查询.)

然而,每次我们重新编译SP时,它都会突然再次运行.

我还没有在适当的EXEC声明中尝试过WITH RECOMPILE,但我并不特别想这样做.它每小时被调用一百次,通常什么都不做(它只会每天重新处理数据几次).如果可能的话,我想避免重新编译什么是相对复杂的SP的开销"只是为了避免"不应该"发生的事情......


  • 有谁之前经历过这个吗?
  • 有没有人对如何克服它有任何建议?


干杯,
Dems.


编辑:

pseduo代码如下:

  • 从table_x中读取"a"
  • 从table_x中读取"b"
  • 如果(a <b)返回
  • 开始交易
  • 删除table_y
  • INSERT INTO table_y <3选择联合在一起>
  • 更新table_x
  • 提交交易

选择是"不漂亮",但是当在线执行时,它们立即执行.包括SP何时拒绝完成.分析器显示它是SP"停止"的INSERT

SP没有参数,sp_lock没有显示阻止进程的任何内容.

sql t-sql sql-server stored-procedures sql-server-2005

8
推荐指数
1
解决办法
2836
查看次数

矛盾的Oracle查询结果

我执行两个查询并得到奇怪的结果.我想知道为什么会这样.
现在查询:

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)

sql oracle

8
推荐指数
1
解决办法
231
查看次数

DELETE和INSERT之后的Redbackift(AWS)上的VACUUM

我有一个表格如下(简化示例,我们有超过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 amazon-web-services amazon-redshift

8
推荐指数
1
解决办法
5702
查看次数

时间绑定层次结构的最佳关系数据库表示

大家认为什么是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)

孩子可以在任何时候第一次加入层次结构,或者完全离开层次结构.(例如,新员工和退休员工.)

主要考虑因素:

  • 更新层次结构
  • 查看日期范围内的整个层次结构
  • 报告层次结构中的整个子树
  • 报告日期范围内的整个子树

我知道我现在是怎么做的,但我对其他人怎么做可能很感兴趣:)

编辑

我天真地假设了一些考虑,所以会更明确......

  • 每个"团队"或"人员"在其他地方的维度表中都会有唯一的ID
  • 其他事实表将使用这些ID(例如,存储性能指标)
  • 该结构需要促进跨日期范围的历史报告
  • 使用ETL或触发器来维护替代结构是一种选择

通用性质是最重要的(仅形成通用关系模式的一部分),结合易于使用的驱动报告(对于任何日期范围的树的任何部分)以及可靠更新的能力.

sql database reporting hierarchy

5
推荐指数
1
解决办法
1942
查看次数

减少SQL代码中的冗余/重复

在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 sql-server coding-style

5
推荐指数
1
解决办法
1903
查看次数