我们有一个每晚运行的存储过程,反过来启动了许多其他程序.其中一些程序在逻辑上可以与其他一些程序并行运行.
WAITFOR DELAY?目前我们还在使用SQL Server 2000.
作为旁注,这很重要,因为主程序是响应从大型机系统完成从服务器到服务器的数据而启动的.大型机转储每晚大约需要2个小时,我们无法控制它.因此,我们一直在努力寻找缩短处理时间的方法.
我有一组呼叫详细记录,根据这些记录,我应该确定每个系统每小时的平均并发活动呼叫数(精度为一分钟).如果我查询下午7点到晚上8点,我应该看到该小时内(每个系统)的小时平均并发呼叫(平均每分钟的并发呼叫).
所以,我需要一种方法来检查7:00-7:01,7:01-7:02等活动呼叫的数量,然后平均这些数字.如果呼叫的时间和持续时间落在正在检查的当前分钟内,则认为呼叫处于活动状态.
更难的是它需要跨越SQL 7.0和SQL 2000(2000中的某些功能在7.0中不可用,例如GetUTCTime()),如果我能让2000工作,我会很高兴.
我考虑在被检查的小时内循环分钟(60)并添加落在该分钟之间的呼叫计数,然后以某种方式交叉引用持续时间以确保在晚上7:00开始并且持续时间为300秒在7:04显示活跃,但我无法想象如何解决问题.我试图找出一种方法来对每一次电话进行加权,特别是那一分钟会告诉我这段时间内呼叫是否有效,但无法提出有效的解决方案.
这里的数据类型与我要查询的数据类型相同.我没有对模式的任何控制(除了可能转换数据并插入具有更合适的数据类型的另一个表之外).我提供了一些我知道有并发活动调用的示例数据.
CREATE TABLE Records(
seconds char(10),
time char(4),
date char(8),
dur int,
system int,
port int,
)
--seconds is an stime value. It's the difference of seconds from UTC 1/1/1970 00:00:00 to the current UTC time, we use it as an identifier (like epoch).
--time is the time the call was made.
--date is the day the call was made.
--dur is the duration of the call in seconds.
--system is the system …Run Code Online (Sandbox Code Playgroud) 我正在SQL Server 2000(和2005)中构建一个视图,我注意到连接语句的顺序极大地影响了查询的执行计划和速度.
select sr.WTSASessionRangeID,
-- bunch of other columns
from WTSAVW_UserSessionRange us
inner join WTSA_SessionRange sr on sr.WTSASessionRangeID = us.WTSASessionRangeID
left outer join WTSA_SessionRangeTutor srt on srt.WTSASessionRangeID = sr.WTSASessionRangeID
left outer join WTSA_SessionRangeClass src on src.WTSASessionRangeID = sr.WTSASessionRangeID
left outer join WTSA_SessionRangeStream srs on srs.WTSASessionRangeID = sr.WTSASessionRangeID
--left outer join MO_Stream ms on ms.MOStreamID = srs.MOStreamID
left outer join WTSA_SessionRangeEnrolmentPeriod srep on srep.WTSASessionRangeID = sr.WTSASessionRangeID
left outer join WTSA_SessionRangeStudent stsd on stsd.WTSASessionRangeID = sr.WTSASessionRangeID
left outer join WTSA_SessionSubrange ssr …Run Code Online (Sandbox Code Playgroud) sql-server optimization join sql-server-2005 sql-server-2000
在尝试帮助应用开发团队在SQL 2000服务器(来自单独的应用服务器上的一堆Java应用程序)上遇到性能问题的过程中,我运行了一条SQL跟踪并发现所有对数据库的调用都充满了API Server Cursor语句(sp_cursorprepexec,sp_cursorfetch,sp_cursorclose).
看起来他们正在指定一些强制使用服务器端游标的连接字符串属性,一次只检索128行数据:(来自http://msdn.microsoft.com/en-us/library/Aa172588)
当API游标属性或属性设置为默认值以外的任何值时,SQL Server的OLE DB提供程序和SQL Server ODBC驱动程序使用API服务器游标而不是默认结果集.每次调用获取行的API函数都会生成到服务器的往返,以从API服务器游标中获取行.
更新:有争议的连接字符串是JDBC连接字符串参数selectMethod=cursor(它启用我们上面讨论过的服务器端游标)与替代字符串selectMethod=direct.他们一直使用selectMethod=cursor来自所有应用程序的标准连接字符串.
从我的DBA角度来看,这只是令人讨厌(它使用无用的垃圾混乱了跟踪),并且(我推测)导致许多额外的app-to-SQL服务器往返,降低了整体性能.
他们显然做了测试改变(只是大约60个不同的应用程序连接中的一个),selectMethod=direct但遇到了一些问题(我没有详细说明),并担心应用程序中断.
所以,我的问题是:
selectMethod=cursor较低的应用程序性能,正如我试图争论的那样?(通过增加已经具有非常高的查询/秒的SQL服务器上所需的往返次数)selectMethod=JDBC连接上是应用程序透明设置吗?如果我们改变它,这会打破他们的应用吗?cursorvs direct?也交叉发布到SF.
编辑:收到实际技术细节,保证对标题,问题和标签进行重大编辑.
编辑:添加赏金.还为SF问题添加了赏金(这个问题主要集中在应用程序行为上,SF问题主要集中在SQL性能上.)谢谢!!
我有两个查询与UNION ALL1组合:
--Query 1
SELECT Flavor, Color
FROM Friends
Run Code Online (Sandbox Code Playgroud)
--Query 2
SELECT Flavor,
(SELECT TOP 1 Color
FROM Rainbows
WHERE Rainbows.StrangerID = Strangers.StrangerID
ORDER BY Wavelength DESC
) AS Color
FROM Strangers
Run Code Online (Sandbox Code Playgroud)
当然,这两者都可以单独工作,但当与以下内容结合使用时UNION ALL:
SELECT Flavor, Color
FROM Friends
UNION ALL
SELECT Flavor,
(SELECT TOP 1 Color
FROM Rainbows
WHERE Rainbows.StrangerID = Strangers.StrangerID
ORDER BY Wavelength DESC
) AS Color
FROM Strangers
Run Code Online (Sandbox Code Playgroud)
查询失败并显示错误:
如果语句包含UNION运算符,则消息104,级别15,状态1,行3 ORDER BY项必须出现在选择列表中.
如何在UNION ALL的语句中使用ORDER BY?
CREATE TABLE …Run Code Online (Sandbox Code Playgroud) 我正在使用SQL 2000数据库.
我正在使用一个数据库,在该数据库中我无法更改表或存储过程的类型.我需要调用的一个存储过程需要一个'text'参数.我可以进入文本字段,但我无法确定将其存储在变量中或以其他任何方式将其传递到存储过程中?
如果我尝试创建一个文本变量,SQL将不会让我 - 如果我将它转换为varchar我只从文本字段中获取第一个字符.
任何可以解决这个问题的技巧都值得赞赏!谢谢!
我需要创建一个包含日期范围的临时表,以及一些包含占位符值(0)以供将来使用的列.我需要的日期是$ startDate和$ endDate之间每个月的第一天,这些变量可能相隔数年.
我原来的sql语句看起来像这样:
select dbo.FirstOfMonth(InsertDate) as Month, 0 as Trials, 0 as Sales
into #dates
from customer
group by dbo.FirstOfMonth(InsertDate)
Run Code Online (Sandbox Code Playgroud)
"FirstOfMonth"是一个用户定义的函数,它完全按照它所说的做,返回当月的第一天所提供的日期,时间恰好是午夜.
这几乎完全是我所需要的,直到我发现我的日期偶尔会出现间隙,我有几个月没有记录插入日期.由于我的结果仍然缺少几个月,我需要一个不同的方法.
我已经向存储过程添加了以下声明,预计它们需要我需要的日期范围...
declare $startDate set $startDate = select min(InsertDate) from customer
declare $endDate set $endDate = select max(InsertDate) from customer
Run Code Online (Sandbox Code Playgroud)
......但我不知道该怎么做.
我知道这个问题与这个问题类似,但是坦率地说,这个答案已经过去了(我不经常使用SQL,当我这样做时,它往往是在旧版本的SQL Server上)并且有一些小问题差点让我失望.
在SQLServer 2000中进行分页查询的最有效方法是什么?
其中"分页查询"相当于在MySQL中使用LIMIT语句.
编辑:在这种情况下,存储过程是否可以比任何基于集合的查询更有效?
我nvarchar(50)在SQL Server 2000表中有一个列定义如下:
TaskID nvarchar(50) NULL
Run Code Online (Sandbox Code Playgroud)
我需要使用该NEWID()函数随机SQL GUID填充此列(我无法将列类型更改为uniqueidentifier).
我试过这个:
UPDATE TaskData SET TaskID = CAST(NEWID() AS nvarchar)
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误:
消息8115,级别16,状态2,行1算术溢出错误将表达式转换为数据类型nvarchar.
我也尝试过:
UPDATE TaskData SET TaskID = CAST(NEWID() AS nvarchar(50))
Run Code Online (Sandbox Code Playgroud)
但后来出现了这个错误:
消息8152,级别16,状态6,行1字符串或二进制数据将被截断.
我不明白为什么这不起作用,但这样做:
DECLARE @TaskID nvarchar(50)
SET @TaskID = CAST(NEW() AS nvarchar(50))
Run Code Online (Sandbox Code Playgroud)
我也试过CONVERT(nvarchar, NEWID()),CONVERT(nvarchar(50), NEWID())但得到了同样的错误.
更新:
好吧,我的视力正在上升,桌子上的柱子大小nvarchar(32)不是50.最浪费的时间浪费道歉并感谢所有的答案.
我需要将Datetime字段转换为特定格式的INT类型.例如,我想
2000-01-01 00:00:00.000转换为20010101.
在查询中进行比较以进行比较的最高效方法是什么?
就像是:
DATEPART(year, orderdate) * 10000 + DATEPART(month, orderdate) * 100 +
DATEPART(day, orderdate)
Run Code Online (Sandbox Code Playgroud)
要么
cast(convert(char(8), orderdate, 112) as int)
Run Code Online (Sandbox Code Playgroud)
什么是最高效的方法?
sql-server-2000 ×10
sql-server ×6
sql ×5
t-sql ×5
algorithm ×1
cursor ×1
jdbc ×1
join ×1
limit ×1
optimization ×1
paging ×1
selectmethod ×1
sql-order-by ×1
sql-server-7 ×1
union ×1
union-all ×1