Results for sql

Temporary Tables vs. Table Variables in SQL Server

Posted September 23rd, 2009 by eric

When writing T-SQL code, you often need a table in which to store data temporarily when it comes time to execute that code. You have four table options: normal tables, local temporary tables, global temporary tables and table variables. I’ll discuss the differences between using temporary tables in SQL Server versus table variables. Each of the four table options has its own purpose and use, and each has its benefits and issues:

  • Normal tables are exactly that, physical tables defined in your database.
  • Local temporary tables are temporary tables that are available only to the session that created them. These tables are automatically destroyed at the termination of the procedure or session that created them.
  • Global temporary tables are temporary tables that are available to all sessions and all users. They are dropped automatically when the last session using the temporary table has completed. Both local temporary tables and global temporary tables are physical tables created within the tempdb database.
  • Table variables are stored within memory but are laid out like a table. Table variables are partially stored on disk and partially stored in memory. It’s a common misconception that table variables are stored only in memory. Because they are partially stored in memory, the access time for a table variable can be faster than the time it takes to access a temporary table.

Creating indexes on SQL Server tables

Because both local and global temporary tables are physical tables within the tempdb database, indexes can be created on these tables to increase performance as needed. As with any index creation, this process can take time on larger tables. Because temp tables are physical tables, you can also create a primary key on them via the CREATE TABLE command or via the ALTER TABLE command. You can use the ALTER TABLE command to add any defaults, new columns, or constraints that you need to within your code.

Unlike local and global temporary tables, table variables cannot have indexes created on them. The exception is that table variables can a primary key defined upon creation using the DECLARE @variable TABLE command. This will then create a clustered or non-clustered index on the table variable. The CREATE INDEX command does not recognize table variables. Therefore, the only index available to you is the index that accompanies the primary key and is created upon table variable declaration.

How do the internal workings of SQL Server perform differently between table variables and temporary tables?

The differences between accessing tables and variables cause the internal processes within SQL Server to treat the objects quite differently. Temporary tables are actually physical tables, so the SQL Optimizer and locking engine handle the tables just as they would any other database tables. Because reads to a temporary table are made (including local temporary tables), a read lock is placed on the table.

This locking process takes time and CPU resources. When reading from a table variable – because the table variable is stored partially within memory and cannot be accessed by any other user or process on the system – SQL Server knows locking is not required. In a very busy database, this lack of locking can improve system performance because locks do not have to be taken, escalated and checked for each data access operation.

Limits of temporary tables and table variables

Temporary tables and table variables both have their strengths, but they both have weaknesses too. On a heavy load system that has lots of usage of temporary tables, the disk array servicing the tempdb database will experience a higher than expected load. This happens because all reads and writes to the temporary tables are done within the tempdb database. Table variables will perform poorly with large record sets, especially when doing joins because there can be no indexes other than a primary key. Beware, though, when many users start using table variables — large amounts of RAM are used because all temporary tables are stored and processed directly in memory. Table variables should hold no more than 2 Megs to 3 Megs of data each (depending on user load and system memory).

Both temporary tables and table variables can be extremely useful tools in developers’ and administrators’ arsenals; however, care must be taken as to when to use each solution. There is no end-all solution, and you must choose the correct solution for the correct situation.

Local Temporary tables:

They are created using same syntax as CREATE TABLE except table name is preceded by ‘#’ sign. When table is preceded by single ‘#’ sign, it is defined as local temporary table and its scope is limited to session in which it is created.

Open one session in Query Analyzer or SSMS (Management Studio) and create a temporary table as shown below.

CREATE TABLE #TEMP
(
COL1 INT,
COL2 VARCHAR(30),
COL3 DATETIME DEFAULT GETDATE()
)

GO

Upon successful execution of above command, MS SQL Server creates table in tempdb database. One cannot create another temporary table with the same name in the same session. It will give an error but table with the same name can be created from another session. To do this, open another session from SSMS or query analyzer and issue same command again. It will successfully create new temporary table for that session.

In order to identify which table is created by which user (in case of same temporary table name), SQL Server suffixes it with the number. This is very common scenario when temporary table is defined in the stored procedure and procedure is getting executed by different users simultaneously. Since we have created temporary table with the same name from two different sessions, we should see two entries in tempdb database. From another session or any of the current session, issue following command. Output is displayed after select statement.

USE TEMPDB
GO
SELECT Table_Catalog, Table_Name FROM information_schema.tables
WHERE table_name like ‘%TEMP%’
GO

Table_Catalog Table_Name
————- ———-
tempdb #TEMP________0000000001F7
tempdb #TEMP________0000000001F9

Now create some data from the session in which temporary table (#temp) is created.

INSERT INTO #TEMP(COL1, COL2) VALUES(1,’Decipher’);
INSERT INTO #TEMP(COL1, COL2) VALUES(2,’Information’);
INSERT INTO #TEMP(COL1, COL2) VALUES(3,’systems’);

Selecting data from temporary table will give following results.

COL1 COL2 COL3
———– —————————— ———————–
1 Decipher 2007-03-27 19:39:56.727
2 Information 2007-03-27 19:39:56.727
3 systems 2007-03-27 19:39:56.727

This data is not visible from another session since we are using local temporary table. We can verify it by connecting to another session and querying the #temp table. Local temporary tables are dropped when session which created the table is ended, if one has not dropped it explicitly.

Also, please do note that if you are creating temp tables in a stored procedure, the scope for the existence of those temporary tables is only the procedure execution. The temp tables automatically get dropped once the procedure execution is over (they can be explicitly dropped as well). Once the procedure execution is over, those temp tables will not be accessible from within that session. Example:

create proc test
as
begin
set nocount on
create table #temp (col1 int)
insert into #temp values (1)
end
go

exec test
select * from #temp

Msg 208, Level 16, State 0, Line 2
Invalid object name ‘#temp’.

Global Temporary tables:

Syntax difference between global and local temporary table is of an extra ‘#’ sign. Global temporary tables are preceded with two ‘#’ (##) sign. Following is the definition. In contrast of local temporary tables, global temporary tables are visible across entire instance.

CREATE TABLE ##TEMP_GLOBAL
(
COL1 INT,
COL2 VARCHAR(30),
COL3 DATETIME DEFAULT GETDATE()
)
GO

Execute above statement to create global temporary table. You can verify it by checking the tempdb database. As global temporary tables are available across the instance, SQL Server doesn’t suffix it with the number. Following is the output of query ran against tempdb.

USE TEMPDB
GO
SELECT Table_Catalog, Table_Name FROM information_schema.tables
WHERE table_name like ‘##TEMP%’
GO

Table_Catalog Table_Name
————- ———-
tempdb ##TEMP_GLOBAL

There will be only single instance of global temporary table. Attempt of creating global temporary table with the same name from any other session will result into an error.

Create some data in one of the session where temporary table (##temp_global) is created.

INSERT INTO ##TEMP_GLOBAL(COL1, COL2) VALUES(1,’Decipher’);
INSERT INTO ##TEMP_GLOBAL(COL1, COL2) VALUES(2,’Information’);
INSERT INTO ##TEMP_GLOBAL(COL1, COL2) VALUES(3,’systems’);

Connect to other existing session or open new session. Execute following statement and you will notice that global temporary table is available along with the data from other session as well.

COL1 COL2 COL3
———– —————————— ———————–
1 Decipher 2007-03-28 09:52:34.310
2 Information 2007-03-28 09:52:34.310
3 systems 2007-03-28 09:52:34.310

Global temporary tables are dropped when last session accessing the tables is closed. It is always good practice to drop the temporary tables in the same scope, once we are done with it. This will help us in avoiding creation error when same connection from the connection pool is used by different processes which access temporary tables.

Global temporary tables can be used in data warehousing application where one session performs the ETL and populate the global temporary tables and other sessions read from the table, specific data and process it.

Features of Temp Tables

We’ll list out features that differentiate a Temp Table between either a Permanent Table or a Table variable. These pointers will be helpful to keep in mind when you consider Table Variables in our next post.

Scope: Within a connection, a temporary table object is visible to the creating level and inner levels (nested). For example, if you create a stored procedure and declare a temporary table object within it, you can call another stored procedure from that stored procedure (a nested stored procedure) and perform operations like inserting, updating and deleting that temporary table object. Once the main creating level terminates, the temp table is automatically destroyed. But don’t be too complacent – you’ll have to wait for the system to perform a clean up and therefore, it is highly recommended that you manually drop your temporary table.

Locking: The prospect of table locking is reduced when it comes to local temporary tables since this table is being used by only one user. One aspect where you might want to keep this in mind is that if you cancel a transaction which contains the creation of a temp table object and then cancel that query, an exclusive and update lock can appear on the tempdb. This lock will persist till the complete transaction has closed with a COMMIT or a ROLLBACK

Logging: There is less logging involved with temporary tables compared to permanent tables.

Transaction: When using a temporary table, a temporary table is an integral part of an outer transaction and therefore, ROLLBACKs must be supported by Logging

Indexing: We can create indexes on temporary tables explicitly on them. Hence, there is scope for performance enhancement when you talk about temp tables.

Constraints: All constraints are available for exploiting on a temp table EXCEPT when it comes to referring a Foreign Key Constraints

Statistics: SQL Server can create Statistics for temp tables just like we do for permanent tables and therefore, the query optimizer has the option of choosing different plans. Hence, with this in mind, be aware of the scope of Stored Procedure Recompiles.

Recompiles: There is scope for a large number of Stored Procedure Recompiles especially when you have DDL statements mixed anywhere within your Stored Procedure.

Temp Table Size: Can hold any volume of data. This will be a strong part of the deciding factor when you want to choose between a temporary table and a table variable.

Features of Table Variables

Now that you’ve got a hang around working with a Table Variable, let me mention the main pointers that we need to keep in mind while working with. This will set the stage for differentiating between a Temp Table and Table Variable which I’ll illustrate in my next post.

Transactions: Table Variables are not bound to any transaction as they are just like any other variable

Minimum Constraints: A Table Variable permits us to use only the PRIMARY KEY, UNIQUE KEY and NULL constraint only. What this implies behind the scenes is that we can have unique indexes. The only possibility of creating a non-unique index is if we add attributes and make that blend unique and have a PRIMARY KEY or a UNIQUE KEY on the combination we just made.

No SELECT INTO: We cannot use a SELECT INTO with Table Variables in SQL Server 2000 though the feature is available with Table Variables in SQL Server 2005. Likewise, we can also have INSERT INTO working with Table Variables against a SELECT but not against an EXEC Stored Procedure.

No ALTER TABLE Variable: We cannot ALTER a Table once it has been declared. This may look a little rigid but remember that recompilations can come out like wild fire when there are DDL (Data Definition Language .i.e Schema) changes and therefore, this helps to avoid recompilations.

Scope: Just like any other variable, a Table Variable’s scope exists only within the context of the current level. Therefore, unlike Temp Tables, it is not accessible to sub levels (of Stored Procedures)

Table Variables And The TempDb: Okay, now I’ll touch upon one of the most common myths that exist among developers: that Table Variables have nothing to do with TempDb and therefore, they have no physical representation in the TempDb and therefore, they reside in ONLY memory and therefore they’re the best option for efficient processing.

Not entirely true. Table Variables do indeed have a physical representation within the TempDb and this can proved with a simple query in your database against the TempDb:

No Statistics: When it comes to Table Variables, the SQL Server optimizer does not create distribution statistics. Therefore, you run the risk of referring not-so-good query plans when the SQL Server optimizer selects after checking up with histograms. And if you consider this aspect with Tables Variables that contain huge amounts of data, we fall into serious I/O thrashing. Hence, as stated in the closing section of the last point, we have to have a thorough understanding of our scenario to choose a temporary object for the context.

A possible replacement for temp tables is a table variable.

In summary, following are the key points when temporary tables are involved.

  • Temporary tables can be defined as local or global temporary tables.
  • Local temporary tables are available to session in which they are created. If another  session creates the table with the same name, it will be different copy of the table in tempdb database.
  • Global temporary tables are available across the instance. Any user from any session can access it.
  • It is best practice to drop the temporary table when related work is finished rather than relying on connection to end for the cleanup.
  • Table variables can be used instead of temporary tables for performance reasons and when dealing with smaller sub-sets.
  • When used in the procedure,function or trigger, its scope ends once execution is completed.

Limitations of Temporary Tables

Temporary tables are created in the tempdb database and create additional overhead for SQL Server, reducing overall performances. SQL Server has numerous problems with operations against temporary tables.

Using Temporary Tables Effectively

If you do not have any option other than to use temporary tables, use them affectively. There are few steps to be taken.

  • Only include the necessary columns and rows rather than using all the columns and all the data which will not make sense of using temporary tables. Always filter your data into the temporary tables.
  • When creating temporary tables, do not use SELECT INTO statements, Instead of SELECT INTO statements, create the table using DDL statement and use INSERT INTO to populate the temporary table.
  • Use indexes on temporary tables. Earlier days, I always forget to use a index on temporary. Specially, for large temporary tables consider using clustered and non-clustered indexes on temporary tables.
  • After you finish the using your temporary table, delete them. This will free the tempdb resources. Yes, I agree that temporary tables are deleted when connection is ended. but do not wait until such time.
  • When creating a temporary table do not create them with a transaction. If you create it with a transaction, it will lock some system tables (syscolumns, sysindexes, syscomments). This will prevent others from executing the same query.

Conclusion

Generally, temporary tables should be avoided as much as possible. If you need to use them follow the steps above so that you have the minimum impact on server performance

If you have to use a temp table, do not create it from within a transaction. If you do, then it will lock some system tables (syscolumns, sysindexes, and syscomments) and prevent others from executing the same query, greatly hurting concurrency and performance. In effect, this turns your application into a single-user application.

To avoid this problem, create the temporary table before the transaction. This way, the system tables are not locked and multiple users will have the ability to run this same query at the same time, helping concurrency and performance.

Source: http://dev.digi-corp.com/2009/05/temporary-tables-vs-table-variables-in-sql-server/

SQL Reporting Service System Tips with links

Posted October 28th, 2008 by eric

Here I collect some useful article links. I used SRSS 2005 for a while. This seems a very powerful tool. It maybe useful to distribute our reports more efficiently and neat.

Blog Site:

Prologika: http://prologika.com/CS/blogs/blog/default.aspx

Bob’s SQL Reporting Services blog: http://blogs.msdn.com/bobmeyers/default.aspx

SQL Server reporting services team blog: http://blogs.msdn.com/sqlrsteamblog/

Chris Hay’s Blog: http://blogs.msdn.com/chrishays/default.aspx

Robert Bruckner’s Blog: http://blogs.msdn.com/robertbruckner/default.aspx

Tips:

RSS Rules: http://www.ssw.com.au/Ssw/Standards/Rules/RulesToBetterSQLReportingServices.aspx

SQL Server Reporting Services - Optional Parameters: http://bloggingabout.net/blogs/egiardina/archive/2007/06/26/sql-server-reporting-services-optional-parameters.aspx

Report Design Tips and Tricks: http://msdn.microsoft.com/en-us/library/bb395166.aspx

Writing Custom Code in SQL Server Reporting Services: http://blogs.sqlxml.org/bryantlikes/pages/824.aspx

Integrating .NET Code and SQL Server Reporting Services: http://www.code-magazine.com/articleprint.aspx?quickid=0701061&printmode=true

Integrating .NET Code and SQL Server Reporting Services: http://www.devx.com/codemag/Article/33656/1954

Get More Out of SQL Server Reporting Services Charts: http://msdn.microsoft.com/en-us/library/aa964128(SQL.90).aspx

Report Builder: Creating a Report Model: http://www.databasejournal.com/features/mssql/article.php/3598931

Advanced Matrix Reporting Techniques: http://www.devx.com/dbzone/Article/37703/0/page/1

Advanced Ranking and Grouping with SQL Server Reporting Services: http://www.devx.com/dbzone/Article/37799

MSSQL Server Reporting Services Series of Tutorials:

Tutorial 1: A New Paradigm for Enterprise Reporting
Tutorial 2: The Authoring Phase: Overview Part I
Tutorial 3: The Authoring Phase: Overview Part II
Tutorial 4: Managing Reporting Services: Data Connections and Uploads
Tutorial 5: Managing Reporting Services: Report Execution and Standard Subscriptions
Tutorial 6: Managing Reporting Services: Data-driven Subscriptions, and External Data Sources for Subscriber Data
Tutorial 7: Mastering OLAP Reporting: Cascading Prompts
Tutorial 8: Master Chart Reports: Pie Charts in Reporting Services
Tutorial 9: Master Chart Reports: Track Exchange Rates in a Line Chart
Tutorial 10: Reporting Services Basics: Create a Reusable Template Report
Tutorial 11: Black Belt Components: Manage Nulls in OLAP Reports
Tutorial 12: Black Belt Components: Ad Hoc Conditional Formatting for OLAP Reports
Tutorial 13: Black Belt Administration: Prepare the Execution Log for Reporting
Tutorial 14: Black Belt Administration: Execution Log Performance and Audit Reports
Tutorial 15: Black Belt Administration: “Governor” Capabilities: Report Execution Timeout
Tutorial 16: Black Belt Components: Ad Hoc Sorting with Parameters
Tutorial 17: Mastering OLAP Reporting: Ad Hoc TopCount and BottomCount Parameters
Tutorial 18: Mastering OLAP Reporting: Percent of Total - Two Perspectives
Tutorial 19: Mastering OLAP Reporting: Percent of Total - Chart Presentation Nuances
Tutorial 20: Mastering OLAP Reporting: Extending Conditional Formatting: SWITCH and Drilldown Defaults
Tutorial 21: Mastering OLAP Reporting: Relationally-Based Picklists for OLAP Reporting
Tutorial 22: Mastering OLAP Reporting: Drilling Through Using MDX
Tutorial 23: Mastering OLAP Reporting: Multiple Value Selection in a Parameter Picklist
Tutorial 24: Interactive Sorting Within Reporting Services
Tutorial 25: Mastering OLAP Reporting: Display a Dataset Field in a Report Page Header
Tutorial 26: Mastering OLAP Reporting: Meet Business Needs with Matrix Dynamics, Part 1
Tutorial 27: Mastering OLAP Reporting: Meet Business Needs with Matrix Dynamics, Part II
Tutorial 28: Report Builder: Creating a Report Model
Tutorial 29: Mastering OLAP Reporting: Reporting with Analysis Services KPIs
Tutorial 30: BlackBelt Administration: Linked Reports in Report Manager
Tutorial 31: BlackBelt Administration: Linked Reports in SQL Server Management Studio
Tutorial 32: Mastering OLAP Reporting: Prototype KPIs in Reporting Services
Tutorial 33: BlackBelt Authoring: Conditional Drillthrough to Multiple Reports
Tutorial 34: Black Belt Components: Interactive Sorts within a Matrix Data Region
Tutorial 35: Mastering OLAP Reports: Parameters for Analysis Services Reporting, Pt. I
Tutorial 36: Black Belt Components: Support Simple Navigation with a Document Map
Tutorial 37: Mastering OLAP Reports: Parameters for Analysis Services Reporting, Pt. II
Tutorial 38: Mastering OLAP Reports: Extend Reporting Services with Custom Code
Tutorial 39: Black Belt Administration: Performance Dashboard for Microsoft SQL Server, Part I
Tutorial 40: Black Belt Administration: Performance Dashboard for Microsoft SQL Server, Part II
Tutorial 41: Intelligent Layering: Leverage Conditional Formatting Logic from Analysis Services
Tutorial 42: Black Belt Administration: Reporting Services Configuration Manager
Tutorial 43: Black Belt Administration: Caching Options: Report Session Caching
Tutorial 44: Black Belt Administration: Report Execution Caching I: SQL Server Management Studio Perspective
Tutorial 45: Report Execution Caching II: Report Manager Perspective
Tutorial 46: Snapshot Reports I: Report Manager Perspective
Tutorial 47: Snapshot Reports II: SQL Server Management Studio Perspective
Tutorial 48: Reporting Services: Customize Automatically Created Parameter Support Objects
Tutorial 49: Parameter Support Objects, Pt II: Support OLAP Parameter Defaults with Datasets
Tutorial 50: Support Parameterization from Analysis Services
Tutorial 51: Parameterization from Analysis Services – Cascading Picklists
Tutorial 52: Support Parameterization from Analysis Services – Parameter Defaults
Tutorial 53: Mastering OLAP Reports: Parameterizing Number of “Look Back” Periods with the MDX LastPeriods() Function, Part I
Tutorial 54: Mastering OLAP Reports: Parameterizing Number of “Look Back” Periods with the MDX LastPeriods() Function, Part II
Tutorial 55: Mastering OLAP Reports: Parameterizing Number of “Top” Items with the MDX TopCount() Function, Part I
Tutorial 56: Mastering OLAP Reports: Parameterizing Number of “Top” Items with the MDX TopCount() Function, Part II
Tutorial 57: Mastering OLAP Reports: Parameterized Grouping

Forum:

Microsoft MSDN RSS Forum: http://forums.microsoft.com/msdn/ShowForum.aspx?siteid=1&ForumID=82

Database Journal RSS Forum: Other:

http://www.15seconds.com/issue/041110.htm

SQL fast tip

Posted October 21st, 2008 by eric

1. Get total rows of table:
SELECT count(*) FROM <table_name>

2. Get total rows having field value null:
SELECT count(*) FROM <table_name> where <field_name> is null

3. Get column names of table:
SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.Columns where TABLE_NAME = <table_name>

4. Get all rows of table:
SELECT * from <table_name>

5. Delete all rows of table (USE WITH CAUTION):
delete from <table_name>

6. Delete table (USE WITH CAUTION):
drop table <table_name>

7. Get reasons of job failure of SQL Agent jobs:
select * from MSDB.dbo.sysjobhistory

8. to search all tables to find a column or field name in a database

SELECT table_name=sysobjects.name,
column_name=syscolumns.name,
datatype=systypes.name,
length=syscolumns.length
FROM sysobjects
JOIN syscolumns ON sysobjects.id = syscolumns.id
JOIN systypes ON syscolumns.xtype=systypes.xtype
WHERE syscolumns.name=’YourColumnName”