goo blog サービス終了のお知らせ 

I Love DB

DBを愛する人のブログ

インデックスは,従属オブジェクト?

2010-06-14 00:25:18 | 開発サイドから見たOracleとSQL Server
インデックスはオブジェクトです。しかし,テーブルが存在しなければインデックスだけがあっても無意味です。ということはインデックスというオブジェクトはテーブルの従属オブジェクトということもできそうです。このことはDDLに影響を与えます。OracleとSQL ServerのCreate IndexのDDLについては,ここでは述べません。面白いのはDROPの違いです。
<title>T-SQL:INDEXのDROP</title> <style type="text/css"> </style>
0001 /****** Object:  Index [IX_SAME]    Script Date: 06/14/2010 00:25:34 ******/
0002 IF EXISTS (
0003 SELECT *
0004 FROM sys.indexes
0005 WHERE OBJECT_ID = OBJECT_ID(N'[dbo].[TableA]')
0006 AND NAME = N'IX_SAME'
0007 )
0008 DROP INDEX [IX_SAME] ON [dbo].[TableA] WITH (ONLINE = OFF)
0009 GO
0010
SQL Serverでは,DROP INDEX インデックス名 ON テーブル名 というようにテーブル名も指定しないとDROPできません。
Oracleの場合は,単に,DROP INDEX インデックス名 でDROPすることができます。
この違いは,OracleはINDEXがDB中の単一のオブジェクトと見なされているのに対して,SQL Serverでは,あくまでもテーブルの従属オブジェクトであるということです。そのため,Oracleでは,異なるテーブルのインデックス名として同じ名前を付けることはできません。インデックス自体が独立したオブジェクトと見なされているからです。それに対してSQL Serverでは,このインデックスはエラーとなりません。以下のSQLはTableA, TableBを作成し,両テーブルに,インデックスIX_SAMEを定義します。SQL Serverでは正常終了します。
<title>SQL.sql</title> <style type="text/css"> </style>
0001 /****** Object:  Table [dbo].[TableA]    Script Date: 06/14/2010 00:07:30 ******/
0002 SET ANSI_NULLS ON
0003 GO
0004
0005 SET QUOTED_IDENTIFIER ON
0006 GO
0007
0008 CREATE TABLE [dbo].[TableA]
0009 (
0010 [AA] [int] NULL,
0011 [BB] [nchar](10) NULL
0012 ) ON [PRIMARY]
0013
0014 GO
0015
0016 /****** Object: Index [IX_SAME] Script Date: 06/14/2010 00:07:14 ******/
0017 CREATE NONCLUSTERED INDEX [IX_SAME] ON [dbo].[TableA]
0018 ([AA] ASC)WITH (
0019 PAD_INDEX = OFF,
0020 STATISTICS_NORECOMPUTE = OFF,
0021 SORT_IN_TEMPDB = OFF,
0022 IGNORE_DUP_KEY = OFF,
0023 DROP_EXISTING = OFF,
0024 ONLINE = OFF,
0025 ALLOW_ROW_LOCKS = ON,
0026 ALLOW_PAGE_LOCKS = ON
0027 ) ON [PRIMARY]
0028 GO
0029
0030 USE [AdventureWorks]
0031 GO
0032
0033 /****** Object: Table [dbo].[TableB] Script Date: 06/14/2010 00:10:24 ******/
0034 SET ANSI_NULLS ON
0035 GO
0036
0037 SET QUOTED_IDENTIFIER ON
0038 GO
0039
0040 CREATE TABLE [dbo].[TableB]
0041 (
0042 [AA] [int] NULL,
0043 [BB] [nchar](10) NULL
0044 ) ON [PRIMARY]
0045
0046 GO
0047
0048 /****** Object: Index [IX_SAME] Script Date: 06/14/2010 00:10:24 ******/
0049 CREATE NONCLUSTERED INDEX [IX_SAME] ON [dbo].[TableB]
0050 ([AA] ASC)WITH (
0051 PAD_INDEX = OFF,
0052 STATISTICS_NORECOMPUTE = OFF,
0053 SORT_IN_TEMPDB = OFF,
0054 IGNORE_DUP_KEY = OFF,
0055 DROP_EXISTING = OFF,
0056 ONLINE = OFF,
0057 ALLOW_ROW_LOCKS = ON,
0058 ALLOW_PAGE_LOCKS = ON
0059 ) ON [PRIMARY]
0060 GO
0061
片方になれると,もう片方のSQLがおかしく感じられます。不思議です。


コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。