我正在使用 SQL2005 并针对它们调用查询 simila 对此
declare @art table (id int primary key, naziv varchar(35) null, sifra varchar(15) null, jm int null);
insert into @art
select id, left(naziv,35), left(sifra,15), jm from art a
where (a.id = @art_id@ or @art_id@ = 0 )
Select
s.art_id
,sum(kol) as kol
,sum(kol*mpc) as MPCI
/*--and meny others --/
from doc d
inner join dokumenti dk on (d.tip = dk.tip)
inner join sdo s on (d.id=s.doc_id)
where
d.datum between @do_datuma@ and @do_datuma@
and dk.prodaja = 1 …Run Code Online (Sandbox Code Playgroud) 我想加快以下代码
delete from ssn_sdo
where
(art_id=@art_id and skl_id=@skl_id and @level=0 )
or (art_id=@art_id and skl_id=@skl_id and @level=1 and tip=@tip)
or (art_id=@art_id and skl_id=@skl_id and doc_id = @doc_id)
Run Code Online (Sandbox Code Playgroud)
我的服务器是 MS SQL-Server 2005。
art_id,skl_id和doc_id是整数,而tip是varchar(10)类型。
我想在ssn_sdo表上创建一个索引,所以这个删除会更快。
我正在考虑做的是制作三个索引,每个索引都适用于每种情况:
doc_id (ASC), art_id (ASC), skl_id (ASC)
skl_id (ASC), art_id (ASC), tip (ASC)
skl_id (ASC), art_id (ASC),
Run Code Online (Sandbox Code Playgroud)
或者有没有更好的方法来制作一个包含所有三种情况的索引。
我对索引很小心,因为我不想减慢此表中的插入速度。
performance sql-server-2005 database-design sql-server index-tuning
对于一份报告,我正在查询用户假设必须根据百分比选择 TOP 值或固定行数。
我有两个想法
根据传递的参数调用两个不同的子存储过程。
if @param ='percent'
begin
exec sp_data_TOP_by_Percent
end
if @param ='perRow'
begin
exec sp_data_TOP_by_PerRow
end
Run Code Online (Sandbox Code Playgroud)
另一个想法是使动态 TSQL 查询像这样
declare @command nchar(max)
select @command = 'select top(10) '
+ case @param
when 'percent' then percent
else ' '
end
+ ' * '
+ 'from table
order by 1';
exec sp_executesql @command
Run Code Online (Sandbox Code Playgroud)
像这样的事情有第三种解决方案吗?
什么是更好的方法?第一个避免动态 TSQL,但在两个地方更难维护代码。我使用 MSSQL2005 作为数据库。
我有两个 SQL Server 之间的事务复制。出于测试目的,我在订阅者处删除了许多仍然存在于发布者处的记录。
我现在知道,如果有人在发布者处更新或删除了我的订阅者上不存在的一些记录,那么我的复制将会崩溃。
我知道我也可以在分发服务器上过滤数据,但这意味着重新初始化我的订阅者,这意味着通过慢速链接传输近 40GB。
因此,当我测试我订阅的数据库时,我希望限制用户只能在发布者端更新或删除记录。我的源表有一个日期字段,我想根据日期限制更新或删除。
为此使用触发器还是约束更好?
如何尽可能避免记录锁定?
我的一个存储过程的执行时间很长(平均大约 4 到 7 分钟)。我想让它运行得更快。
我正在查看执行计划,有两件事占了大部分成本。第一个代表成本的 68%,其中一个主表的“聚集索引扫描”用于报告。该表有两列的主键和 2.000.000 条记录。
第二个最苛刻的任务代表了“合并连接”(左外连接)成本的 26% 。这是我上面提到的通过外键连接到上表中两列主键之一的表。
我检查了这些表的索引物理统计和索引状况良好。
我该怎么做才能提高此存储过程的性能?我需要在这些表上创建新索引吗?将set transaction isolation level read uncommitted声明有助于提高性能?
按百分比范围对记录进行分组的更简单方法是什么。
这是我试图完成的
Select top percents between 50 and 75 * from myTable order by PKI
Run Code Online (Sandbox Code Playgroud)
这是我这样做的方式,但我觉得它云要容易得多
select
top(25) percent
*
from myTable
where id not in (
select
top(25) percent
ID
from myTable
order by PKI
)
order by PKI
Run Code Online (Sandbox Code Playgroud)
这应该是我表的前 50-75% 吗?
有没有更好(更好)的方法来做到这一点。
我的故事是,我现在作为管理员工作了将近 10 年,我处理 SQL Server 和其他 IT 方面的工作,我的大部分知识都是通过阅读书籍、处理问题以及询问和阅读这样的网站来自学的。现在我想通过去、学习和尝试通过微软官方考试和计划来循环和证明这一点。我应该从哪里开始,我需要寻找什么样的诅咒和考试。我很困惑我能走的路有这么多选择。
在当地的一家微软认证合作伙伴,他们为我提供了 4 门微软认证 IT 专业服务器管理员(相当于 MCSA)标签的课程,他们还提供“MSCSE”作为企业管理员。
我有一个使用事务复制复制的数据库。现在,我想将该数据库的一些数据备份到另一个分区,因为我的服务器磁盘空间不足。
我试图通过单击表中的设计和属性选项卡将“常规数据空间规范”更改为“次要”,使用 GUI 收费通过 SSMS 将文件移动到另一个文件组。当我尝试保存表格的设计时I get error Cannot drop the table 'dbo.MYTABLE' because it is being used for replication.
这里有几个问题:
如果我在 a 的WHERE两边重复子句中的过滤器,我会获得更高的性能OUTER JOIN吗?
要澄清使用代码:
select *
from #main_select
left outer join
(
select
main_id
,sum(aggregated) as agg
from #left_table
group by main_id
) as grouped
on #main_select.id=grouped.main_id
where #main_select.id = 1
--same reuslts
select *
from #main_select
left outer join
(
select
main_id
,sum(aggregated) as agg
from #left_table
where main_id=1 -- in this case I added where same as Left outer join
group by main_id
) as grouped
on #main_select.id=grouped.main_id
where #main_select.id = 1
Run Code Online (Sandbox Code Playgroud) 我在搭建 PostgreSQL 数据库时遇到问题,因为 npgsql 不能很好地处理同一列上有两个索引的表。这是我在 github 上的项目的链接。
我正在尝试查找这些索引/表,以便可以将它们从脚手架命令中排除。
例子:
CREATE TABLE public.altreproc (
apcod integer NOT NULL,
aptip character(3),
apcam character(3),
CONSTRAINT altreproc_pkey PRIMARY KEY (apcod)
);
CREATE INDEX ialtreproc1
ON public.altreproc
USING btree
(aptip COLLATE pg_catalog."default");
CREATE INDEX ialtreproc2
ON public.altreproc
USING btree
(apcam COLLATE pg_catalog."default");
CREATE INDEX ialtreproc3
ON public.altreproc
USING btree
(aptip COLLATE pg_catalog."default" DESC);
Run Code Online (Sandbox Code Playgroud)
我的问题是当一个表有 2 个不同的索引与相同的列(一个ASC和一个DESC)时;我试图在我试图搭建的数据库中查询这样的表/索引。
我的目标是找到在同一列上包含多个索引的表。
有时我的存储过程看起来像
create procedure handle_data
@fk int,
@value varchar(10)
as
begin
if exists (select * from my_table where id = @fk)
begin
update my_table
set value = @value
where id = @fk
end
else
begin
insert into my_table (fk, value)
select @fk, @value
end
end
Run Code Online (Sandbox Code Playgroud)
调用此存储过程的应用程序设计可能存在错误。
我应该避免制作执行相同存储过程和方法来插入新数据并更新旧数据的应用程序吗?
有没有更好的方法来以一种方法实现更新或插入数据?
我正在使用 SQL Server 2005 / 2008。
有没有什么好方法可以避免isnull()在存储过程中多次编写函数?
我有一个使用该isnull()函数近 30 次的存储过程,我认为我缺少一个概念,但是在找到更好的方法来获取我的数据之前,我会喜欢从这么多isnull()函数中清理我的代码。
我可以暂时将 SQL Server 2008 R2 设置为使用空值作为浮点 0 吗?isnull()如果没有数据,我的大部分内容只是添加零 0 值,以便我可以进行数学运算。
编辑:我不是懒惰,我只是想清理我的代码并避免选择部分看起来像这样
select
vrsta.NAZIV
,isnull(sum(prod.prod_mpci),0) as prod_MPCI
,isnull(sum(isnull(mal_MPCI,0) + (vel_kol * isnull(mal_MPC,vel_VPC))),0) as lager_mpci
,isnull(sum(vel_NCI),0)+isnulL(sum(mal_NCI),0) as lager_nci
,sum( case
when isnull(vel_KOL,0)+isnull(mal_KOL,0) > isnull(prod.prod_kol,0) and isnull(dzn.dzn,'2010-01-01') < @dzu
then ((isnull(vel_KOL,0)+isnull(mal_KOL,0))-isnull(prod.prod_kol,0)) * isnull(mal_MPC,vel_VPC)
else 0 end
) as visak_MPC
,sum( case
when isnull(vel_KOL,0)+isnull(mal_KOL,0) > isnull(prod.prod_kol,0) and isnull(dzn.dzn,'2010-01-01') < @dzu
then ((isnull(vel_KOL,0)+isnull(mal_KOL,0))-isnull(prod.prod_kol,0)) * isnull(mal_NC,vel_NC)
else 0 end
) as visak_MPC
,sum( case …Run Code Online (Sandbox Code Playgroud) sql-server ×10
t-sql ×4
performance ×3
index ×2
replication ×2
constraint ×1
dynamic-sql ×1
index-tuning ×1
insert ×1
join ×1
metadata ×1
null ×1
parameter ×1
postgresql ×1
trigger ×1
update ×1