- 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
Many data professionals are very familiar with Relational Database Management Systems (RDBMS) like SQL Server or Oracle. The concepts within an RDBMS have served data needs since it was adopted by enterprises in the early 1970s. In fact, most of us have "grown up" in our IT careers using an RDBMS of one form or another for almost all programmatic data. We spend our days working with SQL Server and other packages, learning about them, and eagerly await each new release, loaded with features and enhancements.
But those features and enhancements aren't always what a developer is looking for. In fact, sometimes they are looking for a quick, simple storage method — and this part is most important of all — that will scale with large data sets without their having to change the design. They don't want or need an administrator, they don't design the data the same way, and the structures they care about do not necessarily map directly to the relational calculus that RDBMS systems are built on.
Often the data design process is different for developers. Many data professionals, including myself, normally follow this process for designing a database from a set of business requirements:
- Pull out nouns and verbs
- Arrange nouns into entities
- Further divide nouns into "Parent" and "Child" entities
- Apply structures such as tables, data types and constraints to entities
- Verbs become relationships between entities
This is called "Database-First" design and is common among data professionals. But many developers use a different process called "Model-First" or a "Domain-Driven Development Process." Using this process, developers create code, often using Object-Oriented designs, which then drive out "Classes." A class in this context looks a lot like an entity or table to a database professional, but it lacks things like Primary and Foreign Keys, might have different data types, and any RDBMS programming logic is not contained in the class definition.
These classes are often created using Object-Role Modeling (ORM) or other tools, using frameworks from Java or the Entity Framework in .NET programming. So you'll often see these data designs look vastly different from an RDBMS database model — the normalization is different, and Referential Integrity might be placed in the programming layer, called Programmatic Referential Integrity or PRI as opposed to the database program making sure that people can't insert, update or delete incorrectly, called Declarative Referential Integrity or DRI. Whereas you and I would create constraints like Keys or CHECK objects to make sure a number entered falls within a certain range, a developer will just code that right into the program. Often their assumption is that no one can access the data layer except through their program, where a data professional might make the same data source available to other programs, reporting systems and so on.
Often this causes a conflict. The developers might start work on a project, and the data professionals are brought in after the initial design. At that point, the data team wants to begin a database design effort, and in some cases the developers are already past that stage. Everyone has commendable goals — the data professional wants to ensure the safety, stability and integrity of the data, and the developers want fast programs and programming methodologies that don't have time to design the data down to this level of granularity.
Enter "NoSQL." This is a fairly new term that originally indicated that the Structured Query Language (SQL) was not the interface to this class of data storage and retrieval. After much questioning from the SQL community that was trying to make sense of it all, some in the NoSQL community stated that the name meant "Not Only SQL."
Once you begin to peel back the terminology arguments, however, the NoSQL offerings can become confusing very quickly. There is a mix of exactly what the products do with a discussion of how they do it, and a new one seems to be released every couple of months of so. It can be a challenge to find out which one is in vogue at any given time or company.
Developers don't actually care about or use the term "NoSQL" very often — they simply want a quick way to lay out a set of classes and map them back to a reliable, fast, widely scalable data engine. Since most of the NoSQL products are aligned to development methods. The developer simply creates their classes for data, and calls the engine's Application Programming Interface (API) to read or write data (updates are merely writes). In some cases, these API's can be called from an HTTP string — more about that in other books and articles.
But why should the data professional care about NoSQL? Shouldn't we focus on making sure our systems are performing well, have good security, and are optimized? Well, the primary reason we should care is because we should be data stewards, not just tied to a single platform. We need to help the organization handle data in whatever form it works, and however it best suits them.
You also need to care because this methodology is very attractive to developers. If they toss up a NoSQL system, they no longer need to deal with the data team — they simply code and go. They'll explain to the business teams that companies like Google and Twitter use a NoSQL implementation, and those systems are large, and inexpensive. Those are things that resonate well with business people. If you understand how the NoSQL implementations work, you can become part of the process — using it where it makes sense, and calling out the times where an RDBMS might be more suited to a particular task.
In this overview, I'll briefly describe the rationale behind NoSQL databases, how they differ from an RDBMS, and where folks are using them.
It's important to differentiate between the physical way a NoSQL product is persisted, and the interfaces, coding and access methods they use for the abstraction of data. You'll often run into confusion on this point, since some NoSQL offerings imply a certain data storage method and physical architecture, and others can use differing underlying structures and physical layouts. I'll try and point these out as I explain each offering.
NoSQL Defined
At a high level, and keeping the caveat I mentioned above in mind, there are some general similarities between the popular NoSQL products. Many of the offerings at the physical level are really a distributed data store, not really all that dissimilar from COBOL flat-files.
Most of the NoSQL products differ in the way the data is designed and the physical layout from an RDBMS. The data structures are more simplistic, with only a few columns. In fact, in some of the offerings there are only two columns, a key to find the data and the data, line-by-line.
The structure of a data set — what we would refer to as a table or entity - can change from line to line. In other words, one "row" of data in a NoSQL schema can have different attributes (or what we call columns) than the row below it. This can look very strange when you're staring at the data directly, but again, developers don't do that. They call the data object in code, and then query it. So to a developer the underlying design isn't very interesting to look at, while we data professionals usually live in that area.
The program access methods and the languages used in NoSQL are much different. While the name NoSQL indicates that you don't use the Structured Query Language to access data, in some cases there is a SQL layer over a NoSQL structure, which can be confusing. In most NoSQL products, however, the query language is left in the programming API's, with an interesting set of twists. As I've mentioned, for some NoSQL implementations an "Update" is really a delete/write process. Interestingly, this is also technically the way SQL Server and other RDBMS systems perform an update as well, it's just that they give you an UPDATE statement, and in the programming API there is not. Many developers use a framework such as EF or they use something like the LINQ query language so that the query stays constant for them regardless of the underlying query engine.
The next interesting thing about the programming methods for some NoSQL products is that the query language is often less about a SELECT operation that limits the data that is brought back than a filter that is applied across the entire data set. While the effect is the same in that only some data is returned to the program, the way that is done at the engine level is quite dramatic. Using a filter operation instead of a seek-and-build-a-data-set, the work set can be broken down, allowing a huge level of parallel operations. In some cases the "query" is broken down into a series of steps, and then mapped out to which nodes of the system hold the data elements. This means you can add nodes and data sources almost indefinitely, distributing the load using a set of hash tables to break out the work.
There are some trade-off considerations, of course. While it's easier to program for the developer in a NoSQL environment and it scales well, you may need more program-side code than server-side code for a given operation. What that means is that there are no Stored Procedures, automatically scaling lock operations and other places to put the business logic. Everything, or perhaps a lot more of everything, needs to be in the code. Since bugs are inevitable, you can get phantom reads, integrity problems and commitment intervals that are not acceptable.
It should be noted that while NoSQL is often synonymous with a relaxed ACID proteries for data, there are variants out now that do enforce more ACID properties, called "NewSQL." Yet another term to learn.
Your tools for managing a NoSQL system are often programmatic, rather than a graphical toolset. So you will often see third party tools in wide use for NoSQL products. That may be in fact a hidden cost, so it's one you should consider.
The data types in a NoSQL product may be different than the data types you will see in a traditional RDBMS. Of course, coding languages like Java and .NET languages have quite a few data types themselves, but those don't always map one-to-one with SQL Server. But don't let the differences fool you — developers will explain that the primitive data types in a programming language like INT or BOOL can be used in a Class to define very complicated data types — perhaps even more complicated than RDBMS database data types, if you leave out the CLR layer in SQL Server or the Java types in Oracle.
In most cases, the relationships in a NoSQL implementation are done programmatically. There are no Primary or Foreign Keys, at least as they are defined in an RDBMS. I'll explain more about the set-theory and mathematics they use in the next article.
The final consideration I keep in mind when deciding whether a data set is used in NoSQL or an RDBMS are the multiple camps in the NoSQL world. It's not an exaggeration to say that NoSQL variants are released at an astounding rate. Standardization can become a real issue as one NoSQL is used over another. Companies need to be aware of this fragmentation. Not that it's a bad thing, but it is something to keep in mind for supportability and migrations and portability.
In the next article, I'll close out this topic with a discussion when and where you can use NoSQL databases, a few examples of those, and some places to learn more.