Book review - SQL Server Secret Diary (Know the unknown secrets of SQL Server)
Like a lot of people within the SQL community, I can never read enough on the subject. Books, whitepapers, academic research and blogs can all be valuable source of information, so whilst browsing Amazon I found this book on a free kindle download. The preface makes some bold claims indeed :
“This book is for developers who already know SQL Server and want to gain more knowledge in SQL Server. This book is not for starter who want to start from the beginning.
The problem-solution approach will help you to understand and solve the real-time problems easily.
This Book will teach you (their emphasis)
- How to solve common real-time problems
- How to improve performance
- How to protect your data and code
- How to reduce your code
- How to use SQL Server efficiently
- Advanced topics with simple examples
- Tips and tricks with sample queries
- And also teach how to do in the better way.
The last bullet point, sets the tone of the quite appalling use of grammar (yes, yes , people in glass houses and all that.. ) contained throughout the entire book, I get that the authors may use english as a second (or third) language, but where are the proof readers ? That i can live with though, its the technical content i really have a problem with. Here is just a small selection:
Q 2) How to use GO statement in SQL Server ?
IMO, the most important concept to understand about GO is that it is not a SQL Statement. It is processed on the client (SSMS, ISQL etc) and splits the workload into separate batches. This is not mentioned here, though to be fair in Q3 (How to repeat the statements without using loops ?) the author notes “GO is a client command and not a T-SQL command". So GO or GO <N> can only be used with Microsoft SQL Server client tools.”.
Q 5) How to use ORDER BY clause in view ?
Here the author spends a great deal of time and effort working around “As per RDBMS rule ORDER BY clause is not allowed in view”. This section should be thrown away entirely, if you are depending on the view ordering ( which is a contradiction in terms) for your result set ordering you deserve all the law suits that are thrown at you.
Q 10) How to do case sensitive searches in SQL Server ?
The authors solution here is to cast a column as varbinary. OK, fair enough it works. Personally, i would have used COLLATE but lets not split hairs. The biggest issue i have here is sargability is not mentioned, we are introducing the possibility of a scan.
Q 12) How to solve server time out problem ?
The scenario presented here is that session #1 has updated some data that session #2 needs to read. The author presents 2 solutions NOLOCK and READPAST and ,to be fair, does make an attempt at highlighting the dirty reads. My issue here is that, once again, locking is seen as the enemy that must be worked around. We should embrace locks, understand why they are happening and how they are protecting us. The point is not raised that the fault here lies with the UPDATE’ing transaction not completing in a timely fashion, not that the reader cannot complete due to that. The consequences of reading and processing dirty data are not explored thoroughly enough and once again, NOLOCK is used as a “go faster” button.
Q 33 ) How to improve the performance of stored procedure ?
Here we have been given 11 bullet points by the authors , which I have copied verbatim below. My thoughts about each point are inlined in red:
- Use SET NOCOUNT ON to avoid sending row count information for every statement. So, this can help, but will only have a measurable effect if you have many many statements, but in that case you are coding sql wrong anyway.
- Always use the owner name or schema name before the object name to prevent recompilation of stored procedure. Does this mean that by not referencing the owner or schema (which one is it ?? ) objects will always cause a recompile of the entire stored procedure ? No. The statement not necessarily the stored procedure, will recompile if the user has a different default schema to the existing compiled statement.
- Avoid using DISTINCT Just distinct ? Any thing else ? Unnecessary ORDER BY ?
- Minimize the number of columns in SELECT clause So, Select Col1,Col2,Col3 is bad but Select Col1 +’ ‘+ Col2 +’ ‘+Col3 is ok ? Better wording here would be “Return only the data that is required by the application, nothing more, nothing less.”
- Use table variables instead temporary tables. Seriously ! What ! Come again. As a sweeping general statement wrong wrong wrong.
- Use the CTE ( Common Table BLOCKED EXPRESSION instead of derived tables and table variables as much as possible. Again, massive over generalisation. Horses for courses. Also, didn't you just say that i should use table variables.
- Avoid using cursors Why ? and what should i do instead ? I have to get the data out some how , what alternatives are there ?
- Don’t use duplicate codes, reuse the code by Views and UDF’s This section is about performance , right ? I would like to see one single instance where using a view ( presumably unindexed ) or a UDF (cough , splutter) improves performance.
- Begin and commit transactions immediately Better wording would be “Keep transactions as short as possible, never leave a transaction open while waiting to user input.”
- Avoid exclusive locks Confusing, in what context ?
- Use table hints BwaaHaa, this is really a pandora’s box best left by the audience of this book.
And so it continues. I’m trying really hard to not be to scathing or nit-picky about this book, there is some good advice here, but SQL Server is full of caveats , confusing and contradictory best practices and ultimately 90% of the time you can state that “It depends”.
Questions are presented with solutions that can work but are given as 100% solutions not with any degree of warning that that may not always be the case. Even as a free download, it is way too expensive, and, remembering the target audience, could ultimately do more harm than good.