Showing posts with label SQL Server. Show all posts
Showing posts with label SQL Server. Show all posts

Wednesday, August 18, 2010

Database object naming standard

สำหรับ Standard ในการตั้งชื่อ Object ในฐานข้อมูล SQL Server 2005 มีดังต่อไปนี้

Use names that comply with the rules for forming SQL Server 2005 identifiers
ใน Microsoft SQL Server 2005 อ้างถึง database name ว่าเป็น identifiers ซึ่ง แบ่งเป็น 2 classes คือ delimited และ regular
Delimited identifiers คือ การครอบด้วย brackets ([]) หรือ double quotation marks (“”) ซึ่งสามารถใช้กับ characters ใดๆ ก็ได้
Regular identifiers มี กฏ ดังนี้
  1. Character แรกต้องเป็น Latin character จาก a ถึง z หรือ จาก A ถึง Z, ตัวอักษรจากภาษาอื่นๆ หรือ underscore (_) character ไม่สามารถใช้ @, # ใน character แรกได้ เนื่องจาก @ หมายถึง local variable ส่วน # และ ## ใช้กับ temporary table
  2. Characters อื่นๆ นอกจาก character แรก สามารถเป็นตัวอักษรใดๆ ก็ได้ เช่น ตัวเลข Latin, @, $, _ แต่ ช่องว่าง (space) และ character พิเศษไม่สามารถใช้ได้
  3. Identifier ต้องไม่ใช่คำสงวน (Reserved word) ของ Transact-SQL
ควรใช้ regular identifiers ในการตั้งชื่อ database objects เพื่อหลีกเลี่ยงที่จะต้องใช้ delimiters ในทุกๆ object name และ เพื่อง่ายในการ code และ อ่าน

Use descriptive terms
การตั้งชื่อ ควรสั้น และ มีความหมาย มีความชัดเจน เช่น ชื่อ table, view หรือ stored procedure ตัวอย่างการตั้งชื่อ table ที่ประกอบด้วย employee information การใช้ชื่อ Employees, Employee หรือ tblEmployee นั้น ดูมีความหมายกว่า TVHREMP (T=Table, V=Vase Project, HR=Human Resources, EMP=Employee) แม้ว่าตัวอักษรจะดูมีรูปแบบ แต่ไม่สามารถให้ความหมายได้ เมื่อใช้ชื่อที่ง่ายและมีความหมาย จะทำให้ users, developers และ database administrators สามารถจดจำได้ว่าเป็น identify ใด

Use only standard abbreviations in names
ในการตั้งชื่อ ควรใช้คำย่อที่รู้จักกันดี และหลีกเลี่ยงการใช้คำย่อที่ไม่เป็นมาตรฐาน ตัวอย่างเช่น Org เป็นคำย่อของ Organization

Name intersection tables consistently
เมื่อมีการสร้างมาตรฐานการตั้งชื่อ จะต้องระบุวิธีการตั้งชื่อ Intersection table ซึ่งเป็น table ที่ใช้สำหรับเป็นตัวแทนความสัมพันธ์ระหว่าง many-to-many โดยทั่วไปแล้วจะใช้วิธีรวมชื่อ entities ที่ refer กันเข้าไว้ด้วยกัน เช่น ความสัมพันธ์ระหว่าง Countries และ Languages อาจใช้คำว่า CountriesLanguages

Be consistent across all objects
เพื่อให้แน่ใจว่าการตั้งชื่อเป็นไปตามมาตรฐาน ทุกๆ Objects ใน database จะต้องมีการตรวจสอบชื่อของ objects โดยกำหนดเป็นส่วนหนึ่งของการทำการควบคุมคุณภาพ (quality-control) ถ้าชื่อไม่ได้เป็นไปตามมาตรฐาน จะต้องอยู่ใน bug list และจะต้องทำการแก้ไขก่อนที่จะเข้าสู่กระบวนการ development

Document and communicate naming standards
ควรกำหนดมาตรฐานในการตั้งชื่อและจัดทำเป็นเอกสารอย่างละเอียด และ ให้สมาชิกในทีมรวมทั้ง stakeholders รับทราบ ซึ่งมาตรฐานในการตั้งชื่อนั้นควรให้ stakeholders ทุกคนทำความเข้าใจอย่างชัดเจน
ในการจัดทำเอกสารนั้น ต้องมี “Quick Reference” กับ มีการอธิบายรายละเอียดของมาตรฐานในการตั้งชื่อและตัวอย่างด้วย อีกทั้งควรมีแทรกการสอนมาตรฐานการตั้งชื่อให้กับสมาชิกใหม่ในขณะที่ทำการฝึกอบรมด้วย

NooM

Wednesday, September 10, 2008

Sybase SQL Tuning

เหนื่อยครับช่วงนี้ แต่ไม่เท่าไหร่ครับ พอมีเวลามาอัพเดตกันเล็กน้อย หลังจากที่หายไปนานเลยครับ
มาตอนนี้ผมขอกล่าวถึง SQL Tuning ครับ ถึงแม้ว่าตัวผมจะผ่านการเขียน SQL Statement มาอย่างโชกโชน แต่ในเรื่องการจูนนิ่งแล้ว ยังต้องศึกษาอีกพอสมควร อันความรู้ที่มีอยู่นั้นก็เพียงพอกับการแก้ปัญหาเท่านั้น แต่หากต้องการความรู้ระดับผู้เชี่ยวชาญแล้วนั้นขอบอกว่า สำหรับผมแล้วยังอีกยาวไกลครับ

คราวนี้ผมขอย้ายไปค่าย Sybase นะครับ เนื่องจากใช้งานอยู่จริง แต่โดยหลักๆ แล้ว Statement คล้ายกับ MS SQL Server มาก น่าจะสามารถใช้หลัการ Tuning ร่วมกันได้

ผมขอแนะนำ link เหล่านี้ครับ บอกเทคนิคการ Tuning SQL ไว้อย่างน่าสนใจเลยทีเดียว คือ
http://www.lcard.ru/~nail/sybase/perf/66.htm
และ pdf ไฟล์เทคนิคการทำ Performance and Tuning ของ Sybase
http://download.sybase.com/pdfdocs/srg1100e/sqlsrvpt.pdf

ขอบอก ขอบอก ของเขาดีจริงเชียวล่ะ

Friday, August 31, 2007

CLR Integration in SQL Server 2005

CLR Integration in SQL Server 2005

The integration of Common Language Runtime (CLR) in .NET application using SQL Server 2005


ขั้นตอนในการสร้าง CLR stored procedure
  • ทำการ Enable CLR integration ใน SQL Server 2005
  • สร้าง CLR stored procedure Assembly โดยใช้ Visual Studio 2005
  • ติดตั้ง Assembly ใน SQL Server 2005
  • สร้างและ execute ตัว CLR stored procedure ใน SQL Server 2005

อ่านต่อ ...

--NooM--

Reindex for MS SQL Server 2005

สำหรับ MS SQL 2005 นั้น ก็จะคล้่ายๆ กับ 2000 ครับ
เพียงเปลี่ยนจาก sysobjects และ sysusers เป็น sys.tables และ sys.schemas
declare @name varchar(128), --ประกาศตัวแปรสำหรับเก็บชื่อ ตาราง
@user varchar(128),
--ประกาศตัวแปรสำหรับเก็บชื่อ เจ้าของตาราง
@statement varchar(1000)


declare tablename cursor for
--ประกาศตัวแปร cursor ข้อมูล
select t.name,
s.name
from sys.tables as t, sys.schemas as s
where t.schema_id = s.schema_id

open tablename
--เปิด cursor

fetch next from tablename --อ่านข้อมูลจาก cursor และให้ข้อมูลเข้าตัวแปร
into @name, @user

while @@fetch_status = 0 -- วนลูป cursor จนกว่าหมดข้อมูล

begin
set @statement = 'DBCC DBREINDEX (''[' + @user + '].[' + @name + ']'')' --สร้าง sql statement เพื่อ re-index ตาราง
print @statement + '...'
execute (@statement) -- สั่งให้ execute sql statement ที่ re-index ตาราง
fetch next from tablename
into @name, @user
end

close tablename -- ปิด cursor
deallocate tablename -- เคลียร์ memory

go

Reindex for MS SQL Server 2000

การ maintenance ฐานข้อมูลเป็นเรื่องที่สำคัญมาก ทุกๆวัน ฐานข้อมูลจะผ่านการ Insert, Update, Delete ข้อมูลต่างๆ มากมาย ซึ่งการ Re-index ก็เป็นส่วนหนึ่งของการ maintenance ระบบให้มีประสิทธิภาพ (performance) ที่ดีอยู่ตลอดเวลา

---------------------------------------------------------
Real case
ตอนเช้าของเกือบทุกวัน ผมจะได้รับสายฯ จาก users มาต่อว่า "ทำไมค้นหาข้อมูลนานมากเลย" "ระบบของคุณขึ้น Error ว่า Timeout Expire อีกแล้ว" "ผม Insert ข้อมูลไม่ได้" คำถามต่างๆเหล่านี้ทำให้ผมต้องทำอะไรสักอย่าง เพราะปกติแล้ว ไม่เคยมีปัญหา users สามารถใช้งานระบบมาได้นานเป็นระยะเวลาหนึ่ง

แล้วผมก็สังเกตุได้ว่า ฐานข้อมูล มันมีขนาดที่ใหญ่โตมากขึ้น การค้นหาแต่ละครั้งนั้นใช้เวลานาน ดังนั้นจำเป็นต้องใช้งาน Index ซึ่งผมก็ได้สร้าง Index เพื่อแก้ไขปัญหาดังกล่าว ซึ่งก็ได้ผลดีครับ การค้นหาทำได้เร็วขึ้นกว่าแต่ก่อน แต่แล้ว 1 สัปดาห์ต่อมา ผมก็กลับได้รับโทรศัพท์เช่นเดิมอีก ... แล้วผมต้องทำเช่นไรอีกละเนี่ย ในเมื่อผมก็สร้าง Index แล้วนิ...
---------------------------------------------------------

เนื่องจาก Index ซึ่งโดยส่วนใหญ่แล้วเป็น non-clustered index จะไม่ถูกจัดเรียงใหม่ทุกครั้งที่มีการ Insert, Update, Delete ข้อมูล ต่างจาก Clustered index ที่โดยส่วนใหญ่เป็น Primary Key (ที่ผมบอกว่าโดยส่วนใหญ่นั้น เพราะ Primary Key ไม่จำเป็นต้องเป็น Clustered index เสมอไป) ที่จะถูกจัดเรียงใหม่ทุกครั้งที่มีการกระทำ Insert, Update, Delete ดังนั้น เมื่อมีการสร้าง หรือ ปรับปรุงข้อมูลในตารางที่มี non-clustered index อยู่บ่อยๆแล้ว ถ้าไม่มีการจัดเรียง index ใหม่บ้างแล้ว ก็อาจทำให้ประสิทธิภาพในการค้นหาทำได้ไม่ดีเท่าที่ควร และยิ่งตารางที่มีข้อมูลเป็นจำนวนมากด้วยแล้ว ก็ยิ่งจะเห็นผลกระทบได้ชัดเจน

ใน SQL Server 2000 มี Sql Statement ที่ใช้เพื่อทำการ re-index คือ
Syntax
DBCC DBREINDEX
( [ 'database.owner.table_name'
[, index_name
[ , fillfactor ]
]
]
) [ WITH NO_INFOMSGS ]เช่น
DBCC DBREINDEX('dbo.Orders')
Go

ผลลัพท์ที่ได้คือ

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

จาก Statement ข้างต้น เป็นการ re-index ตารางที่เราต้องทราบไว้ล่วงหน้าว่ามีตารางชื่ออะไร เราจึงสามารถกำหนดคำสั่งได้ ถ้าฐานข้อมูลของเรามีตารางสัก 10 ตารางก็คงไม่เท่าไร แต่ถ้ามีสัก 100 ตารางล่ะ คงให้มากำหนด DBCC DBREINDEX(...) แต่ละตารางคงไม่ไหว ผมมีวิธีที่จะทำการ re-index ตารางทั้งหมดในฐานข้อมูล โดยใช้ sql statement ด้านล่างนี้

declare @name varchar(128), --ประกาศตัวแปรสำหรับเก็บชื่อ ตาราง
@user varchar(128), --ประกาศตัวแปรสำหรับเก็บชื่อ เจ้าของตาราง
@statement varchar(1000)

declare tablename cursor for
--ประกาศตัวแปร cursor ข้อมูล ตาราง จาก sysobjects
select o.name, u.name
from sysobjects as o, sysusers as u
where o.uid = u.uid
and xtype = 'U'

open tablename
--เปิด cursor

fetch next from tablename --อ่านข้อมูลจาก cursor และให้ข้อมูลเข้าตัวแปร
into @name, @user

while @@fetch_status = 0 -- วนลูป cursor จนกว่าหมดข้อมูล
begin
set @statement = 'DBCC DBREINDEX (''[' + @user + '].[' + @name + ']'')' --สร้าง sql statement เพื่อ re-index ตาราง
print @statement + '...'
execute (@statement) -- สั่งให้ execute sql statement ที่ re-index ตาราง
fetch next from tablename
into @name, @user
end

close tablename -- ปิด cursor
deallocate tablename -- เคลียร์ memory

go

จาก statement ข้างต้่น สามารถนำไปวางไว้ใน job agent เพื่อให้ re-index ตารางในฐานข้อมูลตามเวลาที่ต้องการได้ทันที

Thursday, August 9, 2007

Error 14274

ความเดิมตอนที่แล้ว (การย้าย Database SQL Server 2000) ที่ผมกำลังย้ายเครื่อง SQL Server 2000 จากเดิม ไปยังเครื่องใหม่และชื่อใหม่นั้น เมื่อ restore ฐานข้อมูล msdb ลงบนเครื่องใหม่เสร็จแล้ว พบว่าไม่สามารถทำการ Update หรือ Delete ข้อมูล Jobs ได้ โดยจะขึ้น Error ขณะที่กำลัง save หรือ delete job ว่า

"Error 14274: Cannot add, update, or delete a job (or its steps or schedules) that originated from an MSX server."

มีปัญหาก็ย่อมมีทางออก วิธีแก้ไขคือให้ปรับข้อมูลในตาราง msdb.sysjobs ใน column ชื่อ originating_server จากเดิมเป็นชื่อ Database ใหม่ เพียงเท่านี้ก็สามารถปรับปรุง Job ได้ตามปกติแล้วครับ