小编ado*_*lot的帖子

我可以做些什么来加快查询中的键查找

我正在使用 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)

index sql-server-2005 sql-server execution-plan

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

如何设计索引以加快删除速度

我想加快以下代码

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_idskl_iddoc_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

5
推荐指数
2
解决办法
407
查看次数

按参数在百分比和行之间切换 TOP 子句

对于一份报告,我正在查询用户假设必须根据百分比选择 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-2005 sql-server dynamic-sql t-sql parameter

4
推荐指数
1
解决办法
433
查看次数

SQL Server 2005 根据行内日期限制更新或删除记录

我有两个 SQL Server 之间的事务复制。出于测试目的,我在订阅者处删除了许多仍然存在于发布者处的记录。

我现在知道,如果有人在发布者处更新或删除了我的订阅者上不存在的一些记录,那么我的复制将会崩溃。

我知道我也可以在分发服务器上过滤数据,但这意味着重新初始化我的订阅者,这意味着通过慢速链接传输近 40GB。

因此,当我测试我订阅的数据库时,我希望限制用户只能在发布者端更新或删除记录。我的源表有一个日期字段,我想根据日期限制更新或删除。

为此使用触发器还是约束更好?

如何尽可能避免记录锁定?

replication trigger sql-server-2005 sql-server constraint

4
推荐指数
1
解决办法
1141
查看次数

帮助改善 SQL Server 2005 查询执行时间

我的一个存储过程的执行时间很长(平均大约 4 到 7 分钟)。我想让它运行得更快。

我正在查看执行计划,有两件事占了大部分成本。第一个代表成本的 68%,其中一个主表的“聚集索引扫描”用于报告。该表有两列的主键和 2.000.000 条记录。

第二个最苛刻的任务代表了“合并连接”(左外连接)成本的 26% 。这是我上面提到的通过外键连接到上表中两列主键之一的表。

我检查了这些表的索引物理统计和索引状况良好。

我该怎么做才能提高此存储过程的性能?我需要在这些表上创建新索引吗?将set transaction isolation level read uncommitted声明有助于提高性能?

performance sql-server-2005 sql-server stored-procedures

3
推荐指数
1
解决办法
540
查看次数

在 SQL Server 中使用范围按百分比查找最高值

按百分比范围对记录进行分组的更简单方法是什么。

这是我试图完成的

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% 吗?

有没有更好(更好)的方法来做到这一点。

sql-server t-sql sql-server-2008-r2

3
推荐指数
2
解决办法
1093
查看次数

如何使用 MCSA 验证和升级我的 SQL Server 知识

我的故事是,我现在作为管理员工作了将近 10 年,我处理 SQL Server 和其他 IT 方面的工作,我的大部分知识都是通过阅读书籍、处理问题以及询问和阅读这样的网站来自学的。现在我想通过去、学习和尝试通过微软官方考试和计划来循环和证明这一点。我应该从哪里开始,我需要寻找什么样的诅咒和考试。我很困惑我能走的路有这么多选择。

在当地的一家微软认证合作伙伴,他们为我提供了 4 门微软认证 IT 专业服务器管理员(相当于 MCSA)标签的课程,他们还提供“MSCSE”作为企业管理员。

  • 我是否需要这两个才能继续学习 SQL Server 管理员?
  • 我需要这些吗?
  • MS 术语中 SQL Server 管理员的正确名称是什么?
  • 是否存在 MS 世界中调用的 SQL Server 开发人员,或者这只是针对 C#、C++ 等常见 MS 语言的开发人员的唯一扩展?

sql-server-2008 sql-server

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

如何在不破坏复制的情况下将数据从主数据文件移动到其他数据文件

我有一个使用事务复制复制的数据库。现在,我想将该数据库的一些数据备份到另一个分区,因为我的服务器磁盘空间不足。

我试图通过单击表中的设计和属性选项卡将“常规数据空间规范”更改为“次要”,使用 GUI 收费通过 SSMS 将文件移动到另一个文件组。当我尝试保存表格的设计时I get error Cannot drop the table 'dbo.MYTABLE' because it is being used for replication.

这里有几个问题:

  • 我应该在现有文件组“PRIMARY”的另一个分区中创建数据文件,还是打开新文件组而不是在新的“辅助”文件组中打开新数据文件更好?
  • 除了删除表之外,还有其他方法可以告诉 SQL 将数据保存到另一个文件吗?
  • 有没有办法可以在将某些表移动到另一个文件组时暂时从复制中排除它们,然后将它们再次放入快照中而无需重新初始化订阅者?

replication sql-server-2005 data-warehouse sql-server

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

如果我多次指定过滤器,性能会更好吗?

如果我在 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)

performance join sql-server sql-server-2008-r2

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

在同一列上查找具有多个索引的表

我在搭建 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)时;我试图在我试图搭建的数据库中查询这样的表/索引。

我的目标是找到在同一列上包含多个索引的表。

postgresql index metadata

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

如何处理更新或插入情况

有时我的存储过程看起来像

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。

sql-server-2008 database-design insert t-sql update

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

处理这么多 isnull() 情况的更简单方法

有没有什么好方法可以避免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-2008 null sql-server t-sql

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