- SQL Server Reference Guide
- Introduction
- SQL Server Reference Guide Overview
- Table of Contents
- Microsoft SQL Server Defined
- SQL Server Editions
- SQL Server Access
- Informit Articles and Sample Chapters
- Online Resources
- Microsoft SQL Server Features
- SQL Server Books Online
- Clustering Services
- Data Transformation Services (DTS) Overview
- Replication Services
- Database Mirroring
- Natural Language Processing (NLP)
- Analysis Services
- Microsot SQL Server Reporting Services
- XML Overview
- Notification Services for the DBA
- Full-Text Search
- SQL Server 2005 - Service Broker
- Using SQL Server as a Web Service
- SQL Server Encryption Options Overview
- SQL Server 2008 Overview
- SQL Server 2008 R2 Overview
- SQL Azure
- The Utility Control Point and Data Application Component, Part 1
- The Utility Control Point and Data Application Component, Part 2
- Microsoft SQL Server Administration
- The DBA Survival Guide: The 10 Minute SQL Server Overview
- Preparing (or Tuning) a Windows System for SQL Server, Part 1
- Preparing (or Tuning) a Windows System for SQL Server, Part 2
- Installing SQL Server
- Upgrading SQL Server
- SQL Server 2000 Management Tools
- SQL Server 2005 Management Tools
- SQL Server 2008 Management Tools
- SQL Azure Tools
- Automating Tasks with SQL Server Agent
- Run Operating System Commands in SQL Agent using PowerShell
- Automating Tasks Without SQL Server Agent
- Storage – SQL Server I/O
- Service Packs, Hotfixes and Cumulative Upgrades
- Tracking SQL Server Information with Error and Event Logs
- Change Management
- SQL Server Metadata, Part One
- SQL Server Meta-Data, Part Two
- Monitoring - SQL Server 2005 Dynamic Views and Functions
- Monitoring - Performance Monitor
- Unattended Performance Monitoring for SQL Server
- Monitoring - User-Defined Performance Counters
- Monitoring: SQL Server Activity Monitor
- SQL Server Instances
- DBCC Commands
- SQL Server and Mail
- Database Maintenance Checklist
- The Maintenance Wizard: SQL Server 2000 and Earlier
- The Maintenance Wizard: SQL Server 2005 (SP2) and Later
- The Web Assistant Wizard
- Creating Web Pages from SQL Server
- SQL Server Security
- Securing the SQL Server Platform, Part 1
- Securing the SQL Server Platform, Part 2
- SQL Server Security: Users and other Principals
- SQL Server Security – Roles
- SQL Server Security: Objects (Securables)
- Security: Using the Command Line
- SQL Server Security - Encrypting Connections
- SQL Server Security: Encrypting Data
- SQL Server Security Audit
- High Availability - SQL Server Clustering
- SQL Server Configuration, Part 1
- SQL Server Configuration, Part 2
- Database Configuration Options
- 32- vs 64-bit Computing for SQL Server
- SQL Server and Memory
- Performance Tuning: Introduction to Indexes
- Statistical Indexes
- Backup and Recovery
- Backup and Recovery Examples, Part One
- Backup and Recovery Examples, Part Two: Transferring Databases to Another System (Even Without Backups)
- SQL Profiler - Reverse Engineering An Application
- SQL Trace
- SQL Server Alerts
- Files and Filegroups
- Partitioning
- Full-Text Indexes
- Read-Only Data
- SQL Server Locks
- Monitoring Locking and Deadlocking
- Controlling Locks in SQL Server
- SQL Server Policy-Based Management, Part One
- SQL Server Policy-Based Management, Part Two
- SQL Server Policy-Based Management, Part Three
- Microsoft SQL Server Programming
- An Outline for Development
- Database
- Database Services
- Database Objects: Databases
- Database Objects: Tables
- Database Objects: Table Relationships
- Database Objects: Keys
- Database Objects: Constraints
- Database Objects: Data Types
- Database Objects: Views
- Database Objects: Stored Procedures
- Database Objects: Indexes
- Database Objects: User Defined Functions
- Database Objects: Triggers
- Database Design: Requirements, Entities, and Attributes
- Business Process Model Notation (BPMN) and the Data Professional
- Business Questions for Database Design, Part One
- Business Questions for Database Design, Part Two
- Database Design: Finalizing Requirements and Defining Relationships
- Database Design: Creating an Entity Relationship Diagram
- Database Design: The Logical ERD
- Database Design: Adjusting The Model
- Database Design: Normalizing the Model
- Creating The Physical Model
- Database Design: Changing Attributes to Columns
- Database Design: Creating The Physical Database
- Database Design Example: Curriculum Vitae
- NULLs
- The SQL Server Sample Databases
- The SQL Server Sample Databases: pubs
- The SQL Server Sample Databases: NorthWind
- The SQL Server Sample Databases: AdventureWorks
- The SQL Server Sample Databases: Adventureworks Derivatives
- UniversalDB: The Demo and Testing Database, Part 1
- UniversalDB: The Demo and Testing Database, Part 2
- UniversalDB: The Demo and Testing Database, Part 3
- UniversalDB: The Demo and Testing Database, Part 4
- Getting Started with Transact-SQL
- Transact-SQL: Data Definition Language (DDL) Basics
- Transact-SQL: Limiting Results
- Transact-SQL: More Operators
- Transact-SQL: Ordering and Aggregating Data
- Transact-SQL: Subqueries
- Transact-SQL: Joins
- Transact-SQL: Complex Joins - Building a View with Multiple JOINs
- Transact-SQL: Inserts, Updates, and Deletes
- An Introduction to the CLR in SQL Server 2005
- Design Elements Part 1: Programming Flow Overview, Code Format and Commenting your Code
- Design Elements Part 2: Controlling SQL's Scope
- Design Elements Part 3: Error Handling
- Design Elements Part 4: Variables
- Design Elements Part 5: Where Does The Code Live?
- Design Elements Part 6: Math Operators and Functions
- Design Elements Part 7: Statistical Functions
- Design Elements Part 8: Summarization Statistical Algorithms
- Design Elements Part 9:Representing Data with Statistical Algorithms
- Design Elements Part 10: Interpreting the Data—Regression
- Design Elements Part 11: String Manipulation
- Design Elements Part 12: Loops
- Design Elements Part 13: Recursion
- Design Elements Part 14: Arrays
- Design Elements Part 15: Event-Driven Programming Vs. Scheduled Processes
- Design Elements Part 16: Event-Driven Programming
- Design Elements Part 17: Program Flow
- Forming Queries Part 1: Design
- Forming Queries Part 2: Query Basics
- Forming Queries Part 3: Query Optimization
- Forming Queries Part 4: SET Options
- Forming Queries Part 5: Table Optimization Hints
- Using SQL Server Templates
- Transact-SQL Unit Testing
- Index Tuning Wizard
- Unicode and SQL Server
- SQL Server Development Tools
- The SQL Server Transact-SQL Debugger
- The Transact-SQL Debugger, Part 2
- Basic Troubleshooting for Transact-SQL Code
- An Introduction to Spatial Data in SQL Server 2008
- Performance Tuning
- Performance Tuning SQL Server: Tools and Processes
- Performance Tuning SQL Server: Tools Overview
- Creating a Performance Tuning Audit - Defining Components
- Creating a Performance Tuning Audit - Evaluation Part One
- Creating a Performance Tuning Audit - Evaluation Part Two
- Creating a Performance Tuning Audit - Interpretation
- Creating a Performance Tuning Audit - Developing an Action Plan
- Understanding SQL Server Query Plans
- Performance Tuning: Implementing Indexes
- Performance Monitoring Tools: Windows 2008 (and Higher) Server Utilities, Part 1
- Performance Monitoring Tools: Windows 2008 (and Higher) Server Utilities, Part 2
- Performance Monitoring Tools: Windows System Monitor
- Performance Monitoring Tools: Logging with System Monitor
- Performance Monitoring Tools: User Defined Counters
- General Transact-SQL (T-SQL) Performance Tuning, Part 1
- General Transact-SQL (T-SQL) Performance Tuning, Part 2
- General Transact-SQL (T-SQL) Performance Tuning, Part 3
- Performance Monitoring Tools: An Introduction to SQL Profiler
- Performance Tuning: Introduction to Indexes
- Performance Monitoring Tools: SQL Server 2000 Index Tuning Wizard
- Performance Monitoring Tools: SQL Server 2005 Database Tuning Advisor
- Performance Monitoring Tools: SQL Server Management Studio Reports
- Performance Monitoring Tools: SQL Server 2008 Activity Monitor
- The SQL Server 2008 Management Data Warehouse and Data Collector
- Performance Monitoring Tools: Evaluating Wait States with PowerShell and Excel
- Practical Applications
- Choosing the Back End
- The DBA's Toolbox, Part 1
- The DBA's Toolbox, Part 2
- Scripting Solutions for SQL Server
- Building a SQL Server Lab
- Using Graphics Files with SQL Server
- Enterprise Resource Planning
- Customer Relationship Management (CRM)
- Building a Reporting Data Server
- Building a Database Documenter, Part 1
- Building a Database Documenter, Part 2
- Data Management Objects
- Data Management Objects: The Server Object
- Data Management Objects: Server Object Methods
- Data Management Objects: Collections and the Database Object
- Data Management Objects: Database Information
- Data Management Objects: Database Control
- Data Management Objects: Database Maintenance
- Data Management Objects: Logging the Process
- Data Management Objects: Running SQL Statements
- Data Management Objects: Multiple Row Returns
- Data Management Objects: Other Database Objects
- Data Management Objects: Security
- Data Management Objects: Scripting
- Powershell and SQL Server - Overview
- PowerShell and SQL Server - Objects and Providers
- Powershell and SQL Server - A Script Framework
- Powershell and SQL Server - Logging the Process
- Powershell and SQL Server - Reading a Control File
- Powershell and SQL Server - SQL Server Access
- Powershell and SQL Server - Web Pages from a SQL Query
- Powershell and SQL Server - Scrubbing the Event Logs
- SQL Server 2008 PowerShell Provider
- SQL Server I/O: Importing and Exporting Data
- SQL Server I/O: XML in Database Terms
- SQL Server I/O: Creating XML Output
- SQL Server I/O: Reading XML Documents
- SQL Server I/O: Using XML Control Mechanisms
- SQL Server I/O: Creating Hierarchies
- SQL Server I/O: Using HTTP with SQL Server XML
- SQL Server I/O: Using HTTP with SQL Server XML Templates
- SQL Server I/O: Remote Queries
- SQL Server I/O: Working with Text Files
- Using Microsoft SQL Server on Handheld Devices
- Front-Ends 101: Microsoft Access
- Comparing Two SQL Server Databases
- English Query - Part 1
- English Query - Part 2
- English Query - Part 3
- English Query - Part 4
- English Query - Part 5
- RSS Feeds from SQL Server
- Using SQL Server Agent to Monitor Backups
- Reporting Services - Creating a Maintenance Report
- SQL Server Chargeback Strategies, Part 1
- SQL Server Chargeback Strategies, Part 2
- SQL Server Replication Example
- Creating a Master Agent and Alert Server
- The SQL Server Central Management System: Definition
- The SQL Server Central Management System: Base Tables
- The SQL Server Central Management System: Execution of Server Information (Part 1)
- The SQL Server Central Management System: Execution of Server Information (Part 2)
- The SQL Server Central Management System: Collecting Performance Metrics
- The SQL Server Central Management System: Centralizing Agent Jobs, Events and Scripts
- The SQL Server Central Management System: Reporting the Data and Project Summary
- Time Tracking for SQL Server Operations
- Migrating Departmental Data Stores to SQL Server
- Migrating Departmental Data Stores to SQL Server: Model the System
- Migrating Departmental Data Stores to SQL Server: Model the System, Continued
- Migrating Departmental Data Stores to SQL Server: Decide on the Destination
- Migrating Departmental Data Stores to SQL Server: Design the ETL
- Migrating Departmental Data Stores to SQL Server: Design the ETL, Continued
- Migrating Departmental Data Stores to SQL Server: Attach the Front End, Test, and Monitor
- Tracking SQL Server Timed Events, Part 1
- Tracking SQL Server Timed Events, Part 2
- Patterns and Practices for the Data Professional
- Managing Vendor Databases
- Consolidation Options
- Connecting to a SQL Azure Database from Microsoft Access
- SharePoint 2007 and SQL Server, Part One
- SharePoint 2007 and SQL Server, Part Two
- SharePoint 2007 and SQL Server, Part Three
- Querying Multiple Data Sources from a Single Location (Distributed Queries)
- Importing and Exporting Data for SQL Azure
- Working on Distributed Teams
- Professional Development
- Becoming a DBA
- Certification
- DBA Levels
- Becoming a Data Professional
- SQL Server Professional Development Plan, Part 1
- SQL Server Professional Development Plan, Part 2
- SQL Server Professional Development Plan, Part 3
- Evaluating Technical Options
- System Sizing
- Creating a Disaster Recovery Plan
- Anatomy of a Disaster (Response Plan)
- Database Troubleshooting
- Conducting an Effective Code Review
- Developing an Exit Strategy
- Data Retention Strategy
- Keeping Your DBA/Developer Job in Troubled Times
- The SQL Server Runbook
- Creating and Maintaining a SQL Server Configuration History, Part 1
- Creating and Maintaining a SQL Server Configuration History, Part 2
- Creating an Application Profile, Part 1
- Creating an Application Profile, Part 2
- How to Attend a Technical Conference
- Tips for Maximizing Your IT Budget This Year
- The Importance of Blue-Sky Planning
- Application Architecture Assessments
- Transact-SQL Code Reviews, Part One
- Transact-SQL Code Reviews, Part Two
- Cloud Computing (Distributed Computing) Paradigms
- NoSQL for the SQL Server Professional, Part One
- NoSQL for the SQL Server Professional, Part Two
- Object-Role Modeling (ORM) for the Database Professional
- Business Intelligence
- BI Explained
- Developing a Data Dictionary
- BI Security
- Gathering BI Requirements
- Source System Extracts and Transforms
- ETL Mechanisms
- Business Intelligence Landscapes
- Business Intelligence Layouts and the Build or Buy Decision
- A Single Version of the Truth
- The Operational Data Store (ODS)
- Data Marts – Combining and Transforming Data
- Designing Data Elements
- The Enterprise Data Warehouse — Aggregations and the Star Schema
- On-Line Analytical Processing (OLAP)
- Data Mining
- Key Performance Indicators
- BI Presentation - Client Tools
- BI Presentation - Portals
- Implementing ETL - Introduction to SQL Server 2005 Integration Services
- Building a Business Intelligence Solution, Part 1
- Building a Business Intelligence Solution, Part 2
- Building a Business Intelligence Solution, Part 3
- Tips and Troubleshooting
- SQL Server and Microsoft Excel Integration
- Tips for the SQL Server Tools: SQL Server 2000
- Tips for the SQL Server Tools – SQL Server 2005
- Transaction Log Troubles
- SQL Server Connection Problems
- Orphaned Database Users
- Additional Resources
- Tools and Downloads
- Utilities (Free)
- Tool Review (Free): DBDesignerFork
- Aqua Data Studio
- Microsoft SQL Server Best Practices Analyzer
- Utilities (Cost)
- Quest Software's TOAD for SQL Server
- Quest Software's Spotlight on SQL Server
- SQL Server on Microsoft's Virtual PC
- Red Gate SQL Bundle
- Microsoft's Visio for Database Folks
- Quest Capacity Manager
- SQL Server Help
- Visual Studio Team Edition for Database Professionals
- Microsoft Assessment and Planning Solution Accelerator
- Aggregating Server Data from the MAPS Tool
The Japanese art of Bonsai (pronounced bone-sigh) involves growing very small trees in a minimal amount of soil. The trees they produce are stunningly beautiful, and getting them to look this way and thrive in a very unnatural environment involves a lot of skill. The skill you need to successfully raise a bonsai has many parts, but the one that is the most important is something you might not think of — watering. Because the tree is a small size, and the soil is very light, it's quite easy to kill the tree - or make it thrive - using only the watering can.
It's a similar concept to Indexes in SQL Server. An Index, which I'll explain more about in a moment, is one of the primary tools you have for increasing performance in your database system. An improper Index, on the other hand, can slow your system to a crawl — I've seen this happen myself many times.
I'll start by explaining what an Index is, then how it is used by the system, and then I'll explain how you can make your own. From there, it's important to monitor and maintain the Index — it's not a "set it and forget it" kind of thing.
An Index on a SQL Server database (or more accurately, on a table) is used much as an Index is used in a book. Imagine that I've asked you to locate all of the times the word "SQL" is used in a chapter of a book. Now imagine that you have to do that for the entire book. "Simple," you think, "I'll just look it up in the Index, and then write down the page numbers." That would be the right thing to do. An Index in a book is simply a list of certain terms used in the book, and the page numbers where those words are used. This saves you time in trying to find the words, by at least getting you to the right page.
SQL Server indexes aren't too far removed from that concept. The data in SQL Server is stored in unit of space on the hard disk called a page. A page is a block of space that is defined by a unique number. If SQL Server is asked to look up data, it reads across these pages to find all the times the data you're looking for is stored. It then accesses those page numbers to display the data. This is called a scan, and unless the table is small (say, under 1,000 rows), it's pretty slow. It's a lot like finding the words in a book by reading each and every page, every single time you're asked to find a word.
When you place an Index on a table, the server scans all the pages and records the reference number of the page where those groups of items are. For instance, if the data being indexed is alphabetical, then it might store the page numbers where all the "A through Cs" are, and so forth. It can then use the Index on the table to quickly locate the page the data is on, just as you would in a book. Indexes effectively limit the data being searched, reducing the time spent on the search.
You can place many indexes on a table: 249 in SQL Server 2000, and 1,000 in SQL Server 2008, and of course that number will just increase over time. The Index "covers" or includes one or more columns, the ones you think might be used to look up data most of the time. In other words, you choose the data that will be indexed in a table, by creating an Index that stores certain columns. Choosing those columns is where the real challenge comes in. I'll explain how to do that in a moment.
Normally, Primary Keys are always covered by an Index. Other columns might be candidates for an Index as well. For instance, in a table that stores names, the "LastName" field would be a good Index candidate, because in many cases data about people is queried by their last name. The art of Index design is the tradeoff between an Index that covers as many columns as possible — up to a point.
That point involves the tradeoff between reads and writes. My "book" analogy kind of falls apart here, when compared with a database, since once a book is printed it doesn't change — at least that particular copy. In a database, however, the contents (data) changes all the time.
As database changes are made, the Index must be updated, or it becomes useless. If a table's column is read from a great deal, then indexes are great, because there aren't many changes — so the activity to update the index isn't as frequent.
If, however, the indexed column in the table is written to a great deal, Indexes aren't as great, because now the system has to update both the table and the Index. The problem arises in that most tables are both heavily read and heavily written.
There are two classes of indexes on a table: Clustered and Non-Clustered. (That kind of reminds me of that statement that says "There are two categories of people: Those who put people in two categories and those who don't.") Anyway, the Clustered Index puts data into a physical order. The non-clustered doesn't.
Let's take an example. Here is some data:
2 4 3 5 6 1
A clustered Index on this data conceptually rearranges the table itself, and stores the data physically this way — in fact, in a Clustered Index the Table itself is also the Index — because it's arranged this way on disk: (again, see the links above for a more accurate representation here):
1 2 3 4 5 6
The Non-Clustered Index leaves the data order in the table alone, such that it's still stored like this:
2 4 3 5 6 1
And then it makes another table that stores the "pointers" to the indexed data. This is where the database Index is most like a book. So a Non-Clustered Index is actually another table, pointing to a set of page numbers of the first.
As you can probably guess, there's only one Clustered Index on a table, since the table can only be stored once. This type of Index is pretty fast for data retrieval, assuming that you're looking for something that the Index covers. Once you leave the safety of the cover, the access can slow down again. A disadvantage to the clustered Index is that, when data is added, the table must be physically rearranged to put the data in the right spot. That can become costly if the table is written to very often.
So the decisions involved in designing an Index boil down to these areas:
- How big is the data?
- How often is the data updated?
- What fields are normally used in queries?
- How is the data shaped?
I'll devote the rest of this article to helping you tie out basic Index design to the answers to these questions. I'll cover a lot more about indexes in other tutorials.
How Big Is The Data?
If the data isn't very large, SQL Server will always scan the table anyway. If SQL Server is bound and determined to scan the data, why create the overhead of an Index?
What is that size limit? Well, there are few caveats, but by and large if the table is composed of fewer than 1,000 rows SQL Server will opt to scan it rather than use an Index. It just doesn't make sense to do several I/O (Input/Output) operations to get at the data through an Index when the whole table can be read quickly in one pass.
You can Query Analyzer (SQL Server 2000) or SQL Server Management Studio to find out if you're doing a table scan even when you've created an Index. Type in the query in question, and then select the Query menu. Select the Show Execution Plan item, and you'll get a tab to see the path your query takes. You can hover over an icon to see more info about it. You can read those icons to see if the Index is being used or not. If it isn't, then you should remove it. I have more on that tool here.
How Often Is The Data Updated?
Indexes benefit read operations, but not write operations. If your data is written more often than its read, you'll benefit less from an Index. The reason is that when you write new data, the Index must be updated to show where that data is.
If the Index is clustered, then the entire table has to move around to accommodate the new data, unless it is written at the end of the table. That's why it's best to save the clustered Index for something like the Primary Key or some other always-increasing, sequential value.
Even if the Index is non-clustered, and is another structure entirely, the Index has to be written to so that the new data is tracked. This takes I/O cycles, and slows down your system.
That's a bit of a generalization, because even a write can use an Index. That's possible because some writes are done through stored procedures — and these may look up data before they write others. These are the kinds of issues you must think through before you create an Index.
But sometimes even those write operation costs are outweighed if there are more reads against that data. There are various tools that can help you determine how well your indexes are used, and if they are helping or hurting. I'll cover these concepts in the Performance Tuning section of this guide.
What Fields Are Normally Used in Your Queries?
This is one of the most important questions to ask, and finding the answer will involve the DBA, the development team, and the users. You can use the SQL Profiler, Query Analyzer, and the Index Wizard to see what indexes might benefit your queries. I have tutorials on all of those in the Performance Tuning section.
If you're the one that defined your database design, then you'll probably know this information. If another developer created it, then you'll need to work with them, even if they are a vendor, to determine the best columns for your indexes.
How Is The Data Shaped?
What this question is asking is the type of data, the ranges of data, and the size of the data that the table stores. If, for instance, the data is updated frequently, you'll want to create your indexes with a fill-factor that leaves room on each page to add more data, without having to create more pages. If the data is read more often, the fill-factor can be left at a more "full" level.
Creating an Index
Once you've determined the columns to Index, there are several ways to create and modify your indexes. The methods fall into two camps: Automated and Manual processes.
If you're just starting out, you can certainly benefit from the automated methods of Index creation. The first of these is the Create Index Wizard (in SQL Server 2000) and the Database Tuning Advisor (in SQL Server 2005 and higher). These tools can either watch the activity on the server or create one to determine which tables need indexes. It will also create them for you. It's often a good place to start — assuming that you'll come back in later and make sure that the indexes that were created are still valid for production. In other words, you should never just run the tools and use the suggestions blindly. Check out the articles on those to find out where they help — and where they cannot.
You can also find graphical helps in the Query Analyzer tool in SQL Server 2000. To use this tool, open Query Analyzer, then type the query in question, and then select the Query menu. Select the Show Execution Plan item, and you'll get a tab to see the path your query takes. Once you've run the query, right-click in the Estimated Execution Tab of Query Analyzer, and then select Manage Indexes. For SQL Server 2005 and higher, just use the menu at the top of the Query Window to find these options before you run the query, and then you'll get an extra tab with those results. Once again, see the previous article I have on the Execution Plan for much more information on that process.
In SQL Server 2008 and higher, the Activity Monitor can also help you with finding missing Indexes, but not directly. Follow the information I show here for more about that process.
There are also a set of Dynamic Management Views you can use in SQL Server 2005 and higher that have more information on the Indexes your system has or needs. See this article for more. Once again, these tools should be used as starting points, not blind application. You need to ensure that you understand
The manual methods of creating indexes aren't used for designing indexes; they're used to implement designs. Of course, the main manual method is the CREATE INDEX T-SQL statement. The format looks like this:
CREATE [ UNIQUE ] [ CLUSTERED | NONCLUSTERED ] INDEX Index_name ON { 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 }
Check Books Online for more information on this command. I cover it again in my tutorials on creating Indexes. Here's a simple example that creates a Non-Clustered Index on a table called "Person" in a database I have. I want to cover the PersonName and PersonType Columns, since those are the ones queried most often:
CREATE NONCLUSTERED INDEX IX_PersonInfo ON Person (PersonName, PersonType); GO
The actual use of the Index is regulated by a component of SQL Server called the Query Optimizer. The Query Optimizer decides things like whether to use a particular Index or just scan the table, which processors can handle the query and the like. You don't normally tune the Query Optimizer, but you can tell it to favor one factor or another with a "hint" in your Transact-SQL code. I'll cover that in another tutorial as well.
Because the indexes change so rapidly over time, they can become fragmented, much like the blocks on an operating system's hard drive. There are various maintenance commands you can run to either move those entries around, or to rebuild them entirely. The point is that there is indeed maintenance that you will have to do on your indexes. I've covered the basics in my section on Maintenance and The Maintenance Wizard on this site.
Primarily the Index Maintenance involves re-ordering the physical pages where the Indexes are on disk, and how full to make those pages. Let me explain those briefly.
Recall that unlike a book, a SQL Server Index is updated as data changes constantly. Rather than taking the time to arrange all those pages on disk in the most optimal way, the system chooses to lay down the data for both the table and the Index in the quickest way possible. Over time, the pages of Index data (remember that the Page is the storage level of the Index data) end up being separated far away from each other, which means the disk subsystem has to go find it all, taking time.
You have two means of dealing with this, called an Index reorganization or an Index rebuild operation. A reorganization takes less time but is less thorough, and an rebuild takes more time (and possibly means the database needs to be locked for a bit) but is very thorough. Again, these are gross generalizations, so see my maintenance articles for more, such as how to test for the level of fragmentation and when to perform either a rebuild or a re-org.
The final concept I'll cover in this brief overview is the idea of the fill-factor for an Index. This takes a bit of explaining, but the general concept is that the fillfactor for an Index (set when you create it or when you rebuild it) sets how much space the Index should use before it makes another page structure for the Index.
You can think about this in terms of a car. Assume you're going to take a bunch of folks to the movies. You count out the number of people who can drive and have a car. If everyone you need to take is in the house with you, you simply fill each car up as much as you can, taking every seat. This assumes nothing will change on the way to the movie. That would be a "Fillfactor" of 100%.
Now assume that you need to drop a couple of folks off on the way to the movie, and pick even more people up along the way. In other words, the number of people in the car is changing as you go. In that case, you might leave some room in the cars, taking more of them. If you left half the car seats empty to pick up more folks, that would be a "Fillfactor" of 50%, and so on.
So in this analogy, you leave room as you see fit, but it's more expensive in petrol and so on to do so. In a database, you can leave room on those data pages in the same way, but when you do it causes the database to "split" the data across multiple pages for the Index. However, if the Index changes often and grows, you'll see a gain in performance as it has to do that less often as the data is changed. So in essence you want to set a lower number for the fillfactor on the Index if you think the Index data will change and grow often, and a higher number where you think it won't. Once again those Dynamic Management Views I referenced earlier will help you monitor and manage that information.
This just introduces Indexes - there is a lot to learn here. I've used a few analogies that aren't completely technically accurate, which of course is the danger with analogies. But they should serve to help you understand the general concepts — which I trust you'll refine as you read this and other resources.