检索数据的T-sql查询的性能

时间:2013-02-12 18:12:02

标签: sql sql-server tsql

 DECLARE  @table TABLE( mnbr int,
  Pid int,
  Pname varchar(10),
  Jid int,
  Jname varchar(10))

INSERT INTO @table
VALUES(150 ,    1   ,    'Mark'   ,   8    ,'Jerry')
,(250  ,   1  ,     'Mark'   ,   8    ,  'Jerry')
,(350  ,   2   ,    'Jim'     ,    9  ,   'Luke')
,(450  ,   2   ,    'Jim'     ,    9   ,  'Luke')
,(550  ,   2   ,    'Jim'     ,    10  ,  'Jude')
,(650  ,   3   ,    'Andy'   ,   11   , 'Matt')
,(750   ,  4   ,    'Brian'   ,    21  ,  'Chris')
,(850   ,  4   ,    'Brian'   ,     7  ,    'Mac')
,(950   ,  5   ,    'Jean '   ,    21   , 'Chris')

对于上述数据.....我的输出应如下所示:

350    2      Jim     9    Luke
450    2      Jim     9    Luke
550    2      Jim     10   Jude
750    4      Brian   21   Chris
850    4      Brian   7      Mac

对于mnbr 150和250 ....主要所有者标记有两个联合账户,在两个联合账户上,共同所有者是杰里。所以不应该显示马克的账户。

如果是mnbr:350,450,550

Jim拥有3个联合账户,而且并非所有三个联合账户都属于同一个共同所有者。所以必须显示所有3个帐户。

Mnbr 650只有一个联合账户和一个联合所有者。所以它不应该显示。

我编写了以下查询,返回我需要的数据。

SELECT  * FROM @table WHERE pname IN (
SELECT   pname FROM @table
    WHERE pname  IN (SELECT pname FROM @table GROUP BY pname,jname HAVING COUNT(*)!>1)
 GROUP BY pname HAVING COUNT(*)>1
)

我想知道,我的查询是否会提供良好的性能?

1 个答案:

答案 0 :(得分:1)

您可以将查询略微简化为

SELECT *
FROM   @table
WHERE  pname IN (SELECT   pname
                 FROM     @table
                 GROUP BY pname
                 HAVING   MAX(jid) <> MIN(jid));

对于比您在问题中提供的数据集大得多的数据集,您需要测试的是否会表现更好。

在这种情况下,针对较大数据集运行查询的更重要因素更可能是在pname,jname字段或pname,jid字段的组合上有索引。

假设表名为'accounts',有用的索引可能类似于:

CREATE NONCLUSTERED INDEX [IX_accounts_pname_jid] ON [dbo].[accounts] 
(
    [pname] ASC,
    [jid] ASC
)
WITH (PAD_INDEX  = OFF, 
      STATISTICS_NORECOMPUTE  = OFF, 
      SORT_IN_TEMPDB = OFF,
      IGNORE_DUP_KEY = OFF,
      DROP_EXISTING = OFF,
      ONLINE = OFF, 
      ALLOW_ROW_LOCKS  = ON,
      ALLOW_PAGE_LOCKS  = ON)
ON [PRIMARY]