Here is the SQL that goes with the demo.
-- Database by Doug -- Douglas Kline -- 7/8/2016 -- simple indexing - an introduction -- the example that's in every book -- but more about why it works, and what to look at USE ReferenceDB SELECT * FROM Person /****** Object: Table [dbo].[Person] Script Date: 7/8/2016 10:55:36 AM ******/ --CREATE TABLE [dbo].[Person]( -- [ID] [int] IDENTITY(1,1) NOT NULL, -- [salutory] [nvarchar](15) NULL, -- [firstName] [nvarchar](25) NULL, -- [middleInitial] [nchar](1) NULL, -- [lastName] [nvarchar](25) NOT NULL, -- [nameSuffix] [nvarchar](8) NULL, -- [email] [nvarchar](255) NULL, -- [entryDate] [datetime] NOT NULL CONSTRAINT [DF_Person_entryDate] DEFAULT (getdate()), -- [lastUpdateDate] [datetime] NOT NULL CONSTRAINT [DF_Person_lastUpdateDate] DEFAULT (getdate()), -- [weight] [float] NULL, -- [gender] [char](1) NULL, -- [dateOfBirth] [date] NULL, -- [bogusGUID] [uniqueidentifier] ROWGUIDCOL NULL CONSTRAINT [DF_Person_bogusGUID] DEFAULT (newid()), -- [bogusGUID2] [uniqueidentifier] NULL CONSTRAINT [DF_Person_bogusGUID2] DEFAULT (newid()), -- [bogusChar] [char](100) NOT NULL CONSTRAINT [DF_Person_bogusChar] DEFAULT ('fred'), -- [bogusNChar] [nchar](100) NOT NULL CONSTRAINT [DF_Person_bogusNChar] DEFAULT (N'george'), -- CONSTRAINT [PK_Person] PRIMARY KEY CLUSTERED --( -- [ID] ASC --)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, FILLFACTOR = 60) ON [PRIMARY] --) ON [PRIMARY] -- typical hard disk seek time: 6.43 ms -- typical RAM seek time (CAS latency): 14.00 ns -- note the ms and ns difference -- in the same units -- typical hard disk seek time: 6430.00 ms -- typical RAM seek time (CAS latency): 14.00 ns -- so RAM is roughly 500 times faster than a spinning hard drive -- but it is also a lot more expensive, and volatile -- Databases are built to leverage this difference -- use both RAM and disk, each for what its best at SET STATISTICS IO ON -- see the IO involved in each query SELECT * FROM Person -- logical reads: 138533 -- physical reads: 0 -- these are "page reads" -- each page is 8Kb -- they are the amount of data moved between RAM and disk -- this means the entire table is in memory -- but it might not be -- in a "real" database, you might have 10 TB of data, but 16 GB of RAM -- you can't keep all data in RAM -- so think of logical page reads as "gifts" -- you got lucky, the data you needed happened to be in RAM -- and therefore came back 500 times faster than it might have -- the best thing is to reduce the overall number of -- page reads, logical or physical SELECT firstname FROM Person -- lots faster, but same number of reads -- this is due to less data coming back over the network SELECT * FROM Person WHERE ID = 2417634 -- almost instant -- page IOs: 3 -- what about his? SELECT * FROM Person WHERE lastname = 'kline' -- page IOs: 138534 -- what is special about ID? -- there is an index on ID -- what if I want to make the lastname lookup faster? -- we could create an index that would make that faster USE [ReferenceDB] GO /****** a really simple create index statement CREATE NONCLUSTERED INDEX [IX_LastName] ON [dbo].[Person] ( [lastName] ASC ) GO ******/ -- try again? SELECT * FROM Person WHERE lastname = 'kline' -- page IOs: 393, vs. 138534 without the index -- that's the perfect scenario for an index -- it's what is covered in all the basic DB books -- this is all upside -- there are significant downsides to indexes -- particularly regarding INSERTS, UPDATES, and DELETES -- in future videos -- books also tend to focus on the data structure performance -- in other words, balanced trees and the *computational* efficiency of them -- the real performance benefits are all in reduced disk IO -- in the above, I'm not measuring performance by CPU -- I'm measuring performance by disk IOs -- Why? -- because CPU is 1000(?) times faster than RAM -- for DB, generally worry about performance in this order: -- network, which is 1000(?) slower than -- disk, which is 1000(?) slower than -- RAM, which is 1000(?) slower than -- CPU -- Database by Doug -- Douglas Kline -- 7/8/2016 -- simple indexing
No comments:
Post a Comment