为多表连接创建非聚簇索引

时间:2014-12-16 08:48:31

标签: sql sql-server tsql

我通过连接多个表并在多个列中使用条件来编写查询。由于我们有大量数据,我需要在所有这些列上创建索引。因此该查询应使用此索引以获得更好的性能。让我知道如何为以下场景创建它?

SELECT 
  A.NAME,
  B.SAL,
  C.DATE1 
FROM 
  A 
  INNER JOIN B ON A.ID = B.ID 
  INNER JOIN C ON B.ID1 = C.ID1
WHERE 
  A.STATUS1 = '0' 
  AND A.TOTALAMT <> 0 
  AND A.FLAG = 'N' 
  AND B.SAL > 100 
  AND C.DATE1 NOT IN('2008-08-08', '2009-09-09')

2 个答案:

答案 0 :(得分:1)

这里的经验法则是在join子句和sargs中包含字段。 还有更多内容(例如聚类,选择性,覆盖,包括......),但您可以获得满足的次优结果。

尝试创建这些索引:

  • 表A(ID)
  • 表B(ID,ID1)
  • 表C(ID1)

...运行并测试您的应用程序及其数据库访问性能。

如果您遇到问题,您可能会发现这样的事情表现得更好:

  • 表A(ID,STATUS1,TOTALAMT,FLAG)
  • 表B(ID,ID1,SAL)
  • 表C(ID1,DATE1)

答案 1 :(得分:0)

我想和@Ozren已经写过同样的事情。但我总是在核实我所写的条件。

主键

  Table A=ID
  Table B=ID1
  Table C=ID1
  Verify uncessary where condition like 
  i)  when sal>100 then TOTALAMT will always >0 (is it so?)
  ii) what is A.STATUS1 and A.FLAG ?(like when Flag='N' then Status is always='0' 
      you can put such validation while insert And avoid extra where condition.

非CI

Table A (STATUS1, TOTALAMT, FLAG)
Table B (SAL)
Table C (DATE1)
  1. 分析您的所有过程以检查哪些列经常在where where条件中使用。
  2. 如果经常使用FOR示例Flag='N',则可以在此列上使用过滤索引
  3. 同时确保正确的数据类型如Flag是char(1)而不是varchar等。