下面是小编给大家带来关于作业员动态关爱表范文,本文共11篇,一起来看看吧,希望对您有所帮助。

篇1:动态打开一个表
程序名: useTable.prg
* 程序说明: 打开一个想要打开的表
* 变量说明: cTableName 要想打开的表的名称
* 使用说明: do usetable with “表1”
para cTableName
if !used('&cTableName')
use &cTableName in 0 share
endif
sele &cTableName
篇2:mysql数据库动态创建表
mysql数据库动态创建表
大家一般可能很少有这种需求吧,我以前也没有遇到过,但这次做项目需要这么做,
就是表的字段名和字段数都不是固定的,要根据需要来创建。
这是我的创建形成过程,大家照着演示一下就知道了我的动态表的来龙去脉了。
第一步.创建相关表
/*---建立所有指标信息的临时表---*/
drop table if exists INTERBANKBONDQUOTE_SClass;
create table INTERBANKBONDQUOTE_SClass (
Name varchar(50) not null,
id int Primary key,
Parent int,
Value varchar(50)
);
insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values('最新成交',0,'');
insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values('买入信息',1,'');
insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values('买卖价差',2,'');
insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values('卖出信息',3,'');
insert into INTERBANKBONDQUOTE_SClass(Name,id,Parent,Value)values('中债最新估值',4,-1,'');
insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values('含权债行权指标',5,'');
insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values('基础指标',6,'');
insert into INTERBANKBONDQUOTE_SClass(Name,id,Value)values('双边报价笔数',7,'');
insert into INTERBANKBONDQUOTE_SClass(Name,id,Parent,Value)values('报价方',8,1,'col4');
insert into INTERBANKBONDQUOTE_SClass(Name,id,Parent,Value)values('报价方会员号',9,1,'col5');
insert into INTERBANKBONDQUOTE_SClass(Name,id,Parent,Value)values('报价时间',10,1,'col6');
insert into INTERBANKBONDQUOTE_SClass(Name,id,Parent,Value)values('匿名',11,1,'col7');
第二步:/*---建立显示数据表格标题的表---*/
drop table if exists INTERBANKBONDQUOTE_T;
create table INTERBANKBONDQUOTE_T as select concat('\'',a.Name,',',b.Name,'\' __TITLE__',b.Value);
第三步: 这里有两种实现方法。因为在mysql中,这时的变量长度受到了限制 ,本来应该longtext足够长的,可实际只返回了限制长度的。如果字段太多了,就要用第二种方法。
存储过程A: 这里变量返回值长度受限,字段不多时可以。
DELIMITER $$
DROP PROCEDURE IF EXISTS `dzhappdb_bond`.`INTERBANKBONDQUOTE_TSP`$$
CREATE PROCEDURE INTERBANKBONDQUOTE_TSP
BEGIN
DECLARE objs1 TEXT;
DECLARE objs TEXT;
SELECT GROUP_CONCAT(col1) INTO objs1 FROM T;
SET objs =CONCAT('CREATE TABLE Title AS SELECT ',objs1);
SET @sql_txt = objs;
PREPARE stmt FROM @sql_txt;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
call INTERBANKBONDQUOTE_TSP;
存储过程B:这样不管字段多少,只要数据库支持就可以创建成功,
但不如第一个方法简洁。
DROP PROCEDURE IF EXISTS INTERBANKBONDQUOTE_TSP_Title;
drop table if EXISTS Title;
CREATE PROCEDURE INTERBANKBONDQUOTE_TSP_Title()
proc:begin
DECLARE add_sql LONGTEXT;
DECLARE insert_sql LONGTEXT;
DECLARE nhh_sql varchar(200);
DECLARE column_name varchar(100);
DECLARE column_value varchar(100);
DECLARE mycount int;
DECLARE len int;
DECLARE strlen int;
DECLARE cursor_Title CURSOR for select col1 from INTERBANKBONDQUOTE_T;
create table Title(mid int);
insert into Title values (100);
select count(col1) into @mycount from INTERBANKBONDQUOTE_T;
OPEN cursor_Title;
REPEAT
FETCH cursor_Title INTO nhh_sql;
begin
set @mycount=@mycount-1;
set @strlen=CHARACTER_LENGTH(nhh_sql);
set @len=INSTR(nhh_sql,' ');
set @column_name=RIGHT(nhh_sql,@strlen-@len);
set @column_value=LEFT(nhh_sql,@len);
set @add_sql=CONCAT('ALTER table Title add COLUMN ',@column_name,' varchar(100)');
set @insert_sql=CONCAT('update Title set ',@column_name,'=',@column_value,' where mid=100');
PREPARE stmt1 FROM @add_sql;
EXECUTE stmt1;
PREPARE stmt2 FROM @insert_sql;
EXECUTE stmt2;
DEALLOCATE PREPARE stmt1;
DEALLOCATE PREPARE stmt2;
end;
until @mycount<=0
END REPEAT;
CLOSE cursor_Title;
ALTER table Title drop column mid;
end proc;
call INTERBANKBONDQUOTE_TSP_Title;
篇3:动态关联表数据库教程
动态
原帖地址:
community.csdn.net/Expert/topic/3452/3452577.xml?temp=.1377375
--示例数据
create table [table](A sysname,B varchar(10))
insert [table] select 'table_1','a'
union all select 'table_2','b'
create table table_1(A int)
insert table_1 select 1
union all select 2
create table table_2(A int)
insert table_2 select 3
union all select 4
go
/*--问题说明:
table中,A字段存储着其他表的名称
A字段中,记录和各个表的A字段的最大值
即得到如下结果:
table.B C
-------- -----------
a 1
b 2
--*/
--处理方法
declare @s varchar(8000)
set @s=''
select @s=@s+' when '''+A+''' then(select max(A) from ['+A+'])'
from [table] group by A
exec('select B,C=case A'+@s+' end from [table]')
go
--删除测试
drop table [table],table_1,table_2
/*--测试结果
B C
---------- -----------
a 2
b 4
--*/
篇4:创建动态MSSQL数据库表
复制代码代码如下:
'btnCreateOthers
'
Me.btnCreateOthers.Location=NewSystem.Drawing.Point(17,43)
Me.btnCreateOthers.Name=“btnCreateOthers”
Me.btnCreateOthers.Size=NewSystem.Drawing.Size(104,23)
Me.btnCreateOthers.TabIndex=5
Me.btnCreateOthers.Text=“创建规则和索引”
feedom.net
'
'btnDropTable
'
Me.btnDropTable.Location=NewSystem.Drawing.Point(138,43)
Me.btnDropTable.Name=“btnDropTable”
Me.btnDropTable.TabIndex=6
Me.btnDropTable.Text=“删除表”
'
'btnViewData
'
Me.btnViewData.Location=NewSystem.Drawing.Point(351,43)
Me.btnViewData.Name=“btnViewData”
Me.btnViewData.TabIndex=7
Me.btnViewData.Text=“查看数据”
'
'btnViewSP
'
Me.btnViewSP.Location=NewSystem.Drawing.Point(230,43)
feedom.net
Me.btnViewSP.Name=“btnViewSP”
Me.btnViewSP.Size=NewSystem.Drawing.Size(104,23)
Me.btnViewSP.TabIndex=8
Me.btnViewSP.Text=“查看存储过程”
'
'btnViewView
'
Me.btnViewView.Location=NewSystem.Drawing.Point(443,43)
Me.btnViewView.Name=“btnViewView”
Me.btnViewView.TabIndex=9
Me.btnViewView.Text=“查看视图”
'
'DataGrid1
'
Me.DataGrid1.DataMember=“”
Me.DataGrid1.HeaderForeColor=System.Drawing.SystemColors.ControlText
Me.DataGrid1.Location=NewSystem.Drawing.Point(20,76)54com.cn
Me.DataGrid1.Name=“DataGrid1”
Me.DataGrid1.Size=NewSystem.Drawing.Size(500,183)
Me.DataGrid1.TabIndex=10
'
'Form1
'
Me.AutoScaleBaseSize=NewSystem.Drawing.Size(5,13)
Me.ClientSize=NewSystem.Drawing.Size(538,281)
Me.Controls.AddRange(NewSystem.Windows.Forms.Control{Me.DataGrid1,Me.btnViewView,_
Me.btnViewSP,Me.btnViewData,Me.btnDropTable,Me.btnCreateOthers,Me.btnAlterTable,_
复制代码代码如下:
Me.CreateViewBtn,Me.CreateSPBtn,Me.CreateTableBtn,Me.CreateDBBtn})
Me.Name=“Form1”
Me.Text=“动态创建SQLServer数据库、表、存储过程等架构信息”
CType(Me.DataGrid1,System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
EndSub
#EndRegion
'创建数据库
PrivateSubCreateDBBtn_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_
HandlesCreateDBBtn.Click
conn=NewSqlConnection(ConnectionString)
'打开连接
Ifconn.StateConnectionState.OpenThen
conn.Open()
EndIf
'MyDataBase为数据库名称
DimsqlAsString=“CREATEDATABASEMyDataBaseONPRIMARY(Name=MyDataBase_data,filename=”+_
54com.cn
“'D:\MyDataBase.mdf',size=3,”+“maxsize=5,filegrowth=10%)logon”+“(name=MyDataBase_log,”+_
“filename='D:\MyDataBase.ldf',size=3,”+“maxsize=20,filegrowth=1)”
cmd=NewSqlCommand(sql,conn)
Try
cmd.ExecuteNonQuery()
CatchaeAsSqlException
MessageBox.Show(ae.Message.ToString())
EndTry
EndSub
'创建表
PrivateSubCreateTableBtn_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)_
HandlesCreateTableBtn.Click
conn=NewSqlConnection(ConnectionString)
'打开连接
Ifconn.State=ConnectionState.OpenThen
conn.Close()
EndIf
ConnectionString=“DataSource=.;InitialCatalog=MyDataBase;UserId=sa;Password=;”
conn.ConnectionString=ConnectionString
conn.Open()
sql=“CREATETABLEmyTable”+“(myIdINTEGERCONSTRAINTPKeyMyIdPRIMARYKEY,”+_
“myNameCHAR(50)NOTNull,myAddressCHAR(255),myValuesFLOAT)”
cmd=NewSqlCommand(sql,conn)
Try
cmd.ExecuteNonQuery()
'添加纪录
54com.cn
sql=“INSERTINTOmyTable(myId,myName,myAddress,myValues)”+_
“VALUES(1001,_'【孟宪会之精彩世界】之一','xml.sz.luohuedu.net/',100)”
cmd=NewSqlCommand(sql,conn)
cmd.ExecuteNonQuery()
sql=“INSERTINTOmyTable(myId,myName,myAddress,myValues)”+_
“VALUES(1002,'【孟宪会之精彩世界】之二','www.erp800.com/net_lover/',99)”
篇5:创建动态MSSQL数据库表
以下是引用片段:
复制代码代码如下:
ImportsSystem.Data
ImportsSystem.Data.SqlClient
PublicClassForm1
InheritsSystem.Windows.Forms.Form
PrivateConnectionStringAsString=“DataSource=.;InitialCatalog=;UserId=sa;Password=;”
PrivatereaderAsSqlDataReader=Nothing
PrivateconnAsSqlConnection=Nothing
PrivatecmdAsSqlCommand=Nothing
PrivateAlterTableBtnAsSystem.Windows.Forms.Button
PrivatesqlAsString=Nothing
PrivateCreateOthersBtnAsSystem.Windows.Forms.Button
#Region“Windows窗体设计器生成的代码”
'窗体重写处置以清理组件列表,
ProtectedOverloadsOverridesSubDispose(ByValdisposingAsBoolean)
IfdisposingThen
IfNot(componentsIsNothing)Then
components.Dispose()
EndIf
EndIf
MyBase.Dispose(disposing)
EndSub
PublicSubNew()
MyBase.New()
InitializeComponent()
EndSub
PrivatecomponentsAsSystem.ComponentModel.IContainer
FriendWithEventsDataGrid1AsSystem.Windows.Forms.DataGrid
FriendWithEventsCreateDBBtnAsSystem.Windows.Forms.Button
FriendWithEventsCreateTableBtnAsSystem.Windows.Forms.Button
FriendWithEventsCreateSPBtnAsSystem.Windows.Forms.Button
FriendWithEventsCreateViewBtnAsSystem.Windows.Forms.Button
FriendWithEventsbtnAlterTableAsSystem.Windows.Forms.Button
FriendWithEventsbtnCreateOthersAsSystem.Windows.Forms.Button
FriendWithEventsbtnDropTableAsSystem.Windows.Forms.Button
FriendWithEventsbtnViewDataAsSystem.Windows.Forms.Button
FriendWithEventsbtnViewSPAsSystem.Windows.Forms.Button
FriendWithEventsbtnViewViewAsSystem.Windows.Forms.Button
PrivateSubInitializeComponent()
复制代码代码如下:
Me.CreateDBBtn=NewSystem.Windows.Forms.Button()
Me.CreateTableBtn=NewSystem.Windows.Forms.Button()
Me.CreateSPBtn=NewSystem.Windows.Forms.Button()
Me.CreateViewBtn=NewSystem.Windows.Forms.Button()
Me.btnAlterTable=NewSystem.Windows.Forms.Button()
Me.btnCreateOthers=NewSystem.Windows.Forms.Button()
Me.btnDropTable=NewSystem.Windows.Forms.Button()
Me.btnViewData=NewSystem.Windows.Forms.Button()
Me.btnViewSP=NewSystem.Windows.Forms.Button()
Me.btnViewView=NewSystem.Windows.Forms.Button()
Me.DataGrid1=NewSystem.Windows.Forms.DataGrid()
CType(Me.DataGrid1,System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'CreateDBBtn
'
Me.CreateDBBtn.Location=NewSystem.Drawing.Point(19,9)
Me.CreateDBBtn.Name=“CreateDBBtn”
Me.CreateDBBtn.Size=NewSystem.Drawing.Size(104,23)
Me.CreateDBBtn.TabIndex=0
Me.CreateDBBtn.Text=“创建数据库”
'
'CreateTableBtn
'
Me.CreateTableBtn.Location=NewSystem.Drawing.Point(139,9)
Me.CreateTableBtn.Name=“CreateTableBtn”
Me.CreateTableBtn.TabIndex=1
Me.CreateTableBtn.Text=“创建表”
'
'CreateSPBtn
'
Me.CreateSPBtn.Location=NewSystem.Drawing.Point(230,9)
Me.CreateSPBtn.Name=“CreateSPBtn”
Me.CreateSPBtn.Size=NewSystem.Drawing.Size(104,23)
Me.CreateSPBtn.TabIndex=2
Me.CreateSPBtn.Text=“创建存储过程”
'
'CreateViewBtn
'
Me.CreateViewBtn.Location=NewSystem.Drawing.Point(350,9)
Me.CreateViewBtn.Name=“CreateViewBtn”
Me.CreateViewBtn.TabIndex=3中国网管联盟www.bitscn.com
Me.CreateViewBtn.Text=“创建视图”
'
'btnAlterTable
'
Me.btnAlterTable.Location=NewSystem.Drawing.Point(441,9)
Me.btnAlterTable.Name=“btnAlterTable”
Me.btnAlterTable.TabIndex=4
Me.btnAlterTable.Text=“修改表”
篇6:动态创建MSSQL数据库表存储过程存储过程
下面是利用SQL语句创建数据库、表、存储过程、视图、索引、规则、修改表、查看数据等的方法,所要增加的控件如下:
以下是引用片段:ImportsSystem.Data
ImportsSystem.Data.SqlClient
PublicClassForm1
InheritsSystem.Windows.Forms.Form
PrivateConnectionStringAsString=“DataSource=.;InitialCatalog=;UserId=sa;Password=;”
PrivatereaderAsSqlDataReader=Nothing
PrivateconnAsSqlConnection=Nothing
PrivatecmdAsSqlCommand=Nothing
PrivateAlterTableBtnAsSystem.Windows.Forms.Button
PrivatesqlAsString=Nothing
PrivateCreateOthersBtnAsSystem.Windows.Forms.Button
#Region“Windows窗体设计器生成的代码”
'窗体重写处置以清理组件列表。
ProtectedOverloadsOverridesSubDispose(ByValdisposingAsBoolean)
IfdisposingThen
IfNot(componentsIsNothing)Then
components.Dispose
EndIf
EndIf
MyBase.Dispose(disposing)
EndSub
PublicSubNew()
MyBase.New()
InitializeComponent()
EndSub
PrivatecomponentsAsSystem.ComponentModel.IContainer
FriendWithEventsDataGrid1AsSystem.Windows.Forms.DataGrid
FriendWithEventsCreateDBBtnAsSystem.Windows.Forms.Button
FriendWithEventsCreateTableBtnAsSystem.Windows.Forms.Button
FriendWithEventsCreateSPBtnAsSystem.Windows.Forms.Button
FriendWithEventsCreateViewBtnAsSystem.Windows.Forms.Button
FriendWithEventsbtnAlterTableAsSystem.Windows.Forms.Button
FriendWithEventsbtnCreateOthersAsSystem.Windows.Forms.Button
FriendWithEventsbtnDropTableAsSystem.Windows.Forms.Button
FriendWithEventsbtnViewDataAsSystem.Windows.Forms.Button
FriendWithEventsbtnViewSPAsSystem.Windows.Forms.Button
FriendWithEventsbtnViewViewAsSystem.Windows.Forms.Button
Me.CreateDBBtn=NewSystem.Windows.Forms.Button()
Me.CreateTableBtn=NewSystem.Windows.Forms.Button()
Me.CreateSPBtn=NewSystem.Windows.Forms.Button()
Me.Cr
关 键 字:MYSQL
篇7:动态创建MSSQL数据库表存储过程
下面是利用SQL语句创建数据库、表、存储过程、视图、索引、规则、修改表、查看数据等的方法,所要增加的控件如下:
以下是引用片段:
Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form.
Private ConnectionString As String = “Data Source=.;Initial Catalog=;User Id=sa;Password=;”
Private reader As SqlDataReader = Nothing
Private conn As SqlConnection = Nothing
Private cmd As SqlCommand = Nothing
Private AlterTableBtn As System.Windows.Forms.Button
Private sql As String = Nothing
Private CreateOthersBtn As System.Windows.Forms.Button
#Region “ Windows 窗体设计器生成的代码 ”
'窗体重写处置以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose()
End If
End If
MyBase.Dispose(disposing)
End Sub
Public Sub New()
MyBase.New()
InitializeComponent()
End Sub
Private components As System.ComponentModel.IContainer
Friend WithEvents DataGrid1 As System.Windows.Forms.DataGrid
Friend WithEvents CreateDBBtn As System.Windows.Forms.Button
Friend WithEvents CreateTableBtn As System.Windows.Forms.Button
Friend WithEvents CreateSPBtn As System.Windows.Forms.Button
Friend WithEvents CreateViewBtn As System.Windows.Forms.Button
Friend WithEvents btnAlterTable As System.Windows.Forms.Button
Friend WithEvents btnCreateOthers As System.Windows.Forms.Button
Friend WithEvents btnDropTable As System.Windows.Forms.Button
Friend WithEvents btnViewData As System.Windows.Forms.Button
Friend WithEvents btnViewSP As System.Windows.Forms.Button
Friend WithEvents btnViewView As System.Windows.Forms.Button
Me.CreateDBBtn = New System.Windows.Forms.Button()
Me.CreateTableBtn = New System.Windows.Forms.Button()
Me.CreateSPBtn = New System.Windows.Forms.Button()
Me.CreateViewBtn = New System.Windows.Forms.Button()
Me.btnAlterTable = New System.Windows.Forms.Button()
Me.btnCreateOthers = New System.Windows.Forms.Button()
Me.btnDropTable = New System.Windows.Forms.Button()
Me.btnViewData = New System.Windows.Forms.Button()
Me.btnViewSP = New System.Windows.Forms.Button()
Me.btnViewView = New System.Windows.Forms.Button()
Me.DataGrid1 = New System.Windows.Forms.DataGrid()
CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'CreateDBBtn
'
Me.CreateDBBtn.Location = New System.Drawing.Point(19, 9)
Me.CreateDBBtn.Name = “CreateDBBtn”
Me.CreateDBBtn.Size = New System.Drawing.Size(104, 23)
Me.CreateDBBtn.TabIndex = 0
Me.CreateDBBtn.Text = “创建数据库”
'
'CreateTableBtn
'
Me.CreateTableBtn.Location = New System.Drawing.Point(139, 9)
Me.CreateTableBtn.Name = “CreateTableBtn”
Me.CreateTableBtn.TabIndex = 1
Me.CreateTableBtn.Text = “创建表”
'
'CreateSPBtn
'
Me.CreateSPBtn.Location = New System.Drawing.Point(230, 9)
Me.CreateSPBtn.Name = “CreateSPBtn”
Me.CreateSPBtn.Size = New System.Drawing.Size(104, 23)
Me.CreateSPBtn.TabIndex = 2
Me.CreateSPBtn.Text = “创建存储过程”
'
'CreateViewBtn
'
Me.CreateViewBtn.Location = New System.Drawing.Point(350, 9)
Me.CreateViewBtn.Name = “CreateViewBtn”
Me.CreateViewBtn.TabIndex = 3
Me.CreateViewBtn.Text = “创建视图”
'
'btnAlterTable
'
Me.btnAlterTable.Location = New System.Drawing.Point(441, 9)
Me.btnAlterTable.Name = “btnAlterTable”
Me.btnAlterTable.TabIndex = 4
Me.btnAlterTable.Text = “修改表”
'
'btnCreateOthers
'
Me.btnCreateOthers.Location = New System.Drawing.Point(17, 43)
Me.btnCreateOthers.Name = “btnCreateOthers”
Me.btnCreateOthers.Size = New System.Drawing.Size(104, 23)
Me.btnCreateOthers.TabIndex = 5
Me.btnCreateOthers.Text = “创建规则和索引”
'
'btnDropTable
'
Me.btnDropTable.Location = New System.Drawing.Point(138, 43)
Me.btnDropTable.Name = “btnDropTable”
Me.btnDropTable.TabIndex = 6
Me.btnDropTable.Text = “删除表”
'
'btnViewData
'
Me.btnViewData.Location = New System.Drawing.Point(351, 43)
Me.btnViewData.Name = “btnViewData”
Me.btnViewData.TabIndex = 7
Me.btnViewData.Text = “查看数据”
'
'btnViewSP
'
Me.btnViewSP.Location = New System.Drawing.Point(230, 43)
Me.btnViewSP.Name = “btnViewSP”
Me.btnViewSP.Size = New System.Drawing.Size(104, 23)
Me.btnViewSP.TabIndex = 8
Me.btnViewSP.Text = “查看存储过程”
'
'btnViewView
'
Me.btnViewView.Location = New System.Drawing.Point(443, 43)
Me.btnViewView.Name = “btnViewView”
Me.btnViewView.TabIndex = 9
Me.btnViewView.Text = “查看视图”
'
'DataGrid1
'
Me.DataGrid1.DataMember = “”
Me.DataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText
Me.DataGrid1.Location = New System.Drawing.Point(20, 76)
Me.DataGrid1.Name = “DataGrid1”
Me.DataGrid1.Size = New System.Drawing.Size(500, 183)
Me.DataGrid1.TabIndex = 10
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(538, 281)
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.DataGrid1, Me.btnViewView, _
Me.btnViewSP, Me.btnViewData, Me.btnDropTable, Me.btnCreateOthers, Me.btnAlterTable, _
Me.CreateViewBtn, Me.CreateSPBtn, Me.CreateTableBtn, Me.CreateDBBtn})
Me.Name = “Form1”
Me.Text = “动态创建SQL Server数据库、表、存储过程等架构信息”
CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
#End Region
' 创建数据库
Private Sub CreateDBBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles CreateDBBtn.Click
conn = New SqlConnection(ConnectionString)
' 打开连接
If conn.State ConnectionState.Open Then
conn.Open()
End If
'MyDataBase为数据库名称
Dim sql As String = “CREATE DATABASE MyDataBase ON PRIMARY (Name=MyDataBase_data, filename = ” + _
“'D:\MyDataBase.mdf', size=3,” + “maxsize=5, filegrowth=10%) log on” + “(name=MyDataBase_log, ” + _
“filename='D:\MyDataBase.ldf',size=3,” + “maxsize=20,filegrowth=1)”
cmd = New SqlCommand(sql, conn)
Try
cmd.ExecuteNonQuery()
Catch ae As SqlException
MessageBox.Show(ae.Message.ToString())
End Try
End Sub
'创建表
Private Sub CreateTableBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles CreateTableBtn.Click
conn = New SqlConnection(ConnectionString)
' 打开连接
If conn.State = ConnectionState.Open Then
conn.Close()
End If
ConnectionString = “Data Source=.;Initial Catalog=MyDataBase;User Id=sa;Password=;”
conn.ConnectionString = ConnectionString
conn.Open()
sql = “CREATE TABLE myTable” + “(myId INTEGER CONSTRAINT PKeyMyId PRIMARY KEY,” + _
“myName CHAR(50) NOT Null, myAddress CHAR(255), myValues FLOAT)”
cmd = New SqlCommand(sql, conn)
Try
cmd.ExecuteNonQuery()
' 添加纪录
sql = “INSERT INTO myTable(myId, myName, myAddress, myValues) ” + _
“VALUES (1001, _'【孟宪会之精彩世界】之一', 'xml.sz.luohuedu.net/', 100 ) ”
cmd = New SqlCommand(sql, conn)
cmd.ExecuteNonQuery()
sql = “INSERT INTO myTable(myId, myName, myAddress, myValues) ” + _
“VALUES (1002, '【孟宪会之精彩世界】之二', 'www.erp800.com/net_lover/', 99) ”
cmd = New SqlCommand(sql, conn)
cmd.ExecuteNonQuery()
sql = “INSERT INTO myTable(myId, myName, myAddress, myValues) ” + _
“VALUES (1003, '【孟宪会之精彩世界】之三', 'xml.sz.luohuedu.net/', 99) ”
cmd = New SqlCommand(sql, conn)
cmd.ExecuteNonQuery()
sql = “INSERT INTO myTable(myId, myName, myAddress, myValues) ” + _
“VALUES (1004, '【孟宪会之精彩世界】之四', 'www.erp800.com/net_lover/', 100) ”
cmd = New SqlCommand(sql, conn)
cmd.ExecuteNonQuery()
Catch ae As SqlException
MessageBox.Show(ae.Message.ToString())
End Try
End Sub
'创建存储过程
Private Sub CreateSPBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles CreateSPBtn.Click
sql = “CREATE PROCEDURE myProc AS” + “ SELECT myName, myAddress FROM myTable GO”
ExecuteSQLStmt(sql)
End Sub
'创建视图
Private Sub CreateViewBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles CreateViewBtn.Click
sql = “CREATE VIEW myView AS SELECT myName FROM myTable”
ExecuteSQLStmt(sql)
End Sub
'修改表
Private Sub btnAlterTable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnAlterTable.Click
sql = “ALTER TABLE MyTable ADD newCol datetime NOT NULL DEFAULT (getdate())”
ExecuteSQLStmt(sql)
End Sub
'创建规则和索引
Private Sub btnCreateOthers_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnCreateOthers.Click
sql = “CREATE UNIQUE INDEX ” + “myIdx ON myTable(myName)”
ExecuteSQLStmt(sql)
sql = “CREATE RULE myRule ” + “AS @myValues >= 90 AND @myValues < 9999”
ExecuteSQLStmt(sql)
End Sub
'删除表
Private Sub btnDropTable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnDropTable.Click
Dim sql As String = “DROP TABLE MyTable”
ExecuteSQLStmt(sql)
End Sub
'浏览表数据
Private Sub btnViewData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnViewData.Click
conn = New SqlConnection(ConnectionString)
If conn.State = ConnectionState.Open Then
conn.Close()
End If
ConnectionString = “Data Source=.;Initial Catalog=MyDataBase;User Id=sa;Password=;”
conn.ConnectionString = ConnectionString
conn.Open()
Dim da As New SqlDataAdapter(“SELECT * FROM myTable”, conn)
Dim ds As New DataSet(“myTable”)
da.Fill(ds, “myTable”)
DataGrid1.DataSource = ds.Tables(“myTable”).DefaultView
End Sub
'浏览存储过程
Private Sub btnViewSP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnViewSP.Click
conn = New SqlConnection(ConnectionString)
If conn.State = ConnectionState.Open Then
conn.Close()
End If
ConnectionString = “Data Source=.;Initial Catalog=MyDataBase;User Id=sa;Password=;”
conn.ConnectionString = ConnectionString
conn.Open()
Dim da As New SqlDataAdapter(“myProc”, conn)
Dim ds As New DataSet(“SP”)
da.Fill(ds, “SP”)
DataGrid1.DataSource = ds.DefaultViewManager
End Sub
'浏览视图
Private Sub btnViewView_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnViewView.Click
conn = New SqlConnection(ConnectionString)
If conn.State = ConnectionState.Open Then
conn.Close()
End If
ConnectionString = “Data Source=.;Initial Catalog=MyDataBase;User Id=sa;Password=;”
conn.ConnectionString = ConnectionString
conn.Open()
Dim da As New SqlDataAdapter(“SELECT * FROM myView”, conn)
Dim ds As New DataSet()
da.Fill(ds)
DataGrid1.DataSource = ds.DefaultViewManager
End Sub
Private Sub ExecuteSQLStmt(ByVal sql As String)
conn = New SqlConnection(ConnectionString)
' 打开连接
If conn.State = ConnectionState.Open Then
conn.Close()
End If
ConnectionString = “Data Source=.;Initial Catalog=MyDataBase;User Id=sa;Password=;”
conn.ConnectionString = ConnectionString
conn.Open()
cmd = New SqlCommand(sql, conn)
Try
cmd.ExecuteNonQuery()
Catch ae As SqlException
MessageBox.Show(ae.Message.ToString())
End Try
End Sub
End Class
篇8:怎样掌握MySQL数据库中动态表特征
如果一个MyISAM表包含任何可变长度列(VARCHAR, BLOB或TEXTDynamic),或者如果一个表被用ROW_FORMAT=DYNAMIC选项来创建,动态存储格式被使用,
这个格式更为复杂一点,因为每行有一个表明行有多长的头。当一个记录因为更新的结果被变得更长,该记录也可以在超过一个位置处结束。
你可以使用OPTIMIZE TABLE或myisamchk来对一个表整理碎片。如果在一个表中有你频繁访问或改变的固定长度列,表中也有一些可变长度列,仅为避免碎片而把这些可变长度列移到其它表可能是一个好主意。
动态格式表的一般特征:
· 除了长度少于4的列外,所有的字符串列是动态的。
· 在每个记录前面是一个位图,该位图表明哪一列包含空字符串(对于字符串列)或者0(对于数字列)。注意,这并不包括包含NULL值的列。如果一个字符列在拖曳空间移除后长度为零,或者一个数字列为零值,这都在位图中标注了且列不被保存到磁盘。 非空字符串被存为一个长度字节加字符串的内容。
· 通常比固定长度表需要更少的磁盘空间。
· 每个记录仅使用必需大小的空间,
尽管如此,如果一个记录变大,它就按需要被分开成多片,造成记录碎片的后果。比如,你用扩展行长度的信息更新一行,该行就变得有碎片。在这种情况下,你可以时不时运行OPTIMIZE TABLE或myisamchk -r来改善性能。可使用myisamchk -ei来获取表的统计数据。
· 动态格式表在崩溃后要比静态格式表更难重建,因为一个记录可能被分为多个碎片且链接(碎片)可能被丢失。
· 动态尺寸记录期望的行长度用下列表达式来计算:
·3
·+ (number of columns + 7) / 8
·+ (number of char columns)
·+ (packed size of numeric columns)
·+ (length of strings)
·+ (number of NULL columns + 7) / 8
对每个链接需要额外的6字节。在一个更新导致一个记录的扩大之时,一个动态记录被链接了。每个新链接至少是20字节,所以下一个扩大可能在同样的链接里进行。如果不是,则另一个链接将被建立。你可以使用myisamchk -ed来找出链接的数目。所有的链接可以用myisamchk -r来移除。
篇9:动态创建SQL Server数据库、表、存储过程数据库教程
server|创建|存储过程|动态|数据|数据库
下面是利用SQL语句创建数据库、表、存储过程、视图、索引、规则、修改表、查看数据等的方法,所要增加的控件如下:
Imports System.Data
Imports System.Data.SqlClient
Public Class Form1
Inherits System.Windows.Forms.Form
Private ConnectionString As String = “Data Source=.;Initial Catalog=;User Id=sa;Password=;”
Private reader As SqlDataReader = Nothing
Private conn As SqlConnection = Nothing
Private cmd As SqlCommand = Nothing
Private AlterTableBtn As System.Windows.Forms.Button
Private sql As String = Nothing
Private CreateOthersBtn As System.Windows.Forms.Button
#Region “ Windows 窗体设计器生成的代码 ”
'窗体重写处置以清理组件列表。
Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
If disposing Then
If Not (components Is Nothing) Then
components.Dispose
End If
End If
MyBase.Dispose(disposing)
End Sub
Public Sub New()
MyBase.New()
InitializeComponent()
End Sub
Private components As System.ComponentModel.IContainer
Friend WithEvents DataGrid1 As System.Windows.Forms.DataGrid
Friend WithEvents CreateDBBtn As System.Windows.Forms.Button
Friend WithEvents CreateTableBtn As System.Windows.Forms.Button
Friend WithEvents CreateSPBtn As System.Windows.Forms.Button
Friend WithEvents CreateViewBtn As System.Windows.Forms.Button
Friend WithEvents btnAlterTable As System.Windows.Forms.Button
Friend WithEvents btnCreateOthers As System.Windows.Forms.Button
Friend WithEvents btnDropTable As System.Windows.Forms.Button
Friend WithEvents btnViewData As System.Windows.Forms.Button
Friend WithEvents btnViewSP As System.Windows.Forms.Button
Friend WithEvents btnViewView As System.Windows.Forms.Button
Me.CreateDBBtn = New System.Windows.Forms.Button()
Me.CreateTableBtn = New System.Windows.Forms.Button()
Me.CreateSPBtn = New System.Windows.Forms.Button()
Me.CreateViewBtn = New System.Windows.Forms.Button()
Me.btnAlterTable = New System.Windows.Forms.Button()
Me.btnCreateOthers = New System.Windows.Forms.Button()
Me.btnDropTable = New System.Windows.Forms.Button()
Me.btnViewData = New System.Windows.Forms.Button()
Me.btnViewSP = New System.Windows.Forms.Button()
Me.btnViewView = New System.Windows.Forms.Button()
Me.DataGrid1 = New System.Windows.Forms.DataGrid()
CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).BeginInit()
Me.SuspendLayout()
'
'CreateDBBtn
'
Me.CreateDBBtn.Location = New System.Drawing.Point(19, 9)
Me.CreateDBBtn.Name = “CreateDBBtn”
Me.CreateDBBtn.Size = New System.Drawing.Size(104, 23)
Me.CreateDBBtn.TabIndex = 0
Me.CreateDBBtn.Text = “创建数据库”
'
'CreateTableBtn
'
Me.CreateTableBtn.Location = New System.Drawing.Point(139, 9)
Me.CreateTableBtn.Name = “CreateTableBtn”
Me.CreateTableBtn.TabIndex = 1
Me.CreateTableBtn.Text = “创建表”
'
'CreateSPBtn
'
Me.CreateSPBtn.Location = New System.Drawing.Point(230, 9)
Me.CreateSPBtn.Name = “CreateSPBtn”
Me.CreateSPBtn.Size = New System.Drawing.Size(104, 23)
Me.CreateSPBtn.TabIndex = 2
Me.CreateSPBtn.Text = “创建存储过程”
'
'CreateViewBtn
'
Me.CreateViewBtn.Location = New System.Drawing.Point(350, 9)
Me.CreateViewBtn.Name = “CreateViewBtn”
Me.CreateViewBtn.TabIndex = 3
Me.CreateViewBtn.Text = “创建视图”
'
'btnAlterTable
'
Me.btnAlterTable.Location = New System.Drawing.Point(441, 9)
Me.btnAlterTable.Name = “btnAlterTable”
Me.btnAlterTable.TabIndex = 4
Me.btnAlterTable.Text = “修改表”
'
'btnCreateOthers
'
Me.btnCreateOthers.Location = New System.Drawing.Point(17, 43)
Me.btnCreateOthers.Name = “btnCreateOthers”
Me.btnCreateOthers.Size = New System.Drawing.Size(104, 23)
Me.btnCreateOthers.TabIndex = 5
Me.btnCreateOthers.Text = “创建规则和索引”
'
'btnDropTable
'
Me.btnDropTable.Location = New System.Drawing.Point(138, 43)
Me.btnDropTable.Name = “btnDropTable”
Me.btnDropTable.TabIndex = 6
Me.btnDropTable.Text = “删除表”
'
'btnViewData
'
Me.btnViewData.Location = New System.Drawing.Point(351, 43)
Me.btnViewData.Name = “btnViewData”
Me.btnViewData.TabIndex = 7
Me.btnViewData.Text = “查看数据”
'
'btnViewSP
'
Me.btnViewSP.Location = New System.Drawing.Point(230, 43)
Me.btnViewSP.Name = “btnViewSP”
Me.btnViewSP.Size = New System.Drawing.Size(104, 23)
Me.btnViewSP.TabIndex = 8
Me.btnViewSP.Text = “查看存储过程”
'
'btnViewView
'
Me.btnViewView.Location = New System.Drawing.Point(443, 43)
Me.btnViewView.Name = “btnViewView”
Me.btnViewView.TabIndex = 9
Me.btnViewView.Text = “查看视图”
'
'DataGrid1
'
Me.DataGrid1.DataMember = “”
Me.DataGrid1.HeaderForeColor = System.Drawing.SystemColors.ControlText
Me.DataGrid1.Location = New System.Drawing.Point(20, 76)
Me.DataGrid1.Name = “DataGrid1”
Me.DataGrid1.Size = New System.Drawing.Size(500, 183)
Me.DataGrid1.TabIndex = 10
'
'Form1
'
Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13)
Me.ClientSize = New System.Drawing.Size(538, 281)
Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.DataGrid1, Me.btnViewView, _
Me.btnViewSP, Me.btnViewData, Me.btnDropTable, Me.btnCreateOthers, Me.btnAlterTable, _
Me.CreateViewBtn, Me.CreateSPBtn, Me.CreateTableBtn, Me.CreateDBBtn})
Me.Name = “Form1”
Me.Text = “动态创建SQL Server数据库、表、存储过程等架构信息”
CType(Me.DataGrid1, System.ComponentModel.ISupportInitialize).EndInit()
Me.ResumeLayout(False)
End Sub
#End Region
' 创建数据库
Private Sub CreateDBBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles CreateDBBtn.Click
conn = New SqlConnection(ConnectionString)
' 打开连接
If conn.State ConnectionState.Open Then
conn.Open()
End If
'MyDataBase为数据库名称
Dim sql As String = “CREATE DATABASE MyDataBase ON PRIMARY (Name=MyDataBase_data, filename = ” + _
“'D:\MyDataBase.mdf', size=3,” + “maxsize=5, filegrowth=10%) log on” + “(name=MyDataBase_log, ” + _
“filename='D:\MyDataBase.ldf',size=3,” + “maxsize=20,filegrowth=1)”
cmd = New SqlCommand(sql, conn)
Try
cmd.ExecuteNonQuery()
Catch ae As SqlException
MessageBox.Show(ae.Message.ToString())
End Try
End Sub
'创建表
Private Sub CreateTableBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles CreateTableBtn.Click
conn = New SqlConnection(ConnectionString)
' 打开连接
If conn.State = ConnectionState.Open Then
conn.Close()
End If
ConnectionString = “Data Source=.;Initial Catalog=MyDataBase;User Id=sa;Password=;”
conn.ConnectionString = ConnectionString
conn.Open()
sql = “CREATE TABLE myTable” + “(myId INTEGER CONSTRAINT PKeyMyId PRIMARY KEY,” + _
“myName CHAR(50) NOT Null, myAddress CHAR(255), myValues FLOAT)”
cmd = New SqlCommand(sql, conn)
Try
cmd.ExecuteNonQuery()
' 添加纪录
sql = “INSERT INTO myTable(myId, myName, myAddress, myValues) ” + _
“VALUES (1001, _'【孟宪会之精彩世界】之一', 'xml.sz.luohuedu.net/', 100 ) ”
cmd = New SqlCommand(sql, conn)
cmd.ExecuteNonQuery()
sql = “INSERT INTO myTable(myId, myName, myAddress, myValues) ” + _
“VALUES (1002, '【孟宪会之精彩世界】之二', 'www.erp800.com/net_lover/', 99) ”
cmd = New SqlCommand(sql, conn)
cmd.ExecuteNonQuery()
sql = “INSERT INTO myTable(myId, myName, myAddress, myValues) ” + _
“VALUES (1003, '【孟宪会之精彩世界】之三', 'xml.sz.luohuedu.net/', 99) ”
cmd = New SqlCommand(sql, conn)
cmd.ExecuteNonQuery()
sql = “INSERT INTO myTable(myId, myName, myAddress, myValues) ” + _
“VALUES (1004, '【孟宪会之精彩世界】之四', 'www.erp800.com/net_lover/', 100) ”
cmd = New SqlCommand(sql, conn)
cmd.ExecuteNonQuery()
Catch ae As SqlException
MessageBox.Show(ae.Message.ToString())
End Try
End Sub
'创建存储过程
Private Sub CreateSPBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles CreateSPBtn.Click
sql = “CREATE PROCEDURE myProc AS” + “ SELECT myName, myAddress FROM myTable GO”
ExecuteSQLStmt(sql)
End Sub
'创建视图
Private Sub CreateViewBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles CreateViewBtn.Click
sql = “CREATE VIEW myView AS SELECT myName FROM myTable”
ExecuteSQLStmt(sql)
End Sub
'修改表
Private Sub btnAlterTable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnAlterTable.Click
sql = “ALTER TABLE MyTable ADD newCol datetime NOT NULL DEFAULT (getdate())”
ExecuteSQLStmt(sql)
End Sub
'创建规则和索引
Private Sub btnCreateOthers_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnCreateOthers.Click
sql = “CREATE UNIQUE INDEX ” + “myIdx ON myTable(myName)”
ExecuteSQLStmt(sql)
sql = “CREATE RULE myRule ” + “AS @myValues >= 90 AND @myValues < 9999”
ExecuteSQLStmt(sql)
End Sub
'删除表
Private Sub btnDropTable_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnDropTable.Click
Dim sql As String = “DROP TABLE MyTable”
ExecuteSQLStmt(sql)
End Sub
'浏览表数据
Private Sub btnViewData_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnViewData.Click
conn = New SqlConnection(ConnectionString)
If conn.State = ConnectionState.Open Then
conn.Close()
End If
ConnectionString = “Data Source=.;Initial Catalog=MyDataBase;User Id=sa;Password=;”
conn.ConnectionString = ConnectionString
conn.Open()
Dim da As New SqlDataAdapter(“SELECT * FROM myTable”, conn)
Dim ds As New DataSet(“myTable”)
da.Fill(ds, “myTable”)
DataGrid1.DataSource = ds.Tables(“myTable”).DefaultView
End Sub
'浏览存储过程
Private Sub btnViewSP_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnViewSP.Click
conn = New SqlConnection(ConnectionString)
If conn.State = ConnectionState.Open Then
conn.Close()
End If
ConnectionString = “Data Source=.;Initial Catalog=MyDataBase;User Id=sa;Password=;”
conn.ConnectionString = ConnectionString
conn.Open()
Dim da As New SqlDataAdapter(“myProc”, conn)
Dim ds As New DataSet(“SP”)
da.Fill(ds, “SP”)
DataGrid1.DataSource = ds.DefaultViewManager
End Sub
'浏览视图
Private Sub btnViewView_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles btnViewView.Click
conn = New SqlConnection(ConnectionString)
If conn.State = ConnectionState.Open Then
conn.Close()
End If
ConnectionString = “Data Source=.;Initial Catalog=MyDataBase;User Id=sa;Password=;”
conn.ConnectionString = ConnectionString
conn.Open()
Dim da As New SqlDataAdapter(“SELECT * FROM myView”, conn)
Dim ds As New DataSet()
da.Fill(ds)
DataGrid1.DataSource = ds.DefaultViewManager
End Sub
Private Sub ExecuteSQLStmt(ByVal sql As String)
conn = New SqlConnection(ConnectionString)
' 打开连接
If conn.State = ConnectionState.Open Then
conn.Close()
End If
ConnectionString = “Data Source=.;Initial Catalog=MyDataBase;User Id=sa;Password=;”
conn.ConnectionString = ConnectionString
conn.Open()
cmd = New SqlCommand(sql, conn)
Try
cmd.ExecuteNonQuery()
Catch ae As SqlException
MessageBox.Show(ae.Message.ToString())
End Try
End Sub
End Class
篇10:Informix动态服务器表分片策略的计划和调整
“数据分片”允许在表一级对数据存储进行控制,“表分片”是INFORMIX数据库的一个特征。用户可以对表中的记录或索引进行分组,并且存储在不同的位置,这样可以将数据存储到多个磁盘上,从而减少对磁盘I/O的竞争。数据分片的方案以及分片数据所存放的一组dbspace构成了“分片策略”。数据分片有两种基本类型:基于轮转分片“和 ”基于表达式分片”,对于“基于轮转法分片”,正如其名字一样,数据是根据轮转法方式存入表中的。“基于表达式分片”则根据表中的一个或多个字段对分片的规则进行定义。一般在预知查询条件时采用这种方式,从而避免查询中对某些分片的扫描。
对“表中的数据”和“索引”进行分片主要是为了提高应程序的效率,由于INFORMIX动态服务器可以并行地扫描多个磁盘上的数据,从而实现内部查询的并行操作,因此采用”分片“技术可以提高查询效率。内部查询的并行化有助于减少对一个复杂查询的响应时间。”表分片“技术与并行数据查询(PDQ)特征联系在一起使用,这样INFORMIX服务器可以分配多条线索。从所有数据分片上并行地选取数据。此外,还可以仅仅对包含“目标数据”的数据分片进行扫描。从而大幅度地提高了整个系统效率。“DATASKIP“这一个特征还允许用户跳过那些出现故障或者不包含“目标数据”的数据分片,当某些数据所在的盘出现故障时,就可以体现出高度的“数据可获得性” 我们通过大量的数据分片将数据分布在许多的磁盘上,也实现了外部查询的并行操作。这样在大量用户对同一个表进行访问时,可以减少I/O的竞争,每秒钟完成的事务数(系统吞吐能力)也得到了提高。“表分片”技术还通过对存储在dbspace上的数据分片进行备份/恢复操作。
分片方案
在“创建表”和“创建索引”时候均可以用到分片方案。索引可以附加在与其相关联的数据上,或与数据分离存放。一个索引如果出现在对表数据的分片方案中,就可以认为索引已经附加在数据上。另外一个方面,如果索引的分片方案与数据不同,就称为索引与数据分离。这种情况下,索引存放在指定的dbspace上。
“数据分片”方式主要有两种:“基于轮转法”和“基于表达式”的方案,
转法方案
轮转法(PR)所使用的分片规则是系统内部定义的。使用这种方案,新追加的记录被存放在轮转法方式指定的下一个数据分片。记录所插入的第一个数据分片也是随机选定,例如,下列语法用于创建一个名为xyz的表:
CREATE TABLE xyz FRAGMENT BY ROUND ROBIN
IN dbspace1,dbspace2......dbspaceN
INFORMIX不支持用轮转法方式创建索引,因为这样会降低系统性能。轮转法方案的优点在于各数据分片上数据量是比较均匀的,对记录进行更新时,并不需要对记录进行转移。然而轮转法有一个缺陷,在进行一个查询时,要扫描所有的数据分片 。因此,轮转法方案不支持DATASKIP,不允许INFORMIX动态服务器越过某个数据分片。如果不支持DATASKIP,同时又有一个数据分片出现错误,那么整个查询将会失败,因为不能确定出现故障的数据分片上是否有符合条件的数据记录存在。轮转法方案适用的情况是:用户需要快速加载数据,用户预先不知道数据访问的方式。用户的数据经常更新,或者是用户对于数据分布方式未知。
“基于表达式”的分片方式
对于“基于表达式的分片方案“,用户可以用下面两种规则对数据进行分片”
◆范围规则
◆绝对规则
范围规则
范围规则用SQL的关系或逻辑操作定义表的数据分片的边界。范围规则可以包含关系操作符,比如 >;,<,>;=,<=,还可以包含一些逻辑操作符,比如AND。范围规则最好根据表的某一个字段进行分片,但也可以根据两个或者多个字段进行分片。下面的分片实例运行效率并不很高,因为向表中插入一行时候需要进行太多的运算。所有不符合表达式条件的记录将 存放在REMAINDER dbspace中。基于“范围表达式”的分片方案可以确保只对包含目标数据的数据分片进行扫描。
下面是一个采用“基于范围表达式分片方案”创建表的例子:
CREATE TABLE xyz (aa integer....)
FRAGMENT BY EXPRESSION
aa<=100 IN dbspace1
aa>;1000 AND aa< IN dbspace2
REMAINDER IN dbspace3
绝对规则
“绝对规则”使用了SQL的关系与逻辑操作符。与“范围规则”不同,“绝对规则”运行用户采用关系操作符与逻辑操作符对规则进行定义。此外,表中可以有多个字段参与分片。
例: FRAGMENT BY EXAMPLE
zipcode=94536 OR zipcode=94538 IN dbspace
zipcode=94025 OR zipcode=92310 IN dbspace
REMAIDER IN dbspace3
对于以上这种分片方案,必须知道每一个邮政编码所联系的数据个数,以确保每个数据分片上的数据量比较平衡,从而使INFORMIX动态服务器减少扫描的数据分片的数目。指定分片方案时,要确保数据分片之间不互相重叠。此外,定义数据分片时可以不包括REMAINDER分片。
分片的基本原则
“数据分片”的表达式必须尽可能简单,因为执行较复杂的表达式将加重CPU的负荷。同时,数据库中并不是每一个表都需要分片,除非能从“数据分片”中得到显著的收益。“分片”的表达式因为能确保磁盘I/O操作均衡,尽管我们没必要制定一个均衡的数据分片方案。如果大量的查询只对表数据中很小的区域进行访问,那么应该用表达式将那些被频繁访问的数据分片到多个盘上,尽管这样的分片也许数据量并不均衡。表达式应该把限制性最强的部分放在前面。对表达式进行修正是为了减少表达式的计算量,减少每次访问的数据量,从而最终减轻CPU的负荷。如果表达式中第一个不等式的结果为假,那么整个表达式的结果也将为假,因此不必计算表达式的其它部分(AND表达式)。比如说,为了插入数值25,下列表达式需要计算6个不等式:
x>;=1 and x<=10 in dbspace1
x>;10 and x<=20 in dbspace2
x>;20 and x<=30 in dbspace3
如果用如下表达式,则只需要计算4个不等式:
x<=10 and x>;=1 in dbspace1
x<=20 and x>;10 in dbspace2
x<=30 and x>;20 in dbspace3
分片的表达式中应该避免数据类型的转换,
例如,日期数据类型在表达式中内部转换为整数类型。对于频繁更新的字段进行分片,会带来许多管理上附加工作。例如,如果根据一个日期字段进行分片,而超过保存日期的记录被删除,那么包含”超期数据”的数据分片将最终变空。这样就需要删除旧的数据分片,并为最新日期的记录创建一个新的数据分片。
“分片”策略的设计
一个“分片”策略包含数据分布方案以及数据分片所存放的一组dbspace。制定“数据分片”策略时需要根据分片的目标以及数据库的信息,诸如硬件/软件特性、查询特性、数据分布等作出决策。同时还需要知道一个现存的未分片数据库是否做转换,以及是否需要临时创建相应的应用程序。在前面的例子中,已经预知查询的方式,则可以加以利用。我们还应考虑到查询方式在将来的不断变化,诸如数据库的区域和/或帐户的附加部分,这一点也很重要。
“数据分片”的目标包括最大程度的内部查询并行化、外部查询并行化、提高数据可用性、更细的备份/恢复粒度以及更强的数据加载效率。
数据分片获得“内部查询并行化”:是指INFORMIX动态服务器充分发挥“数据分片”与PDQ功能的优势,并行地处理一个复杂的查询。这是决策支持系统(DSS)一类应用程序的主要目标。DSS查询从一个表中顺序读出大量数据记录。我们推荐使用数据分片。选择“轮转法”分片方案还是“基于表达式”的分片方案取决于查询特征、数据分布等因素,一般来说,当用户不能确定根据表中哪一个字段做“基于表达式”的分片,从而保持数据分片的均衡,或者不知道数据访问的方式时,我们推荐采用“轮转法”方式。“轮转法”方式不支持对索引的分片,因为扫描线索要越过分片的边界去读取索引,这样会导致效率的下降。“分片策略”还应该确保数据均衡的分布在不同的数据分片上,确保并行顺序扫描能均衡地完成。 示莘制获得“外部查询的并行化”:是指在大量用户运行较小的查询、返回少量的数据的条件下,INFORMIX动态服务器最大程度提高性能的能力。一般来讲,对于“存在大量用户,需要实时响应的应用程序,称为联机事务处理(OLTP)。OLTP查询总是在同一时间访问数据的一小部分区域,总是随机地对一些数据行进行更新或者删除操作。这些操作总是和”索引扫描”有关。在这种情况下,应该用表达式将数据表和索引表进行分片,从而允许查询在扫描过程过中某些数据分片。如果不考虑I/O竞争,数据分片和索引分片可以在同一个盘上,并使用同样的“分片”策略。另一方面,在一个大系统中如果额外有空余的盘,并且磁盘I/O可能成为潜在的瓶颈,那么最后将索引单独建在一块盘上。调换一下顺序,当按照某一字段创建索引时候,如果每一个查询都根据同一字段访问数据时,我们也可以使用与“数据分片”不相同的策略对索引进行分片。这种情况下,最好在WHERE子句中使用另外一个字段,“分片”策略的理想化程度取决于数据的分布和对表的查询的分布情况。我们的目标通过数据分布消除I/O瓶颈,尽管每个数据分片上的数据量可能不太均匀。
数据分片增强“数据可获得性”:是指可以在某些数据分片发生故障的时候,数据库仍然能接受应用程序的查询请求。这种能力是有INFORMIX动态服务器的DATASKIP特征提供的。
数据分片“增强数据加载的性能”:尤其适用于”周期性地加载几个G的数据,从而需要快速加载技术”的大型应用程序。将数据 分片到不同的磁盘上,可以使数据自动地进行并行加载,这是通过使用多个I/O流向数据分片所驻留的磁盘上写数据而达到的。轮转法分片方案应该最能保证快速数据加载,因为复杂表达式的计算会加重CPU的负荷,如果采取较简单的表达式并将每个数据分片放在单独的盘上,用“基于表达式”的分片方案同样可以保证快速加载数据。
以下是“确定合理的分片策略”所必须的步骤:
硬件/软件特征
要搞清楚硬件平台,如CPU的速度,数目,磁盘数目,大小,磁盘控制器的数目,以及与每个控制器相连接的磁盘数目,等等。这些信息对于确认表分片的数目以及怎样存放数据分片以减少I/O竞争,都是十分有用的。除了可用的磁盘外,对于每个表的数据分片的数目都有一定的上限,这些限制与分片的目标有关,如果分片的主要目的是增强内部查询的并行程度,那么系统CPU的数目和数据总线的带宽将限制一个表所能得到的并行线索的最大数目。另一个方面,如果分片的主要目标是增强外部查询的并行程度,那么分片的数目可大于CPU的数目,从而保证数据分布在许多磁盘上,在OLTP条件下可以允许用户并发地访问不同的磁盘,然而,当数据分片的容量变小的时候,应用程序会寻找多个数据分片,同时对寻找的结果进行合并。这些都会降低查询的效率。
对于具有高速CPU和低速盘的系统,每个表的分片数目可以超过物理CPU的实际个数。
所选的硬件平台 的操作系统类型和编译器对选择“分片”方案也是一个重要的因素。有的操作系统擅长处理MOD操作以及数据类型转换。
了解查询的特征
要了解一个应用程序到底是OLTP还是DSS类型,还要了解SELECT语句查询用的频繁还是update/delete操作频繁。如果查询多用SELECT语句,还要确定带有 “group by”,“order by”等复杂子句查询的执行频度。对于这些情况的了解有助于平衡I/O,消除瓶颈。检查每个SELECT 查询的选择性以及返回数据的比例。如果一个查询的选择性(selectivity)很大,就需要为查询创建索引。检查有无JOIN操作,并确认JOIN操作的主码是什么。如果在DSS查询中总对某一特定的表进行JOIN操作,那么这个表应该被分片到不同的磁盘上以避免I/O瓶颈。检查每个查询的查询条件。最后将所涉及的表中的字段画一个矩阵。接着将某一查询中用做查询条件的字段填上“+”字符。有了这个矩阵,我们可确认在所有的查询中,哪个查询条件最常用。这一信息与每一查询的执行频度一起,有助于确认对哪个字段做“基于表达式的分片”收益最大。检查数据是怎样被访问的,即数据是通过“顺序读取”还是通过“INDEX SCAN“被访问。为每一个查询配备“SET EXPLAIN” 子句,加上表的模式信息,可以达到以上目标。
数据分布及特征
确认表中用户查询条件的字段的取值范围。确认表中每一取值范围内符合记录的个数。在许多DSS类应用程序中,结果是从几个GB的数据或几个月,甚至一年的数据中得出来的。在这种条件下,很容易确认某一州,某个城市的记录数,或者是整个月的数据供以后使用。如果大多数查询将某个州和某月作为筛选条件,那么这些字段是参与”基于表达式”的分片方式的最佳选择。此外,还应了解表中数据被修改的速率,诸如增、删、改等。
篇11:Informix动态服务器表分片策略的计划和调整数据库
“数据分片”允许在表一级对数据存储进行控制,“表分片”是INFOR MI X 数据库 的一个特征。用户可以对表中的记录或索引进行分组,并且存储在不同的位置,这样可以将数据存储到多个磁盘上,从而减少对磁盘I/O的竞争。数据分片的方案以及分片数据所存放的一组
“数据分片”允许在表一级对数据存储进行控制。“表分片”是INFORMIX数据库的一个特征。用户可以对表中的记录或索引进行分组,并且存储在不同的位置,这样可以将数据存储到多个磁盘上,从而减少对磁盘I/O的竞争。数据分片的方案以及分片数据所存放的一组dbspace构成了“分片策略”。数据分片有两种基本类型:基于轮转分片“和”基于表达式分片”,对于“基于轮转法分片”,正如其名字一样,数据是根据轮转法方式存入表中的。“基于表达式分片”则根据表中的一个或多个字段对分片的规则进行定义。一般在预知查询条件时采用这种方式,从而避免查询中对某些分片的扫描。
对“表中的数据”和“索引”进行分片主要是为了提高应程序的效率,由于INFORMIX动态服务器可以并行地扫描多个磁盘上的数据,从而实现内部查询的并行操作,因此采用”分片“技术可以提高查询效率。内部查询的并行化有助于减少对一个复杂查询的响应时间。”表分片“技术与并行数据查询(PDQ)特征联系在一起使用,这样INFORMIX服务器可以分配多条线索。从所有数据分片上并行地选取数据。此外,还可以仅仅对包含“目标数据”的数据分片进行扫描。从而大幅度地提高了整个系统效率。“DATASKIP“这一个特征还允许用户跳过那些出现故障或者不包含“目标数据”的数据分片,当某些数据所在的盘出现故障时,就可以体现出高度的“数据可获得性”我们通过大量的数据分片将数据分布在许多的磁盘上,也实现了外部查询的并行操作。这样在大量用户对同一个表进行访问时,可以减少I/O的竞争,每秒钟完成的事务数(系统吞吐能力)也得到了提高。“表分片”技术还通过对存储在dbspace上的数据分片进行备份/恢复操作。
分片方案
在“创建表”和“创建索引”时候均可以用到分片方案。索引可以附加在与其相关联的数据上,或与数据分离存放。一个索引如果出现在对表数据的分片方案中,就可以认为索引已经附加在数据上。另外一个方面,如果索引的分片方案与数据不同,就称为索引与数据分离。这种情况下,索引存放在指定的dbspace上。“数据分片”方式主要有两种:“基于轮转法”和“基于表达式”的方案
轮转法方案
轮转法(PR)所使用的分片规则是系统内部定义的。使用这种方案,新追加的记录被存放在轮转法方式指定的下一个数据分片。记录所插入的第一个数据分片也是随机选定,例如,下列语法用于创建一个名为xyz的表:
CREATETABLExyzFRAGMENTBYROUNDROBIN
INdbspace1,dbspace2......dbspaceN
INFORMIX不支持用轮转法方式创建索引,因为这样会降低系统性能。轮转法方案的优点在于各数据分片上数据量是比较均匀的,对记录进行更新时,并不需要对记录进行转移。然而轮转法有一个缺陷,在进行一个查询时,要扫描所有的数据分片。因此,轮转法方案不支持DATASKIP,不允许INFORMIX动态服务器越过某个数据分片。如果不支持DATASKIP,同时又有一个数据分片出现错误,那么整个查询将会失败,因为不能确定出现故障的数据分片上是否有符合条件的数据记录存在。轮转法方案适用的情况是:用户需要快速加载数据,用户预先不知道数据访问的方式。用户的数据经常更新,或者是用户对于数据分布方式未知。
“基于表达式”的分片方式
对于“基于表达式的分片方案“,用户可以用下面两种规则对数据进行分片”
范围规则
范围规则用SQL的关系或逻辑操作定义表的数据分片的边界。范围规则可以包含关系操作符,比如>,<,>=,<=,还可以包含一些逻辑操作符,比如AND。范围规则最好根据表的某一个字段进行分片,但也可以根据两个或者多个字段进行分片。下面的分片实例运行效率并不很高,因为向表中插入一行时候需要进行太多的运算。所有不符合表达式条件的记录将存放在REMAINDERdbspace中。基于“范围表达式”的分片方案可以确保只对包含目标数据的数据分片进行扫描。
下面是一个采用“基于范围表达式分片方案”创建表的例子:
CREATETABLExyz(aainteger....)
FRAGMENTBYEXPRESSION
aa<=100INdbspace1
aa>1000ANDaa<2000INdbspace2
REMAINDERINdbspace3
绝对规则
“绝对规则”使用了SQL的关系与逻辑操作符。与“范围规则”不同,“绝对规则”运行用户采用关系操作符与逻辑操作符对规则进行定义。此外,表中可以有多个字段参与分片。
例:FRAGMENTBYEXAMPLE
zipcode=94536ORzipcode=94538INdbspace
zipcode=94025ORzipcode=92310INdbspace
REMAIDERINdbspace3
对于以上这种分片方案,必须知道每一个邮政编码所联系的数据个数,以确保每个数据分片上的数据量比较平衡,从而使INFORMIX动态服务器减少扫描的数据分片的数目。指定分片方案时,要确保数据分片之间不互相重叠。此外,定义数据分片时可以不包括REMAINDER分片。
分片的基本原则
“数据分片”的表达式必须尽可能简单,因为执行较复杂的表达式将加重CPU的负荷。同时,数据库中并不是每一个表都需要分片,除非能从“数据分片”中得到显著的收益。“分片”的表达式因为能确保磁盘I/O操作均衡,尽管我们没必要制定一个均衡的数据分片方案。如果大量的查询只对表数据中很小的区域进行访问,那么应该用表达式将那些被频繁访问的数据分片到多个盘上,尽管这样的分片也许数据量并不均衡。表达式应该把限制性最强的部分放在前面。对表达式进行修正是为了减少表达式的计算量,减少每次访问的数据量,从而最终减轻CPU的负荷。如果表达式中第一个不等式的结果为假,那么整个表达式的结果也将为假,因此不必计算表达式的其它部分(AND表达式)。比如说,为了插入数值25,下列表达式需要计算6个不等式:
?x>=1andx<=10indbspace1
?x>10andx<=20indbspace2
?x>20andx<=30indbspace3
如果用如下表达式,则只需要计算4个不等式:
?x<=10andx>=1indbspace1
?x<=20andx>10indbspace2
?x<=30andx>20indbspace3
分片的表达式中应该避免数据类型的转换,
例如,日期数据类型在表达式中内部转换为整数类型。对于频繁更新的字段进行分片,会带来许多管理上附加工作。例如,如果根据一个日期字段进行分片,而超过保存日期的记录被删除,那么包含”超期数据”的数据分片将最终变空。这样就需要删除旧的数据分片,并为最新日期的记录创建一个新的数据分片。
“分片”策略的设计
一个“分片”策略包含数据分布方案以及数据分片所存放的一组dbspace。制定“数据分片”策略时需要根据分片的目标以及数据库的信息,诸如硬件/软件特性、查询特性、数据分布等作出决策。同时还需要知道一个现存的未分片数据库是否做转换,以及是否需要临时创建相应的应用程序。在前面的例子中,已经预知查询的方式,则可以加以利用。我们还应考虑到查询方式在将来的不断变化,诸如数据库的区域和/或帐户的附加部分,这一点也很重要。
“数据分片”的目标包括最大程度的内部查询并行化、外部查询并行化、提高数据可用性、更细的备份/恢复粒度以及更强的数据加载效率。
数据分片获得“内部查询并行化”:是指INFORMIX动态服务器充分发挥“数据分片”与PDQ功能的优势,并行地处理一个复杂的查询。这是决策支持系统(DSS)一类应用程序的主要目标。DSS查询从一个表中顺序读出大量数据记录。我们推荐使用数据分片。选择“轮转法”分片方案还是“基于表达式”的分片方案取决于查询特征、数据分布等因素,一般来说,当用户不能确定根据表中哪一个字段做“基于表达式”的分片,从而保持数据分片的均衡,或者不知道数据访问的方式时,我们推荐采用“轮转法”方式。“轮转法”方式不支持对索引的分片,因为扫描线索要越过分片的边界去读取索引,这样会导致效率的下降。“分片策略”还应该确保数据均衡的分布在不同的数据分片上,确保并行顺序扫描能均衡地完成。
数据分片获得“外部查询的并行化”:是指在大量用户运行较小的查询、返回少量的数据的条件下,INFORMIX动态服务器最大程度提高性能的能力。一般来讲,对于“存在大量用户,需要实时响应的应用程序,称为联机事务处理(OLTP)。OLTP查询总是在同一时间访问数据的一小部分区域,总是随机地对一些数据行进行更新或者删除操作。这些操作总是和”索引扫描”有关。在这种情况下,应该用表达式将数据表和索引表进行分片,从而允许查询在扫描过程过中某些数据分片。如果不考虑I/O竞争,数据分片和索引分片可以在同一个盘上,并使用同样的“分片”策略。另一方面,在一个大系统中如果额外有空余的盘,并且磁盘I/O可能成为潜在的瓶颈,那么最后将索引单独建在一块盘上。调换一下顺序,当按照某一字段创建索引时候,如果每一个查询都根据同一字段访问数据时,我们也可以使用与“数据分片”不相同的策略对索引进行分片。这种情况下,最好在WHERE子句中使用另外一个字段,“分片”策略的理想化程度取决于数据的分布和对表的查询的分布情况。我们的目标通过数据分布消除I/O瓶颈,尽管每个数据分片上的数据量可能不太均匀。
数据分片增强“数据可获得性”:是指可以在某些数据分片发生故障的时候,数据库仍然能接受应用程序的查询请求。这种能力是有INFORMIX动态服务器的DATASKIP特征提供的。
数据分片“增强数据加载的性能”:尤其适用于”周期性地加载几个G的数据,从而需要快速加载技术”的大型应用程序。将数据分片到不同的磁盘上,可以使数据自动地进行并行加载,这是通过使用多个I/O流向数据分片所驻留的磁盘上写数据而达到的。轮转法分片方案应该最能保证快速数据加载,因为复杂表达式的计算会加重CPU的负荷,如果采取较简单的表达式并将每个数据分片放在单独的盘上,用“基于表达式”的分片方案同样可以保证快速加载数据。
以下是“确定合理的分片策略”所必须的步骤
硬件/软件特征
要搞清楚硬件平台,如CPU的速度,数目,磁盘数目,大小,磁盘控制器的数目,以及与每个控制器相连接的磁盘数目,等等。这些信息对于确认表分片的数目以及怎样存放数据分片以减少I/O竞争,都是十分有用的。除了可用的磁盘外,对于每个表的数据分片的数目都有一定的上限,这些限制与分片的目标有关,如果分片的主要目的是增强内部查询的并行程度,那么系统CPU的数目和数据总线的带宽将限制一个表所能得到的并行线索的最大数目。另一个方面,如果分片的主要目标是增强外部查询的并行程度,那么分片的数目可大于CPU的数目,从而保证数据分布在许多磁盘上,在OLTP条件下可以允许用户并发地访问不同的磁盘,然而,当数据分片的容量变小的时候,应用程序会寻找多个数据分片,同时对寻找的结果进行合并。这些都会降低查询的效率。
对于具有高速CPU和低速盘的系统,每个表的分片数目可以超过物理CPU的实际个数。
所选的硬件平台的操作系统类型和编译器对选择“分片”方案也是一个重要的因素。有的操作系统擅长处理MOD操作以及数据类型转换。
了解查询的特征
要了解一个应用程序到底是OLTP还是DSS类型,还要了解SELECT语句查询用的频繁还是update/delete操作频繁。如果查询多用SELECT语句,还要确定带有“groupby”,“orderby”等复杂子句查询的执行频度。对于这些情况的了解有助于平衡I/O,消除瓶颈。检查每个SELECT查询的选择性以及返回数据的比例。如果一个查询的选择性(selectivity)很大,就需要为查询创建索引。检查有无JOIN操作,并确认JOIN操作的主码是什么。如果在DSS查询中总对某一特定的表进行JOIN操作,那么这个表应该被分片到不同的磁盘上以避免I/O瓶颈。检查每个查询的查询条件。最后将所涉及的表中的字段画一个矩阵。接着将某一查询中用做查询条件的字段填上“+”字符。有了这个矩阵,我们可确认在所有的查询中,哪个查询条件最常用。这一信息与每一查询的执行频度一起,有助于确认对哪个字段做“基于表达式的分片”收益最大。检查数据是怎样被访问的,即数据是通过“顺序读取”还是通过“INDEXSCAN“被访问。为每一个查询配备“SETEXPLAIN”子句,加上表的模式信息,可以达到以上目标。
数据分布及特征
确认表中用户查询条件的字段的取值范围。确认表中每一取值范围内符合记录的个数。在许多DSS类应用程序中,结果是从几个GB的数据或几个月,甚至一年的数据中得出来的。在这种条件下,很容易确认某一州,某个城市的记录数,或者是整个月的数据供以后使用。如果大多数查询将某个州和某月作为筛选条件,那么这些字段是参与”基于表达式”的分片方式的最佳选择。此外,还应了解表中数据被修改的速率,诸如增、删、改等。
原文转自:www.ltesting.net
★关爱
文档为doc格式