Guidelines-Server索引设计指南-Index-Design-SQL (guideline是什么意思)

教程大全 2025-07-14 21:04:18 浏览

文章主要描述的是SQL Server索引设计指南( Index Design Guidelines),SQL Server数据库的索引对用户与T-SQL开发者来说几乎可以说是透明的。除非用户使用表提示(table hints)来强制优化器使用某个具体的索引,否则查询中的索引不能被具体指定。

通常情况下,基于索引键直方图的值,SQL Server的基于代价的优化器从I/O角度会选择代价最小的索引。

Chapter35会详细讲述优化器如何评估I/O,并决定采用最有效的查询计划。本节主要讲述一些创建有用索引的主要的指导原则,使得优化器能够有效地使用这些索引。

设计索引的一些通用的指南包括以下几点:

对于组合索引,尽量保持索引的越靠左边的列越具有高的选择性。索引中的***列应该***有唯一性(如果可能),并且索引列的顺序总体上应该具有从高到低的唯一性。然而,记住如果索引的***列没有在SARG或join子句中出现,那么选择性将不会有任何帮助。为了确保索引能够被大多数查询使用,***列应该是查询中最常用的列。

SQL

确保join中使用的列具有索引。如果join中的列上没有索引,Join的处理将是低效的。记住:一个PRIMARY KEY约束将自动会在一个列上创建索引,但是FOREIGN KEY约束不会的。如果你的查询通常在表的primary Key 和foreign key之间进行join操作,那么你将会在foreign key上创建索引。

为你的最关键查询和事务来调整索引。你不能为每个可能的查询都创建索引。然而,如果你能识别你的关键和最常用的查询,并为它们创建索引,那么你的应用将运行地更好。SQL Profile是一个识别你的最常用查询的有用工具。SQL Profie也能识别那些运行慢的查询。

避免列上的索引具有低选择性。优化器将不可能使用这些索引,它们只是占有些空间并且在插入、删除、修改时增加了以一些不必的负担而已。当索引能覆盖一个查询则是一个例外。索引覆盖将在后面详细介绍。

小心选择你的聚集和非聚集索引。接下来的两个小节将讨论给出一些选择聚集和非聚集索引的技巧和指南。这些都基于对列上包含的数据和该列上所执行的查询类型来给出的。

【编辑推荐】


SQL server中 表中如何创建索引?

if exists(SELECT *from where naem = newindex) drop index newindex create index --=================================== 竟然没有悬赏...唉... 那算了吧 我还是都告诉你吧.. 看个示例 自己琢磨去: --============================================== use master go if db_id(Nzhangxu)is not null drop database zhangxu go create database zhangxu sp_helpdb zhangxu use zhangxu go IF EXISTS (SELECT *FROM WHERE NAME = NWORKER) DROP TABLE WORKER GO create table worker (w_id int identity (1000,1) not null,w_name Nvarchar(10) unique,w_age SMALLINT CONSTRAINT CK_W_AGE CHECK(w_age>20 and w_age<150),w_pay money DEFAULT 0,CONSTRAINT PK_W_ID PRIMARY KEY(W_ID) ) SELECT *FROM WORKER--用查询技术查看表信息 sp_help worker--利用存储过程查看表信息 /* 创建简单的非聚集索引 */ USE ZHANGXU GO if exists(select name from where name = NIX_ID_NAME) DROP INDEX IX_ID_NAME on worker go--检查是否存在索引,有则删除索引 create index IX_ID_NAME--创建索引 on worker(w_id,w_name)--在ID NAME 两个字段上创建非聚集索引 drop index _ID_NAME--删除索引 select *from where name = IX_ID_NAME--查看索引 /* 创建唯一非聚集索引 */ USE ZHANGXU GO IF EXISTS(SELECT NAME FROM WHERE NAME = NIX_W_NAME) DROP INDEX IX_W_NAME ON WORKER GO CREATE UNIQUE INDEX IX_W_NAME--唯一非聚集索引 ON WORKER(W_NAME) /* 查看索引T-SQL脚本 */ --IX_W_NAME 唯一 非聚集索引 USE [zhangxu] GO /****** 对象: Index [IX_W_NAME] 脚本日期: 07/29/2007 16:54:53 ******/ CREATE UNIQUE NONCLUSTERED INDEX [IX_W_NAME] ON [dbo].[worker] ([w_name] ASC ) WITH ( SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF ) ON [PRIMARY] --PK_W_ID聚集索引 USE [zhangxu] GO /****** 对象: Index [PK_W_ID] 脚本日期: 07/29/2007 16:56:45 ******/ ALTER TABLE [dbo].[worker] ADD CONSTRAINT [PK_W_ID] PRIMARY KEY CLUSTERED ([w_id] ASC ) WITH ( SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF ) ON [PRIMARY] --UQ_WORKER 唯一,非聚集索引 USE [zhangxu] GO /****** 对象: Index [UQ__worker__F21] 脚本日期: 07/29/2007 16:58:38 ******/ ALTER TABLE [dbo].[worker] ADD UNIQUE NONCLUSTERED ([w_name] ASC ) WITH (SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF ) ON [PRIMARY] select *from worker insert into worker(w_name,w_age,w_pay) values(王国龙,25,4500)

sql怎么建立索引

CREATE INDEX为给定表或视图创建索引。 只有表或视图的所有者才能为表创建索引。 表或视图的所有者可以随时创建索引,无论表中是否有数据。 可以通过指定限定的数据库名称,为另一个数据库中的表或视图创建索引。 语法CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX index_nameON { table | view } ( column [ ASC | DESC ] [ ,...n ] )[ WITH < index_option > [ ,...n] ][ ON filegroup ]< index_option > ::= { PAD_INDEX |FILLFACtor = fillfactor |IGNORE_DUP_KEY |DROP_EXISTING |STATISTICS_NORECOMPUTE |SORT_IN_TEMPDB}--这是基本语法,建立索引,只针对查询和一些更新和删除的速度,像性别一列,如果表里面有1000行,如果只有1行是男,这样用索引的话肯定高,如果有990行是男,那么它不如直接扫描了,这是选择性

一个java程序的问题

import .*;class Poker {Vector poker;final static int MAX_SIZE = 52; // 总牌数// 四种花色final static int TYPE_CLUBS = 0;final static int TYPE_DIAMONDS = 1;final static int TYPE_SPADES = 2;final static int TYPE_HEARTS = 3;// 随机索引int[] index;// 当输出超过 52 张时自动更新随机数组static int countIndex = 0;public Poker() {poker = new Vector(52);// 初始化 52 张牌for(int i = 0; i < 13; i++) {for(int j = 0; j < 4; j++) {(new Base(i+1,j));}}// 得到随机索引index = ranIndex(MAX_SIZE);}// 获取下一张牌public String getNextPaper() {Base b =(index[countIndex]);countIndex++;if(countIndex >= MAX_SIZE) {countIndex = 0;ranIndex(MAX_SIZE);}String res = Number: + () + Type: + ();return res;}// 产生随机索引private int[] ranIndex(int max) {int[] result = new int[max];int[] temp = new int[max];for(int i = 0; i < max; i++) {temp[i] = -1;}int count = 0;Random ran = new Random();// 得到一个随机数组,每个数组元素不相同while(count < max) {int get = (1000);if(get < 0 || checkExist(temp,get)) {continue;}else {temp[count++] = get;}}// 获得每一个位置上的元素在这个数组中的排序位置int cou = 0;for(int i = 0; i < ; i++) {for(int j = 0; j < ; j++) {if(temp[i] > temp[j])cou++;}result[i] = cou;cou = 0;}return result;}// 检查该数是否已经存在private boolean checkExist(int[] num,int n) {for(int i = 0; i < ; i++) {if(num[i] == n) {return true;}}return false;}//内部内,表示一张牌,有大小和牌类型class Base {int number;int type;public Base(int num,int t) {number = num;type = t;}}}

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐