1 SET NOCOUNT ON;
  2 USE master;
  3 GO
  4 IF DB_ID('Performance') IS NULL
  5   CREATE DATABASE Performance;
  6 GO
  7 USE Performance;
  8 GO
  9 
 10 -- Creating and Populating the Nums Auxiliary Table
 11 IF OBJECT_ID('dbo.Nums') IS NOT NULL
 12   DROP TABLE dbo.Nums;
 13 GO
 14 CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
 15 DECLARE @max AS INT, @rc AS INT;
 16 SET @max = 1000000;
 17 SET @rc = 1;
 18 
 19 INSERT INTO Nums VALUES(1);
 20 WHILE @rc * 2 <= @max
 21 BEGIN
 22   INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
 23   SET @rc = @rc * 2;
 24 END
 25 
 26 INSERT INTO dbo.Nums
 27   SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;
 28 GO
 29 
 30 -- Drop Data Tables if Exist
 31 IF OBJECT_ID('dbo.Orders') IS NOT NULL
 32   DROP TABLE dbo.Orders;
 33 GO
 34 IF OBJECT_ID('dbo.Customers') IS NOT NULL
 35   DROP TABLE dbo.Customers;
 36 GO
 37 IF OBJECT_ID('dbo.Employees') IS NOT NULL
 38   DROP TABLE dbo.Employees;
 39 GO
 40 IF OBJECT_ID('dbo.Shippers') IS NOT NULL
 41   DROP TABLE dbo.Shippers;
 42 GO
 43 
 44 -- Data Distribution Settings
 45 DECLARE
 46   @numorders   AS INT,
 47   @numcusts    AS INT,
 48   @numemps     AS INT,
 49   @numshippers AS INT,
 50   @numyears    AS INT,
 51   @startdate   AS DATETIME;
 52 
 53 SELECT
 54   @numorders   =   1000000,
 55   @numcusts    =     20000,
 56   @numemps     =       500,
 57   @numshippers =         5,
 58   @numyears    =         4,
 59   @startdate   = '20030101';
 60 
 61 -- Creating and Populating the Customers Table
 62 CREATE TABLE dbo.Customers
 63 (
 64   custid   CHAR(11)     NOT NULL,
 65   custname NVARCHAR(50) NOT NULL
 66 );
 67 
 68 INSERT INTO dbo.Customers(custid, custname)
 69   SELECT
 70     'C' + RIGHT('000000000' + CAST(n AS VARCHAR(10)), 10) AS custid,
 71     N'Cust_' + CAST(n AS VARCHAR(10)) AS custname
 72   FROM dbo.Nums
 73   WHERE n <= @numcusts;
 74 
 75 ALTER TABLE dbo.Customers ADD
 76   CONSTRAINT PK_Customers PRIMARY KEY(custid);
 77 
 78 -- Creating and Populating the Employees Table
 79 CREATE TABLE dbo.Employees
 80 (
 81   empid     INT          NOT NULL,
 82   firstname NVARCHAR(25) NOT NULL,
 83   lastname  NVARCHAR(25) NOT NULL
 84 );
 85 
 86 INSERT INTO dbo.Employees(empid, firstname, lastname)
 87   SELECT n AS empid,
 88     N'Fname_' + CAST(n AS NVARCHAR(10)) AS firstname,
 89     N'Lname_' + CAST(n AS NVARCHAR(10)) AS lastname
 90   FROM dbo.Nums
 91   WHERE n <= @numemps;
 92 
 93 ALTER TABLE dbo.Employees ADD
 94   CONSTRAINT PK_Employees PRIMARY KEY(empid);
 95 
 96 -- Creating and Populating the Shippers Table
 97 CREATE TABLE dbo.Shippers
 98 (
 99   shipperid   VARCHAR(5)   NOT NULL,
100   shippername NVARCHAR(50) NOT NULL
101 );
102 INSERT INTO dbo.Shippers(shipperid, shippername)
103   SELECT shipperid, N'Shipper_' + shipperid AS shippername
104   FROM (SELECT CHAR(ASCII('A') - 2 + 2 * n) AS shipperid
105         FROM dbo.Nums
106         WHERE n <= @numshippers) AS D;
107 
108 ALTER TABLE dbo.Shippers ADD
109   CONSTRAINT PK_Shippers PRIMARY KEY(shipperid);
110 
111 -- Creating and Populating the Orders Table
112 CREATE TABLE dbo.Orders
113 (
114   orderid   INT        NOT NULL,
115   custid    CHAR(11)   NOT NULL,
116   empid     INT        NOT NULL,
117   shipperid VARCHAR(5) NOT NULL,
118   orderdate DATETIME   NOT NULL,
119   filler    CHAR(155)  NOT NULL DEFAULT('a')
120 );
121 
122 INSERT INTO dbo.Orders(orderid, custid, empid, shipperid, orderdate)
123   SELECT n AS orderid,
124     'C' + RIGHT('000000000'
125             + CAST(
126                 1 + ABS(CHECKSUM(NEWID())) % @numcusts
127                 AS VARCHAR(10)), 10) AS custid,
128     1 + ABS(CHECKSUM(NEWID())) % @numemps AS empid,
129     CHAR(ASCII('A') - 2
130            + 2 * (1 + ABS(CHECKSUM(NEWID())) % @numshippers)) AS shipperid,
131       DATEADD(day, n / (@numorders / (@numyears * 365.25)), @startdate)
132         -- late arrival with earlier date
133         - CASE WHEN n % 10 = 0
134             THEN   1 + ABS(CHECKSUM(NEWID())) % 30
135             ELSE 0
136           END 
137           AS orderdate
138   FROM dbo.Nums
139   WHERE n <= @numorders
140   ORDER BY CHECKSUM(NEWID());
141 
142 CREATE CLUSTERED INDEX idx_cl_od ON dbo.Orders(orderdate);
143 
144 CREATE NONCLUSTERED INDEX idx_nc_sid_od_cid
145   ON dbo.Orders(shipperid, orderdate, custid);
146 
147 CREATE UNIQUE INDEX idx_unc_od_oid_i_cid_eid
148   ON dbo.Orders(orderdate, orderid)
149   INCLUDE(custid, empid);
150 
151 CREATE NONCLUSTERED INDEX idx_nc_a0101_a0104_a0107
152 ON dbo.a01(a0101,a0104,a0107)
153 ALTER TABLE dbo.Orders ADD
154   CONSTRAINT PK_Orders PRIMARY KEY NONCLUSTERED(orderid),
155   CONSTRAINT FK_Orders_Customers
156     FOREIGN KEY(custid)    REFERENCES dbo.Customers(custid),
157   CONSTRAINT FK_Orders_Employees
158     FOREIGN KEY(empid)     REFERENCES dbo.Employees(empid),
159   CONSTRAINT FK_Orders_Shippers
160     FOREIGN KEY(shipperid) REFERENCES dbo.Shippers(shipperid);
161  

 

posted on 2013-04-25 17:33  PatrickWong  阅读(317)  评论(0编辑  收藏  举报